人工智慧之路(特徵工程篇)

人工智慧之路(特徵工程篇)

今天聊一聊特徵工程,工欲善其事必先利其器,特徵工程是機器學習十分重要的環節,提取出好的特徵,無論使用什麼演算法,都能夠得到一個好的結果,反過來,如果沒有做好特徵工程提取,再好的演算法也很難得到一個好的結果。

1.什麼是特徵工程

特徵工程是從原始數據提取出待解決問題相關的關鍵特徵屬性,提供給演算法和模型使用的一項工程活動。

2.數據預處理

數據分析:拿到數據之後需要對數據進行相關統計與分析,可以使用seaborn,matplotlib等對數據做一些直方圖,熱圖等,並對數據的平均值,方差等做個統計,這樣可以一目了然的發現噪點數據。

缺失值處理

  • 直接刪除:適合缺失值數量較小,並且是隨機出現的,刪除它們對整體數據影響不大的情況。優點:處理簡單。缺點:樣本信息減少,改變了原數據的概率分布。
  • 均值或中位數替換法:使用該特徵的平均值或者中位數替換缺失值,對於正常分布的數據可以使用均值代替,如果數據是傾斜的,使用中位數可能更好。優點:不會減少樣本信息,處理簡單。缺點:當缺失數據不是隨機數據時會產生偏差。
  • 隨機插補法:從總體中隨機抽取某個樣本代替樣本缺失的屬性值。優點:方便簡單,容易操作。缺點:隨機採樣具有隨機性,容易帶來採樣誤差。
  • 建模法:通過建模的方式,利用未缺失的屬性,找相似的樣本,求平均值代替缺失值。相似可以通過歐氏距離,cos,皮卡爾遜係數計算。優點:不會減少樣本信息,更符合原始數據的分布。缺點:操作複雜。

異常值處理

  • 3?原則:如果數據服從正態分布,在3?原則下,異常值為一組測定值中與平均值的偏差超過3倍標準差的值。如果數據服從正態分布,距離平均值3?之外的值出現的概率為P(|x-u| > 3?) <= 0.003,屬於極個別的小概率事件。如果數據不服從正態分布,也可以用遠離平均值的多少倍標準差來描述。
  • 箱型圖分析:型圖提供了識別異常值的一個標準:如果一個值小於QL01.5IQR或大於OU-1.5IQR的值,則被稱為異常值。QL為下四分位數,表示全部觀察值中有四分之一的數據取值比它小;QU為上四分位數,表示全部觀察值中有四分之一的數據取值比它大;IQR為四分位數間距,是上四分位數QU與下四分位數QL的差值,包含了全部觀察值的一半。箱型圖判斷異常值的方法以四分位數和四分位距為基礎,四分位數具有魯棒性:25%的數據可以變得任意遠並且不會干擾四分位數,所以異常值不能對這個標準施加影響。因此箱型圖識別異常值比較客觀,在識別異常值時有一定的優越性。
  • 距離法:通常可以在對象之間定義鄰近性度量,異常對象是那些遠離其他對象的對象。
  • 聚類法:一個對象是基於聚類的離群點,如果該對象不強屬於任何簇。
  • 去重處理:在不太影響概率分布和分類數據平衡性的情況下,刪除樣本中重複的數據。

樣本平衡處理:如果樣本數據不太平衡,需要進行相關的處理,如果有1000個貓的樣本,100個狗的樣本,那訓練出來的模型可能會偏向於樣本多的分類。

  • 採樣法(過採樣,欠採樣):增加數據,對數據量較少的分類進行重複採樣,直到所有分類達到平衡狀態。刪除樣本數較多的分類刪除一些樣本,直到所有分類達到平衡狀態。優點:操作簡單。缺點:刪除數據(欠採樣)會導致數據信息部分丟失,增加數據(過採樣),增加內存消耗,使得訓練時間增加。
  • 生成合成數據:可以通過平移翻轉,生成對抗網路,隨機增加噪點來生成數據。優點:樣本數據獨立不重複,使得模型能學到更多的東西。缺點:操作相對採樣法複雜一些

3.特徵處理

  • 標準化:標準化需要計算特徵的均值和標準差。

from sklearn.preprocessing import StandardScaler#標準化,返回值為標準化後的數據StandardScaler().fit_transform(iris.data)

  • 歸一化:將數據轉換成0-1之間的值。

from sklearn.preprocessing import Normalizer#歸一化,返回值為歸一化後的數據 Normalizer().fit_transform(iris.data)

  • 離散化:將連續值分成若干段,轉換成離散值。
  • 數據轉換:特徵值數據相差太大可以進行對數處理.特徵數據相差較小,可以使用指數處理。
  • one-hot:將文本類的屬性,轉換成機器能識別的數字屬性。

from sklearn.preprocessing import OneHotEncoder #啞編碼,對IRIS數據集的目標值,返回值為啞編碼後的數據OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))

  • 降維:當特徵數量太多,需要對特徵進行降維處理.方法:PCA,LDA。

from sklearn.decomposition import PCA#主成分分析法,返回降維後的數據#參數n_components為主成分數目PCA(n_components=2).fit_transform(iris.data)from sklearn.lda import LDA#線性判別分析法,返回降維後的數據#參數n_components為降維後的維數LDA(n_components=2).fit_transform(iris.data, iris.target)

  • 將非正太分布轉換成正太分布
  • 特徵選擇:找出信息增益最高的幾個特徵。祛除存在線性關係中的特徵。

from sklearn.feature_selection import SelectKBestfrom minepy import MINE#由於MINE的設計不是函數式的,定義mic方法將其為函數式的,返回一個二元組,二元組的第2項設置成固定的P值0.5def mic(x, y): m = MINE() m.compute_score(x, y) return (m.mic(), 0.5)#選擇K個最好的特徵,返回特徵選擇後的數據SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

  • 方差選擇法:使用方差選擇法,先要計算各個特徵的方差,然後根據閾值,選擇方差大於閾值的特徵。

from sklearn.feature_selection import VarianceThreshold#方差選擇法,返回值為特徵選擇後的數據#參數threshold為方差的閾值VarianceThreshold(threshold=3).fit_transform(iris.data)

  • 相關係數法:使用相關係數法,先要計算各個特徵對目標值的相關係數以及相關係數的P值

from sklearn.feature_selection import SelectKBestfrom scipy.stats import pearsonr#選擇K個最好的特徵,返回選擇特徵後的數據#第一個參數為計算評估特徵是否好的函數,該函數輸入特徵矩陣和目標向量,輸出二元組(評分,P值)的數組,數組第i項為第i個特徵的評分和P值。在此定義為計算相關係數#參數k為選擇的特徵個數SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

  • 卡方檢驗:經典的卡方檢驗是檢驗定性自變數對定性因變數的相關性。假設自變數有N種取值,因變數有M種取值,考慮自變數等於i且因變數等於j的樣本頻數的觀察值與期望的差距,構建統計量

from sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2#選擇K個最好的特徵,返回選擇特徵後的數據SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

  • 基於懲罰項的特徵選擇法:使用帶懲罰項的基模型,除了篩選出特徵外,同時也進行了降維

from sklearn.feature_selection import SelectFromModelfrom sklearn.linear_model import LogisticRegression#帶L1懲罰項的邏輯回歸作為基模型的特徵選擇SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)from sklearn.feature_selection import SelectFromModel#帶L1和L2懲罰項的邏輯回歸作為基模型的特徵選擇#參數threshold為權值係數之差的閾值SelectFromModel(LR(threshold=0.5, C=0.1)).fit_transform(iris.data, iris.target)

  • 基於樹模型的特徵選擇法:樹模型中GBDT也可用來作為基模型進行特徵選擇

from sklearn.feature_selection import SelectFromModelfrom sklearn.ensemble import GradientBoostingClassifier#GBDT作為基模型的特徵選擇SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)

4.參考資料:

使用sklearn做單機特徵工程 - jasonfreak - 博客園

推薦閱讀:

前沿綜述:關係數據紛繁複雜,如何捕捉其中結構?
CNN特徵提取筆記

TAG:特徵工程 | 特徵提取 | 特徵選擇 |