當前位置:
首頁 > 最新 > 如何有效處理特徵範圍差異大且類型不一的數據?

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

本文原作者阿薩姆,本文整理自作者在知乎《如何有效處理特徵範圍差異大且類型不一的數據?》問題下的回答。AI 研習社已獲得轉載授權。

原題目如下:

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

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

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

KDD Cup 1999 Data(http://t.cn/RlSWpLF)

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

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

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

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

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

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

特定種類的深度網路。

L1 範數正則化後的線性模型等。

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

回答的結構如下:

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

對描述變數進行轉化,使其適用於大部分的分類器。

分析數據之間的相關性,如共線性。如果有必要,進行特徵選擇。

歸一化和標準化。

* 懶人選項:選用適當的 (對高方差數據魯棒性好) 的分類模型。

上面這個順序的邏輯是 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(http://t.cn/RIJnmkr)

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

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

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

1. 有序變數。比如小學,初中,高中,大學。又比如非常滿意,滿意,不滿意,極不滿意。這類變數中的可取值之間都有一種順序關係,因此不能單純的用獨熱編碼 (One-hot Encoding) 來轉化,因為在轉化過程中會失去順序信息。在這種情況下可以由

來轉換, 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),貪心演算法類搜索 (正向搜索,逆向搜索,和從兩邊同時搜索)。

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

過濾式 (filter): 其實我們剛才查看相關性圖譜就是一種過濾式搜索的思路。在這種方法中,我們僅通過評價不同變數之間的統計相關性來進行特徵選擇,如 Chi Squared 和 Pearson。

包裹式 (wrapper): 和過濾式不同,包裹式特徵選擇引入了分類器,通過評估不同的變數在相同分類器下的表現來選擇最優的變數。注意,選擇出的 "最優變數" 可能僅僅在當前分類器下表現好,後續使用其他分類器效果很難保證。

嵌入式 (embedding): 思路是建立分類器的同時選擇有效的變數,文章開頭處提到的 L1 正則化和很多決策樹模型都有這個特質。

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

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

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

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

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

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

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

相關的演算法還有很多且資料很多,不在此贅述,如主成分分析中使用的 z-score 規範化:

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

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

在分類問題中,不妨先試試隨機森林 (Random Forests)。

回歸問題中可以試試 Gradient Boosted Tree Regression。

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

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

新人福利

關注 AI 研習社(okweiwu),回復1領取

【超過 1000G 神經網路 / AI / 大數據,教程,論文】

手把手教你用 Python 實現針對時間序列預測的特徵選擇

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

伯克利客座教授:AlphaGo Zero and Deep Learning
神經網路有什麼理論支持?
神經網路中容易被忽視的基礎知識
用於文檔理解的面向對象神經規劃
緊跟未來深度學習框架需求,TensorFlow 推出 Eager Execution

TAG:AI研習社 |