?特征工程系列:特征預處理(上)

關于作者:JunLiang,一個熱愛挖掘的數據從業者,勤學好問、動手達人,期待與大家一起交流探討機器學習相關內容~

0x00 前言

數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已。由此可見,特征工程在機器學習中占有相當重要的地位。在實際應用當中,可以說特征工程是機器學習成功的關鍵。

那特征工程是什么?

特征工程是利用數據領域的相關知識來創建能夠使機器學習算法達到最佳性能的特征的過程。

雖然我們也有自動的機器學習框架,如 AutoML(但該框架也強調了它需要好的特征才能跑出好的效果!)。特征工程永不過時,即使對于自動化方法,其中也有一部分經常需要根據數據類型、領域和要解決的問題而設計特殊的特征。

特征工程又包含了Data PreProcessing(數據預處理)、Feature Extraction(特征提取)、Feature Selection(特征選擇)和Feature construction(特征構造)等子問題,而數據預處理又包括了數據清洗和特征預處理等子問題,本章內容主要討論數據預處理的方法及實現。

0x01 特征預處理介紹

特征預處理包括無量綱化、特征分桶、統計變換和特征編碼等步驟,詳情可參考下圖:

0x02 數值型特征無量綱化

我們的數據一般都是有單位的,比如身高的單位有m,cm,這個無量綱化并不是說把m變成cm,而是說,無論是m還是cm,最后都會變成1,也就是沒有了單位。

無量綱化使不同規格的數據轉換到同一規格。常見的無量綱化方法有標準化和歸一化。

數據標準化的原因:

  • 某些算法要求樣本具有零均值和單位方差;

  • 需要消除樣本不同屬性具有不同量級時的影響。

    • 歸一化有可能提高精度;

      數量級的差異將導致量級較大的屬性占據主導地位,從而與實際情況相悖(比如這時實際情況是值域范圍小的特征更重要);

    • 數量級的差異將導致迭代收斂速度減慢;

      當使用梯度下降法尋求最優解時,很有可能走“之字型”路線(垂直等高線走),從而導致需要迭代很多次才能收斂;

    • 依賴于樣本距離的算法對于數據的數量級非常敏感。

1.數據標準化(Standardization)

標準化的前提是特征值服從正態分布,標準化后,其轉換成標準正態分布。

1)定義

基于原始數據的均值(mean)和標準差(standarddeviation)進行數據的標準化。將A的原始值x使用z-score標準化到x’。z-score標準化方法適用于屬性A的最大值和最小值未知的情況,或有超出取值范圍的離群數據的情況。

標準化公式:

均值和標準差都是在樣本集上定義的,而不是在單個樣本上定義的。標準化是針對某個屬性的,需要用到所有樣本在該屬性上的值。

2)標準化效果

3)優缺點

優點:

Z-Score最大的優點就是簡單,容易計算,Z-Score能夠應用于數值型的數據,并且不受數據量級的影響,因為它本身的作用就是消除量級給分析帶來的不便。

缺點:

  • 估算Z-Score需要總體的平均值與方差,但是這一值在真實的分析與挖掘中很難得到,大多數情況下是用樣本的均值與標準差替代;

  • Z-Score對于數據的分布有一定的要求,正態分布是最有利于Z-Score計算的;

  • Z-Score消除了數據具有的實際意義,A的Z-Score與B的Z-Score與他們各自的分數不再有關系,因此Z-Score的結果只能用于比較數據間的結果,數據的真實意義還需要還原原值;

  • 在存在異常值時無法保證平衡的特征尺度。

4)實現代碼:

from sklearn.preprocessing import StandardScaler#標準化,返回值為標準化后的數據standardScaler  = StandardScaler().fit(X_train)standardScaler.transform(X_train)

2.歸一化

1)MinMax歸一化

區間縮放法利用了邊界值信息,將屬性縮放到[0,1]。

公式:

效果

實現代碼
from sklearn.preprocessing import MinMaxScaler#區間縮放,返回值為縮放到[0, 1]區間的數據minMaxScaler  = MinMaxScaler().fit(X_train)minMaxScaler.transform(X_train)
缺點:
  • 這種方法有一個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義;

  • MinMaxScaler對異常值的存在非常敏感。

2)MaxAbs歸一化

單獨地縮放和轉換每個特征,使得訓練集中的每個特征的最大絕對值將為1.0,將屬性縮放到[-1,1]。它不會移動/居中數據,因此不會破壞任何稀疏性。

MaxAbs公式

效果

缺點:
  • 這種方法有一個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義;

  • MaxAbsScaler與先前的縮放器不同,絕對值映射在[0,1]范圍內。

    在僅有正數據時,該縮放器的行為MinMaxScaler與此類似,因此也存在大的異常值。

實現代碼
from sklearn.preprocessing import MaxAbsScalermaxAbsScaler  = MaxAbsScaler().fit(X_train)maxAbsScaler.transform(X_train)

3.正態分布化(Normalization)

1)定義

正則化的過程是將每個樣本縮放到單位范數(每個樣本的范數為1),如果要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用。

該方法是文本分類和聚類分析中經常使用的向量空間模型(Vector Space Model)的基礎。

Normalization主要思想是對每個樣本計算其p-范數,然后對該樣本中每個元素除以該范數,這樣處理的結果是使得每個處理后樣本的p-范數(l1-norm,l2-norm)等于1。

2)規則為l2的公式

3)正則化效果

可以在上面的兩個圖中看到所有樣本都映射到單位圓上。在我們的示例中,兩個選定的特征僅具有正值; 因此,轉換后的數據僅位于正象限中。如果某些原始特征具有正值和負值的混合,則情況并非如此。

4)實現代碼

from sklearn.preprocessing import Normalizer#歸一化,返回值為歸一化后的數據normalizer  = Normalizer(norm="l2").fit(X_train)normalizer.transform(X_train)

4.標準化與歸一化對比

1)標準化與歸一化的異同

相同點:它們的相同點在于都能取消由于量綱不同引起的誤差;都是一種線性變換,都是對向量X按照比例壓縮再進行平移。

不同點:

  • 目的不同,歸一化是為了消除綱量壓縮到[0,1]區間;

    標準化只是調整特征整體的分布;

  • 歸一化與最大,最小值有關;

    標準化與均值,標準差有關;

  • 歸一化輸出在[0,1]之間;

    標準化無限制。

2)什么時候用歸一化?什么時候用標準化?

  • 如果對輸出結果范圍有要求,用歸一化;

  • 如果數據較為穩定,不存在極端的最大最小值,用歸一化;

  • 如果數據存在異常值和較多噪音,用標準化,可以間接通過中心化避免異常值和極端值的影響。

3)歸一化與標準化的應用場景

  • 在分類、聚類算法中,需要使用距離來度量相似性的時候(如SVM、KNN)、或者使用PCA技術進行降維的時候,標準化(Z-score standardization)表現更好;

  • 在不涉及距離度量、協方差計算、數據不符合正太分布的時候,可以使用第一種方法或其他歸一化方法。

    比如圖像處理中,將RGB圖像轉換為灰度圖像后將其值限定在[0 255]的范圍;

  • 基于樹的方法不需要進行特征的歸一化。

    例如隨機森林,bagging與boosting等方法。

    如果是基于參數的模型或者基于距離的模型,因為需要對參數或者距離進行計算,都需要進行歸一化。

一般來說,建議優先使用標準化。對于輸出有要求時再嘗試別的方法,如歸一化或者更加復雜的方法。很多方法都可以將輸出范圍調整到[0, 1],如果我們對于數據的分布有假設的話,更加有效的方法是使用相對應的概率密度函數來轉換。

除了上面介紹的方法外,還有一些相對沒這么常用的處理方法:RobustScaler、PowerTransformer、QuantileTransformer和QuantileTransformer等。

0x03 數值型特征特征分箱(數據離散化)

離散化是數值型特征非常重要的一個處理,其實就是要將數值型數據轉化成類別型數據。連續值的取值空間可能是無窮的,為了便于表示和在模型中處理,需要對連續值特征進行離散化處理。

分箱的重要性及其優勢:

  • 離散特征的增加和減少都很容易,易于模型的快速迭代;

  • 稀疏向量內積乘法運算速度快,計算結果方便存儲,容易擴展;

  • 離散化后的特征對異常數據有很強的魯棒性;

    比如一個特征是年齡>30是1,否則0。

    如果特征沒有離散化,一個異常數據“年齡300歲”會給模型造成很大的干擾;

  • 對于線性模型,表達能力受限;

    單變量離散化為N個后,每個變量有單獨的權重,相當于模型引入了非線性,能夠提升模型表達能力,加大擬合;

  • 離散化后可以進行特征交叉,由M+N個變量變為M*N個變量,進一步引入非線性,提升表達能力;

  • 特征離散化后,模型會更穩定;

    比如如果對用戶年齡離散化,20-30作為一個區間,不會因為一個用戶年齡長了一歲就變成一個完全不同的人。

    當然處于區間相鄰處的樣本會剛好相反,所以怎么劃分區間是門學問;

  • 特征離散化以后,起到了簡化了邏輯回歸模型的作用,降低了模型過擬合的風險;

  • 可以將缺失作為獨立的一類帶入模型;

  • 將所有變量變換到相似的尺度上。

1.無監督分箱法

1)自定義分箱

自定義分箱,是指根據業務經驗或者常識等自行設定劃分的區間,然后將原始數據歸類到各個區間中。

2)等距分箱

定義

按照相同寬度將數據分成幾等份。

從最小值到最大值之間,均分為 N 等份, 這樣, 如果 A,B 為最小最大值, 則每個區間的長度為 W=(B?A)/N , 則區間邊界值為A+W,A+2W,….A+(N?1)W 。這里只考慮邊界,每個等份里面的實例數量可能不等。

缺點是受到異常值的影響比較大

實現程序
import pandas as pddf = pd.DataFrame([[22,1],[13,1],[33,1],[52,0],[16,0],[42,1],[53,1],[39,1],[26,0],[66,0]],columns=["age","Y"])df["age_bin_2"] = pd.cut(df["age"],3)  #新增一列存儲等距劃分的分箱特征display(df)# 輸出    age    Y    age_bin0    22    1    (12.947, 30.667]1    13    1    (12.947, 30.667]2    33    1    (30.667, 48.333]3    52    0    (48.333, 66.0]4    16    0    (12.947, 30.667]5    42    1    (30.667, 48.333]6    53    1    (48.333, 66.0]7    39    1    (30.667, 48.333]8    26    0    (12.947, 30.667]9    66    0    (48.333, 66.0]

3)等頻分箱

定義

將數據分成幾等份,每等份數據里面的個數是一樣的。區間的邊界值要經過選擇,使得每個區間包含大致相等的實例數量。比如說 N=10 ,每個區間應該包含大約10%的實例。

實現程序
import pandas as pddf = pd.DataFrame([[22,1],[13,1],[33,1],[52,0],[16,0],[42,1],[53,1],[39,1],[26,0],[66,0]],columns=["age","Y"])df["age_bin_1"] = pd.qcut(df["age"],3) #新增一列存儲等頻劃分的分箱特征display(df)# 輸出    age    Y    age_bin0    22    1    (12.999, 26.0]1    13    1    (12.999, 26.0]2    33    1    (26.0, 42.0]3    52    0    (42.0, 66.0]4    16    0    (12.999, 26.0]5    42    1    (26.0, 42.0]6    53    1    (42.0, 66.0]7    39    1    (26.0, 42.0]8    26    0    (12.999, 26.0]9    66    0    (42.0, 66.0]

4)聚類分箱

定義

基于k均值聚類的分箱:k均值聚類法將觀測值聚為k類,但在聚類過程中需要保證分箱的有序性:第一個分箱中所有觀測值都要小于第二個分箱中的觀測值,第二個分箱中所有觀測值都要小于第三個分箱中的觀測值,等等。

實現步驟
  • Step 0:

    對預處理后的數據進行歸一化處理;

  • Step 1:

    將歸一化處理過的數據,應用k-means聚類算法,劃分為多個區間:

    采用等距法設定k-means聚類算法的初始中心,得到聚類中心;

  • Step 2:

    在得到聚類中心后將相鄰的聚類中心的中點作為分類的劃分點,將各個對象加入到距離最近的類中,從而將數據劃分為多個區間;

  • Step 3:

    重新計算每個聚類中心,然后重新劃分數據,直到每個聚類中心不再變化,得到最終的聚類結果。

實現代碼
from sklearn.cluster import KMeanskmodel=KMeans(n_clusters=k)  #k為聚成幾類kmodel.fit(>

5)二值化(Binarization)

定義

二值化可以將數值型(numerical)的feature進行閥值化得到boolean型數據。這對于下游的概率估計來說可能很有用(比如:數據分布為Bernoulli分布時)。

公式

定量特征二值化的核心在于設定一個閾值,大于閾值的賦值為1,小于等于閾值的賦值為0,公式如下:

實現代碼
from sklearn.preprocessing import Binarizer# Binarizer函數也可以設定一個閾值,結果數據值大于閾值的為1,小于閾值的為0binarizer = Binarizer(threshold=0.0).fit(X_train)binarizer.transform(X_train)

2.有監督分箱法

1)卡方分箱法

定義

自底向上的(即基于合并的)數據離散化方法。它依賴于卡方檢驗:具有最小卡方值的相鄰區間合并在一起,直到滿足確定的停止準則。

基本思想

對于精確的離散化,相對類頻率在一個區間內應當完全一致。因此,如果兩個相鄰的區間具有非常類似的類分布,則這兩個區間可以合并;否則,它們應當保持分開。而低卡方值表明它們具有相似的類分布。

實現步驟
  • Step 0:

    預先定義一個卡方的閾值;

  • Step 1:

    初始化;

    根據要離散的屬性對實例進行排序,每個實例屬于一個區間;

  • Step 2:

    合并區間;

    • 計算每一對相鄰區間的卡方值;

    • 將卡方值最小的一對區間合并;

Aij:第i區間第j類的實例的數量;Eij:Aij的期望頻率(=(Ni*Cj)/N),N是總樣本數,Ni是第i組的樣本數,Cj是第j類樣本在全體中的比例;
閾值的意義

類別和屬性獨立時,有90%的可能性,計算得到的卡方值會小于4.6。大于閾值4.6的卡方值就說明屬性和類不是相互獨立的,不能合并。如果閾值選的大,區間合并就會進行很多次,離散后的區間數量少、區間大。

注意
  • ChiMerge算法推薦使用0.90、0.95、0.99置信度,最大區間數取10到15之間;

  • 也可以不考慮卡方閾值,此時可以考慮最小區間數或者最大區間數。

    指定區間數量的上限和下限,最多幾個區間,最少幾個區間;

  • 對于類別型變量,需要分箱時需要按照某種方式進行排序。

實現代碼

https://github.com/tatsumiw/ChiMerge/blob/master/ChiMerge.py

2)最小熵法分箱

需要使總熵值達到最小,也就是使分箱能夠最大限度地區分因變量的各類別。

熵是信息論中數據無序程度的度量標準,提出信息熵的基本目的是找出某種符號系統的信息量和冗余度之間的關系,以便能用最小的成本和消耗來實現最高效率的數據存儲、管理和傳遞。數據集的熵越低,說明數據之間的差異越小,最小熵劃分就是為了使每箱中的數據具有最好的相似性。給定箱的個數,如果考慮所有可能的分箱情況,最小熵方法得到的箱應該是具有最小熵的分箱。

0x0FF 總結
  1. 特征預處理是數據預處理過程的重要步驟,是對數據的一個的標準的處理,幾乎所有的數據處理過程都會涉及該步驟。

  2. 我們對特征進行分箱后,需要對分箱后的每組(箱)進行woe編碼和IV值的計算,通過IV值進行變量篩選后,然后才能放進模型訓練。

  3. 分箱后需要進行特征編碼,如:

    LabelEncode、OneHotEncode或LabelBinarizer等。

如有錯誤歡迎指正~

參考文獻

[1] sklearn中的數據預處理. http://d0evi1.com/sklearn/preprocessing/[2] 歸一化與標準化. https://ssjcoding.github.io/2019/03/27/normalization-and-standardization/[3] Preprocessing Data : 類別型特徵_OneHotEncoder & LabelEncoder 介紹與實作. https://medium.com/ai%E5%8F%8D%E6%96%97%E5%9F%8E/preprocessing->

免責聲明:本文僅代表文章作者的個人觀點,與本站無關。其原創性、真實性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容文字的真實性、完整性和原創性本站不作任何保證或承諾,請讀者僅作參考,并自行核實相關內容。

http://image99.pinlue.com/thumb/img_jpg/jYWFficmyzX5X7A8kj1CPsf2ChnpY1NwfWIDhAdHibKrwjmIiaibicgCKog31aVfBiavUhtY54kTicjWXS2rDeVA0uhSA/0.jpeg
我要收藏
贊一個
踩一下
分享到
相關推薦
精選文章
?
买鱼能赚钱吗