特徵工程之特徵預處理

在前面咱們分別討論了特徵工程中的特徵選擇與特徵表達,本文咱們來討論特徵預處理的相關問題。主要包括特徵的歸一化和標準化,異常特徵樣本清洗與樣本數據不平衡問題的處理。算法

1、特徵的標準化和歸一化

     因爲標準化和歸一化這兩個詞常常混用,因此本文再也不區別標準化和歸一化,而經過具體的標準化和歸一化方法來區別具體的預處理操做。微信

    z-score標準化:這是最多見的特徵預處理方式,基本全部的線性模型在擬合的時候都會作 z-score標準化。具體的方法是求出樣本特徵x的均值mean和標準差std,而後用(x-mean)/std來代替原特徵。這樣特徵就變成了均值爲0,方差爲1了。在sklearn中,咱們能夠用StandardScaler來作z-score標準化。固然,若是咱們是用pandas作數據預處理,能夠本身在數據框裏面減去均值,再除以方差,本身作z-score標準化。    機器學習

    max-min標準化:也稱爲離差標準化,預處理後使特徵值映射到[0,1]之間。具體的方法是求出樣本特徵x的最大值max和最小值min,而後用(x-min)/(max-min)來代替原特徵。若是咱們但願將數據映射到任意一個區間[a,b],而不是[0,1],那麼也很簡單。用(x-min)(b-a)/(max-min)+a來代替原特徵便可。在sklearn中,咱們能夠用MinMaxScaler來作max-min標準化。這種方法的問題就是若是測試集或者預測數據裏的特徵有小於min,或者大於max的數據,會致使max和min發生變化,須要從新計算。因此實際算法中, 除非你對特徵的取值區間有需求,不然max-min標準化沒有 z-score標準化好用。學習

    L1/L2範數標準化:若是咱們只是爲了統一量綱,那麼經過L2範數總體標準化也是能夠的,具體方法是求出每一個樣本特徵向量\(\vec{x}\)的L2範數\(||\vec{x}||_2\),而後用\(\vec{x}/||\vec{x}||_2\)代替原樣本特徵便可。固然L1範數標準化也是能夠的,即用\(\vec{x}/||\vec{x}||_1\)代替原樣本特徵。一般狀況下,範數標準化首選L2範數標準化。在sklearn中,咱們能夠用Normalizer來作L1/L2範數標準化。測試

    此外,常常咱們還會用到中心化,主要是在PCA降維的時候,此時咱們求出特徵x的平均值mean後,用x-mean代替原特徵,也就是特徵的均值變成了0, 可是方差並不改變。這個很好理解,由於PCA就是依賴方差來降維的。spa

    雖然大部分機器學習模型都須要作標準化和歸一化,也有很多模型能夠不作作標準化和歸一化,主要是基於機率分佈的模型,好比決策樹你們族的CART,隨機森林等。固然此時使用標準化也是能夠的,大多數狀況下對模型的泛化能力也有改進。rest

2、異常特徵樣本清洗

    咱們在實際項目中拿到的數據每每有很多異常數據,有時候不篩選出這些異常數據極可能讓咱們後面的數據分析模型有很大的誤差。那麼若是咱們沒有專業知識,如何篩選出這些異常特徵樣本呢?經常使用的方法有兩種。orm

    第一種是聚類,好比咱們能夠用KMeans聚類將訓練樣本分紅若干個簇,若是某一個簇裏的樣本數不多,並且簇質心和其餘全部的簇都很遠,那麼這個簇裏面的樣本極有多是異常特徵樣本了。咱們能夠將其從訓練集過濾掉。數據分析

    第二種是異常點檢測方法,主要是使用iForest或者one class SVM,使用異常點檢測的機器學習算法來過濾全部的異常點。pandas

    固然,某些篩選出來的異常樣本是否真的是不須要的異常特徵樣本,最好找懂業務的再確認一下,防止咱們將正常的樣本過濾掉了。

3、處理不平衡數據

    這個問題其實不算特徵預處理的部分,不過其實它的實質仍是訓練集中各個類別的樣本的特徵分佈不一致的問題,因此這裏咱們一塊兒講。

    咱們作分類算法訓練時,若是訓練集裏的各個類別的樣本數量不是大約相同的比例,就須要處理樣本不平衡問題。也許你會說,不處理會怎麼樣呢?若是不處理,那麼擬合出來的模型對於訓練集中少樣本的類別泛化能力會不好。舉個例子,咱們是一個二分類問題,若是訓練集裏A類別樣本佔90%,B類別樣本佔10%。 而測試集裏A類別樣本佔50%, B類別樣本佔50%, 若是不考慮類別不平衡問題,訓練出來的模型對於類別B的預測準確率會很低,甚至低於50%。

    如何解決這個問題呢?通常是兩種方法:權重法或者採樣法。

    權重法是比較簡單的方法,咱們能夠對訓練集裏的每一個類別加一個權重class weight。若是該類別的樣本數多,那麼它的權重就低,反之則權重就高。若是更細緻點,咱們還能夠對每一個樣本加權重sample weight,思路和類別權重也是同樣,即樣本數多的類別樣本權重低,反之樣本權重高。sklearn中,絕大多數分類算法都有class weight和 sample weight可使用。

    若是權重法作了之後發現預測效果還很差,能夠考慮採樣法。

    採樣法經常使用的也有兩種思路,一種是對類別樣本數多的樣本作子採樣, 好比訓練集裏A類別樣本佔90%,B類別樣本佔10%。那麼咱們能夠對A類的樣本子採樣,直到子採樣獲得的A類樣本數和B類別現有樣本一致爲止,這樣咱們就只用子採樣獲得的A類樣本數和B類現有樣本一塊兒作訓練集擬合模型。第二種思路是對類別樣本數少的樣本作過採樣, 仍是上面的例子,咱們對B類別的樣本作過採樣,直到過採樣獲得的B類別樣本數加上B類別原來樣本一塊兒和A類樣本數一致,最後再去擬合模型。

    上述兩種經常使用的採樣法很簡單,可是都有個問題,就是採樣後改變了訓練集的分佈,可能致使泛化能力差。因此有的算法就經過其餘方法來避免這個問題,好比SMOTE算法經過人工合成的方法來生成少類別的樣本。方法也很簡單,對於某一個缺乏樣本的類別,它會隨機找出幾個該類別的樣本,再找出最靠近這些樣本的若干個該類別樣本,組成一個候選合成集合,而後在這個集合中不停的選擇距離較近的兩個樣本,在這兩個樣本之間,好比中點,構造一個新的該類別樣本。舉個例子,好比該類別的候選合成集合有兩個樣本\((x_1,y),(x_2,y)\),那麼SMOTE採樣後,能夠獲得一個新的訓練樣本\((\frac{x_1+x_2}{2},y)\),經過這種方法,咱們能夠獲得不改變訓練集分佈的新樣本,讓訓練集中各個類別的樣本數趨於平衡。咱們能夠用imbalance-learn這個Python庫中的SMOTEENN類來作SMOTE採樣。

4、結語

    特徵工程系列終於寫完了,這個系列的知識比較零散,更偏向工程方法,因此不像算法那麼緊湊,寫的也不是很好,但願你們批評指正。若是有其餘好的特徵工程方法須要補充的,歡迎留言評論。

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)

相關文章
相關標籤/搜索