如何有效處理特徵範圍差異大且類型不一的數據?

1. 特徵類型混雜: 連續變數,離散變數,描述變數共存

2. 不同變數之間取值差異大: 例如有些變數取值在0~1但有些取值為10000-50000

------------------------------------------------

以KDD99網路入侵數據集為例:

KDD Cup 1999 Data

總共41個特徵,其中3個categorical,5個binary,剩下33個均為連續型特徵。

下圖為訓練集downsample了5W條數據後針對連續型特徵的統計:

可見,不同特徵的取值範圍差異極大,特徵本身分布也是很散(似乎有點長尾)。

面對這樣混合的特徵類型,而且特徵取值範圍差異極大的情況,如何進行有效而reasonable的特徵選擇?


這個問題是典型的特徵工程(Feature Engineering)的範疇,這個領域的奇淫巧技實在太多,只能粗略的說一下對這種數據類型的基本處理流程。我反對直接進行簡單粗暴的歸一化或標準化,往往其風險大於收益。

首先我們假設,做數據處理的前提是我們不知道什麼分類模型效果最好,且大部分分類器無法直接處理「描述變數」(categorical variable)。當然,我們知道以決策樹為原型的模型可以處理不同的數據類型,且對於變數取值範圍比較不敏感,還自帶特徵選擇(如計算節點分裂的基尼指數)。因此很多時候在進行複雜操作前,不妨先使用隨機森林(Random Forest)或其他集成學習的樹模型暴力做一下。有類似良好的特性(能自動選擇有效特徵)的分類器還包括:

  • 特定種類的深度網路。
  • L1範數正則化後的線性模型等。

從本質上看,上面提到的這幾種做法其實就是嵌入式特徵選擇(Embedding Feature Selection),屬於偷懶的一站式操作:) 而這個答案的重心在於將數據處理成可被一般分類器所使用的形態,因為在很多情況下我們無法使用這種偷懶的做法。

回答的結構如下:

  1. 移除不必要的數據,降低變數的維度。
  2. 對描述變數進行轉化,使其適用於大部分的分類器。
  3. 分析數據之間的相關性,如共線性。如果有必要,進行特徵選擇。
  4. 歸一化和標準化。
  5. * 懶人選項:選用適當的(對高方差數據魯棒性好)的分類模型。

上面這個順序的邏輯是1. 初步降低數據維度 2. 再將描述變數轉化為其他演算法可以分析的格式 3.分析是否需要特徵選擇 4. 進行歸一化和標準化。一般而言,我們可能會根據情況選擇其中的一部分處理方法,比較靈活。

如果1-4對你來說太複雜,不妨先試試捷徑方法5。

既然答主提到這個99年KDD的數據,那麼我就以這個數據集為例來回答。

-----------------------------------------------------------------------------------------------

1. 移除不必要的變數,降低數據維度

在進行各種維度變換和複雜的處理前,一般我們希望去掉無用和低貢獻度的變數,這會大大降低後續的處理難度。

1.1. 移除單一取值變數(unique value variable)

單一值變數:整個數據中該值取值恆定,因此對於模型無貢獻。

如下圖所示,在除了預測值(Target)以外的41個值中,有兩個變數 num_outbound_cmds和is_host_login在整個數據集中取值唯一,應該被移除。於是我們成功的去掉了兩個無用變數,此時也就不用思考這兩個變數對於整體取值範圍的影響。

1.2. 移除低方差(low variance)的變數

和單一取值的變數相似,低方差的變數雖然取值不唯一,但整體的變化很小。我們可以通過人為設定閾值(threshold)來去除這種變數。以一個變數只有兩個取值為例,我們可以設定閾值來去掉低方差的變數。

如上圖所示,此處所調用的Sklearn的API還有一個作用就是自動移除單一取值的數據,一舉兩得。

更多資料請移步Sklearn官方文檔: 1.13. Feature selection

2. 轉化描述變數(convert categorical var to numeric)

如上文描述的,我們在不假設分類器的前提下,必須對描述變數轉化為數字類型變數,因為大部分演算法無法直接處理描述變數。

描述變數一般分兩種,其轉換方法不同:

  1. 有序變數。比如小學,初中,高中,大學。又比如非常滿意,滿意,不滿意,極不滿意。這類變數中的可取值之間都有一種順序關係,因此不能單純的用獨熱編碼(One-hot Encoding)來轉化,因為在轉化過程中會失去順序信息。在這種情況下可以由 frac{i-1/2}{N}, i = 1,...N 來轉換, N代表該變數可取的值得總數。此處也要注意,不是每種順序對每個問題都是有意義的。比如假設一個變數可以取三個值:「頭等艙」,「商務艙」,「經濟艙」,對於票價而言是有順序的,但對於到達時間,這三者是無序的。
  2. 無序變數。比如一個公司有三個部門: 研發,測試,HR。
  • 在分類問題中我們可以簡單的使用獨熱編碼進行轉化。
  • 若在聚類問題中,我們一般希望度量其差異性,比較常見的是Value Difference Metrics (VDM)這一類。說白了就是直接看兩個點的這個維度是否相同,若有N個無序變數,我們一般構建一個 N*N 的矩陣來描述差異度(Degree of Difference)。

3. 變數相關性分析及特徵選擇

在進行建模前,可以快速的查看變數之間的相關性,這對下一步的是否進行特徵選擇有比較重要的意義。我們假設在這一步的時候,已經去除了多餘變數且所有描述變數都轉化為了數字型變數

3.1. 相關性圖譜(correlation matrix)

計算變數之間的相關性可以得到一個矩陣,用於描述每兩個變數這件的相關性(-1代表負相關,0代表無關,1代表正相關)。在可視化後KDD99數據的相關性圖譜後可得到下圖。

做相關性圖譜的原因是為了看一下是否存在大量的共線性(colinearity)。 最極端的特例就是雖然特徵很多,但事實上之間互相關聯性很強,存在強線性關係,對於模型幫助不大。

以KDD的數據為例,我們可以看出變數間存在一些共線性,但並不算是極端嚴重。這告訴我們可以兩個可以嘗試的方法來處理這些變數:

  • 特徵選擇(feature selection)
  • 維度壓縮(dimensionality reduction), 例如主成分分析(PCA)

如果我們足夠幸運,看到了零共線性(現實情況是不會發生的)或者低共線性,我們大可以暫時跳過特徵選擇。當然,略過特徵選擇的風險是某個變數可能和我們要去預測的事情完全無關。

3.2. 特徵選擇

特徵選擇是一個很大的話題,簡單說就是從多個變數中選擇出一部分對於分類比較重要的特徵,拋棄冗餘變數(redundant variables)。

統計學習中一般用子集搜索(subset),包括全搜索(exhaustive search),貪心演算法類搜索(正向搜索,逆向搜索,和從兩邊同時搜索)。

機器學習中一般有三種特徵選擇:

  1. 過濾式(filter): 其實我們剛才查看相關性圖譜就是一種過濾式搜索的思路。在這種方法中,我們僅通過評價不同變數之間的統計相關性來進行特徵選擇,如Chi Squared和Pearson。
  2. 包裹式(wrapper): 和過濾式不同,包裹式特徵選擇引入了分類器,通過評估不同的變數在相同分類器下的表現來選擇最優的變數。注意,選擇出的"最優變數"可能僅僅在當前分類器下表現好,後續使用其他分類器效果很難保證。
  3. 嵌入式(embedding): 思路是建立分類器的同時選擇有效的變數,文章開頭處提到的L1正則化和很多決策樹模型都有這個特質。

3.3. 降維: 主成分分析(PCA)和流形學習(manifold learning)

以本題中的KDD數據為例,或許降維是一個比特徵選擇更加划算的做法。主成分分析即將高維數據投射到一個低維空間中來壓縮和合併。

在非線性降維領域,流形學習(manifold learning)現在正大行其道,有興趣的朋友可以關注一下。

此處必須提醒大家PCA和大部分流形學習都要求數據的歸一化,我們稍後會簡單介紹

4. 歸一化(Normalization)和標準化(Standardization)

歸一化和標準化是兩種常見的數據轉換方法,但這兩種方法有一定的風險,我並不推薦一上來就先進行歸一化或者標準化。這類數據轉化方法存在的意義有很多,比較常見的應用是統距離度量(distance estimation)時的範圍。簡單來說,以KNN為例,我們計算兩個數據點的相似度為其幾何距離,那麼如果不同變數的可取值區間不同甚至相差巨大,那麼可能會有部分變數有過大的影響力。

歸一化和標準化的目標都是將元數據投射到一個規範區間中,如 [0,1] 。給出一個最簡單的標準化例子,假設原數據 [1,2,3,4,5] 通過一種最簡單的轉化  x_{n}=frac{x-Min} { Max-Min}[0,0.25,0.5,0.75,1]由此可見我們可以人為的控制數據的投射範圍,但不可避免的數據中的一部分信息可能會遺失。

相關的演算法還有很多且資料很多,不在此贅述,如主成分分析中使用的z-score規範化: x_{new} = frac{x-hat{x}}{sigma_x}

5. 什麼模型對於高方差且變數類型複合比較友善?

像我在答案開頭提到的,比較穩定的是以決策樹為基學習器的集成學習:

  • 在分類問題中,不妨先試試隨機森林(Random Forests)。
  • 回歸問題中可以試試 Gradient Boosted Tree Regression。

這一類模型都可以很好的做到降低高方差、處理非線性關係、選擇有效特徵。對於KDD99的比賽,如果那個時候已經有了隨機森林(2001年的論文)的話,可能冠軍會是 Breiman吧:)

祝大家煉丹愉快 (?????)

-----------------------------------------------------------------------------------------------

安利一下自己的專欄文章:

1. 帶你了解機器學習(一): 機器學習中的「哲學」

2. 帶你了解機器學習(二): 機器學習中的amp;amp;quot;穩定性amp;amp;quot;

3. 帶你讀機器學習經典(一): An Introduction to Statistical Learning (Chapter 1amp;amp;amp;2)

4. 帶你讀機器學習經典(二): An Introduction to Statistical Learning (Chapter 3.1 線性回歸)


謝邀。

用tree based models~


categorical的特徵用one-hot編碼。

連續型的特徵,如果都是正的,且分布偏向較小的值,可以考慮取對數。

如果各個特徵的取值範圍差別很大,而你的模型對取值範圍的差別又比較敏感,可以考慮歸一化。


這是有套路的。

我來講講特徵選擇三板斧是個啥,以sklearn的API為例:假設你數據都處理成數值型了

一板斧:VarianceThreshold,去掉方差小的特徵;

二板斧: SelectKBest,去掉與target相關性低的特徵;

三板斧:

– SelectFromModel:對於有coef_(L1正則化的模型)或feature_importances_(樹基模型)屬性的模型,可以用這倆屬性看;

– RFECV:對於沒有上述屬性的模型,就通過遞歸特徵縮減的方式找到最佳數量的特徵。

上述過程看起來挺簡單的,但是為何特徵工程要稱為工程呢?有倆原因:

1. 特徵選擇是反覆迭代、不停修正的,工作量相當大。原因不在於編碼多難,而在於人的認知過程就是螺旋漸進的;

2. 特徵選擇沒有系統的方法論。

又暴露了我是個調包俠的事實了(逃


拿到數據後首先我們需要歸一化和離散化,歸一化是為了數據處理的方便,保正程序運行時收斂加快。特徵離散化以後,對異常數據有很強的魯棒性,降低了模型過擬合的風險。

歸一化和離散化後我們得到了清洗後的特徵數據,然後我們用相關係數、卡方檢驗、信息增益等方式來做初步特徵選擇。或者直接採用隨機森林模型,隨機森林模型可以處理很高維度的數據,並且不用做特徵選擇,隨機森林得到的特徵可以作為特徵選擇的特徵再用其他模型來處理。


這種情況其實算比較常見的

提供如下的過濾式的思路:

1、 用weka里現有的特徵選擇模塊可以實現

包括用relief、信息增益等進行排序,以及CFS直接選擇特徵子集

2、 用粗糙集實現,可以參考這篇論文

Qinghua Hu, Daren Yu, Jinfu Liu, Congxin Wu. Neighborhood rough set based heterogeneous feature subset selection. Information Sciences. 178(2008) 3577-3594.


推薦閱讀:

能否使用3的指數來減小二進位文件存儲的體積?
應該怎樣理解bootstrap的結果可以通過λ=1的泊松過程來模擬?
為什麼有些公司在機器學習業務方面傾向使用 R + Hadoop 方案?
「千年級別的人體經驗數據」到底有多大?
如何理解 95% 置信區間?

TAG:人工智慧 | 數據挖掘 | 統計學 | 數據分析 | 機器學習 |