1. 特征工程之特征預處理
2. 特征工程之特征選擇
1. 前言
“數據決定了機器學習的上限,而算法只是盡可能逼近這個上限”,這里的數據指的就是經過特征工程得到的數據。特征工程指的是把原始數據轉變為模型的訓練數據的過程,它的目的就是獲取更好的訓練數據特征,使得機器學習模型逼近這個上限。特征工程能使得模型的性能得到提升,有時甚至在簡單的模型上也能取得不錯的效果。特征工程在機器學習中占有非常重要的作用,主要包括數據與特征預處理、特征選擇和數據的降維三部分。接下去會通過3篇文章對這三方面進行介紹。今天首先講講數據與特征的預處理。
2. 數據與特征預處理
數據與特征預處理也稱為特征提取,主要是從非結構化的數據中提取出有用的特征並且進行一定的數據處理。數據與特征的預處理包括:
- 數據選擇、清洗、采樣
- 特征預選擇,去掉類似ID的相關度為0的特征。
- 數據清洗,填充缺失值、去掉異常值(離群點、臟數據),缺省值極多的字段考慮不用。
- 采樣:針對正負樣本不平衡的情況,可以通過上下采樣,和改變權重來處理。
- 數據格式化,比如文本處理的時候,去掉文本不相關的,符號和標點,處理大小寫,字體編碼問題。
- 特征的擴充,例如,可以加入天氣溫度等特征,有時序性的問題,可以shift聯系前后幾天,增加時序特征,還有特征重新組合,特征的拆分,one-hot編碼。
- 不同類型數據的特征處理
- 數值型:幅度調整/歸一化、log等變化、統計值(例如max、min、mean、std)、離散化、分桶等
- 類別型:one-hot編碼,復雜的多字段合並成精簡的少字段等
- 時間型:提取出連續值的持續時間和間隔時間;提取出離散值的“年”、“月”、“日”、“一年中哪個星期/季度”、“一周中的星期幾”、“工作日/周末”等信息
- 文本型:使用TF-IDF特征
- 統計型:加減平均、分位線、次序、比例
- 對數據進行預處理,可提高數據質量,提高挖掘質量。對數據進行清洗可填充缺失值、光滑噪聲數據,識別和刪除離群點數據,保證數據的一致性;
- 使用正確的采樣方法可解決因數據不平衡帶來的預測偏差;
- 對不同的數據類型進行不同的特征處理有助於提高特征的可用性,例如對數值型數據進行歸一化可將數據轉化到統一量綱下;對類別型數據,可用one-hot編碼方法將類別數據數字化,數字化特征之后可更用來計算距離、相似性等;可從時間型數據當中提取中更多的時間特征,例如年、月和日等,這些特征對於業務場景以及模型的預測往往有很大的幫助。統計型特征處理有助於從業務場景中挖掘更豐富的信息。
3. 處理不平衡數據
之前的處理不平衡數據已經進行了詳細的介紹,本文在簡單的描述下。
處理不平衡數據一般是兩種方法:權重法或者采樣法
權重法:是比較簡單的方法,我們可以對訓練集里的每個類別加一個權重class weight。如果該類別的樣本數多,那么它的權重就低,反之則權重就高。如果更細致點,我們還可以對每個樣本加權重sample weight,思路和類別權重也是一樣,即樣本數多的類別樣本權重低,反之樣本權重高。sklearn中,絕大多數分類算法都有class weight和 sample weight可以使用。
采樣法常用的也有兩種思路,
- 第一種是對類別樣本數多的樣本做子采樣, 比如訓練集里A類別樣本占90%,B類別樣本占10%。那么我們可以對A類的樣本子采樣,直到子采樣得到的A類樣本數和B類別現有樣本一致為止,這樣我們就只用子采樣得到的A類樣本數和B類現有樣本一起做訓練集擬合模型。
- 第二種思路是對類別樣本數少的樣本做過采樣, 還是上面的例子,我們對B類別的樣本做過采樣,直到過采樣得到的B類別樣本數加上B類別原來樣本一起和A類樣本數一致,最后再去擬合模型。
4. 異常值清洗
- 是基於統計學的方法來處理異常數據,這種方法一般會構建一個概率分布模型,並計算對象符合該模型的概率,把具有低概率的對象視為異常點。Q1=25%,Q3=75%,IQ=Q3-Q
1,Q1-1.5IQ,Q1-3IQ,Q3+1.5IQ,Q3+3IQ算成離群點 - 是基於聚類的方法來做異常點檢測。這個很好理解,由於大部分聚類算法是基於數據特征的分布來做的,通常如果我們聚類后發現某些聚類簇的數據樣本量比其他簇少很多,而且這個簇里數據的特征均值分布之類的值和其他簇也差異很大,這些簇里的樣本點大部分時候都是異常點。比如我之前講到的BIRCH聚類算法原理和DBSCAN密度聚類算法都可以在聚類的同時做異常點的檢測。
- 是基於專門的異常點檢測算法來做。這類算法的代表是One Class SVM和Isolation Forest.
5. 數據預處理
5.1 無量綱化
5.1.1 標准化
標准化需要計算特征的均值和標准差
5.1.2 區間縮放法
區間縮放法的思路有多種,常見的一種為利用兩個最值進行縮放
5.1.3 標准化與歸一化的區別
標准化:是依照特征矩陣的列處理數據,其通過求z-score的方法,將樣本的特征值轉換到同一量綱下。
歸一化:是依照特征矩陣的行處理數據,其目的在於樣本向量在點乘運算或其他核函數計算相似性時,擁有統一的標准,也就是說都轉化為“單位向量”。
5.2 對定量特征二值化
定量特征二值化的核心在於設定一個閾值,大於閾值的賦值為1,小於等於閾值的賦值為0。
5.3 對定性特征啞編碼
OneHotEncoder,假設有N種定性值,則將這一個特征擴展為N種特征,當原始特征值為第i種定性值時,第i個擴展特征賦值為1,其他擴展特征賦值為0。啞編碼的方式相比直接指定的方式,不用增加調參的工作,對於線性模型來說,使用啞編碼后的特征可達到非線性的效果。
5.4 缺失值計算
使用preproccessing庫的Imputer類對數據進行缺失值計算
- 缺失值比例超過50%直接丟棄
- 如果是連續值,那么一般有兩種選擇,一是選擇所有有該特征值的樣本,然后取平均值,來填充缺失值,另一種是取中位數來填充缺失值
- 如果是離散值,則一般會選擇所有有該特征值的樣本中最頻繁出現的類別值,來填充缺失值。
5.5 數據變換
常見的數據變換有基於多項式的、基於指數函數的、基於對數函數的
6. 特征工程的Roadmap

7. 總結
簡單的說,特征工程是能夠將數據像藝術一樣展現的技術。因為好的特征工程很好的混合了專業領域知識、直覺和基本的數學能力。但是最有效的數據呈現其實並不涉及任何的數據運算。
本質上來說,呈現給算法的數據應該能擁有基本數據的相關結構或屬性。當你做特征工程時,其實是將數據屬性轉換為數據特征的過程,屬性代表了數據的所有維度,在數據建模時,如果對原始數據的所有屬性進行學習,並不能很好的找到數據的潛在趨勢,而通過特征工程對你的數據進行預處理的話,你的算法模型能夠減少受到噪聲的干擾,這樣能夠更好的找出趨勢。事實上,好的特征甚至能夠幫你實現使用簡單的模型達到很好的效果。
