特徵處理
所謂特徵(Feature),是指數據中能夠較好地反應事物本質、並且便於計算和分析的屬性。我們希望在特徵中能夠儘可能包含多的信息量,同時,不同的特徵之間又能有比較明顯的差異化、甚至相互獨立。基於較好的特徵進行建模分析,就會比較容易得到好的結果。
構建新特徵
在很多情況下,原始數據並不一定能很直接地反映本質的規律。
比如文本數據,特別是對於中文文本,如果沒有進行分詞處理,那麼這個數據就很難進行分析處理,因此需要對數據進行分詞,以構成新的特徵。再比如,我們想要分析各個城市的房價,即使我們已經獲取了房價的數據,但是同樣的單價,可能在一二線城市是一個中低檔樓盤,在三四線城市可能就屬於高檔樓盤,所以,單純的房價數據並不能很好地反映樓盤的品質。這個時候,可能就需要根據不同城市房價的中位數或者四分位數,將樓盤單價轉變為高檔、低檔這樣的分類屬性,構成更能反映樓盤品質特點的一個新的特徵。
即使是含義明確、信息充足的屬性,有時候為了演算法便於處理,還需要進行進一步的處理,比如進行標準化、區間化、歸一化、取對數、二值化、One Hot 編碼等等。下面簡單介紹這些常用的屬性處理方法的目的,具體使用哪種方法來構建新的特徵,還需要分析具體的問題來決定:
- 標準化:減小不同期望值和方差對模型產生的影響,標準化方法: (實例:sklearn 庫 的 StandardScaler 類)
- 區間化:將數據縮放到一個區間範圍,比如 [0, 1] 區間(實例:sklearn 庫的 MinMaxScaler 類)
- 歸一化:將每個數據代表的向量進行單位化,確保向量長度為1,通常在需要計算向量相似度的文本分類、聚類等場景中用得較多(實例:sklearn 庫的 Normalizer類)
- 取對數:對於一些數據幅度會大幅度變化、並且規律中存在指數因素的情況(多見於時間序列數據,比如一些金融數據),取對數可以消除這些不利因素,將非線性的指數問題轉變為線性問題
- 二值化:設定一個閾值,如果大於這個閾值則取值為 1,否則取值為 0(實例:sklearn 庫的 Binarizer 類)
- One Hot 編碼:將一個有若干可能值的標籤類特徵,編碼為若干個不同的特徵,這些特徵中同時只有一個特徵取值為1,其餘取值為0,比如數據中原本有個特徵標記了性別為「男」、「女」或「未知」,One Hot 編碼後轉為三個特徵:「是否為男」、「是否為女」、「是否未知」(實例:sklearn 庫的 OneHotEncoder 類)
特徵選擇
下面,就需要從數據的若干特徵中,挑選比較能夠反映事物規律的特徵。(注意,在一些如 XGBoost 的學習方法,會自動對特徵進行評分,因此對無效的特徵並不敏感,那麼特徵選擇的環節就並不一定是必須的。)選擇特徵主要有以下 3 類方法:
1、篩選法:就是通過對特徵的一些特點進行篩選,篩選的方式大致有兩種,一種是根據方差判斷,如果方差太小,表明這個特徵包含的信息量很少,應當移除:
from sklearn.feature_selection import VarianceThreshold# 移除方差小於閾值的特徵,參數 threshold 為方差的閾值VarianceThreshold(threshold=10).fit_transform(features)
另外一種是根據評價函數(如 Pearson 相關係數、卡方檢驗等),選擇最好的幾個特徵保留下來:
from sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2# 選擇 k 個最好的特徵,這裡採用的評價函數是卡方檢驗SelectKBest(chi2, k=5).fit_transform(features, target)
2、封裝法:就是將特徵集封裝成不同組成的若干個分類,通過評價來找出最好的分類,常見的方法如遞歸特徵消除法(Recursive Feature Elimination,簡稱 RFE):
from sklearn.feature_selection import RFEfrom sklearn.linear_model import LogisticRegression# 參數 estimator 為基模型,n_features_to_select 為選擇的特徵數量RFE(estimator=LogisticRegression(), n_features_to_select=5).fit_transform(features, target)
3、集成法:通過集成學習器來自動選擇特徵
from sklearn.feature_selection import SelectFromModelfrom sklearn.ensemble import GradientBoostingClassifier# 集成 GBDT 作為基模型來自動進行特徵選擇SelectFromModel(GradientBoostingClassifier()).fit_transform(features, target)
推薦閱讀:
※特徵工程-Outliers
※文本特徵選擇(信息熵、Gini、IV、卡方值)
※如何獲取可區分性的特徵(loss functon篇上)
※什麼年代了!你還在寫 ETL 代碼抽取特徵?
※大數據:特徵工程預測用戶行為