特徵工程之特徵預處理

2021-08-30 15:53:24 字數 2737 閱讀 3387

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

由於標準化和歸一化這兩個詞經常混用,所以本文不再區別標準化和歸一化,而通過具體的標準化和歸一化方法來區別具體的預處理操作。

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範數整體標準化也是可以的,具體方法是求出每個樣本特徵向量→xx→的l2範數∥→x∥2‖x→‖2,然後用→x/∥→x∥2x→/‖x→‖2代替原樣本特徵即可。當然l1範數標準化也是可以的,即用→x/∥→x∥1x→/‖x→‖1代替原樣本特徵。通常情況下,範數標準化首選l2範數標準化。在sklearn中,我們可以用normalizer來做l1/l2範數標準化。

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

雖然大部分機器學習模型都需要做標準化和歸一化,也有不少模型可以不做做標準化和歸一化,主要是基於概率分布的模型,比如決策樹大家族的cart,隨機森林等。當然此時使用標準化也是可以的,大多數情況下對模型的泛化能力也有改進。

我們在實際專案中拿到的資料往往有不少異常資料,有時候不篩選出這些異常資料很可能讓我們後面的資料分析模型有很大的偏差。那麼如果我們沒有專業知識,如何篩選出這些異常特徵樣本呢?常用的方法有兩種。

第一種是聚類,比如我們可以用kmeans聚類將訓練樣本分成若干個簇,如果某乙個簇裡的樣本數很少,而且簇質心和其他所有的簇都很遠,那麼這個簇裡面的樣本極有可能是異常特徵樣本了。我們可以將其從訓練集過濾掉。

第二種是異常點檢測方法,主要是使用iforest或者one class svm,使用異常點檢測的機器學習演算法來過濾所有的異常點。

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

這個問題其實不算特徵預處理的部分,不過其實它的實質還是訓練集中各個類別的樣本的特徵分布不一致的問題,所以這裡我們一起講。

我們做分類演算法訓練時,如果訓練集裡的各個類別的樣本數量不是大約相同的比例,就需要處理樣本不平衡問題。也許你會說,不處理會怎麼樣呢?如果不處理,那麼擬合出來的模型對於訓練集中少樣本的類別泛化能力會很差。舉個例子,我們是乙個二分類問題,如果訓練集裡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演算法通過人工合成的方法來生成少類別的樣本。方法也很簡單,對於某乙個缺少樣本的類別,它會隨機找出幾個該類別的樣本,再找出最靠近這些樣本的若干個該類別樣本,組成乙個候選合成集合,然後在這個集合中不停的選擇距離較近的兩個樣本,在這兩個樣本之間,比如中點,構造乙個新的該類別樣本。舉個例子,比如該類別的候選合成集合有兩個樣本(x1,y)(x1,y),(x2,y)(x2,y)那麼smote取樣後,可以得到乙個新的訓練樣本(x1+x22,y)(x1+x22,y),通過這種方法,我們可以得到不改變訓練集分布的新樣本,讓訓練集中各個類別的樣本數趨於平衡。我們可以用imbalance-learn這個python庫中的smoteenn類來做smote取樣。

本文**

劉建平pinard

特徵工程之特徵預處理

概念 特徵預處理是什麼呢?特徵預處理是通過統計方法 數學方法 將資料轉換成演算法要求的資料,所以特徵預處理也叫做資料預處理。下面是幾種資料預處理的方法 1 數值型資料 標準縮放 1 歸一化2 標準化 2 類別型資料 one hot編碼 3 時間類別 時間的劃分 下面介紹歸一化和標準化歸一化 歸一化 ...

特徵工程之特徵預處理

在前面我們分別討論了特徵工程中的特徵選擇與特徵表達,本文我們來討論特徵預處理的相關問題。主要包括特徵的歸一化和標準化,異常特徵樣本清洗與樣本資料不平衡問題的處理。1.特徵的標準化和歸一化 由於標準化和歸一化這兩個詞經常混用,所以本文不再區別標準化和歸一化,而通過具體的標準化和歸一化方法來區別具體的預...

特徵工程之特徵預處理

在前面我們分別討論了特徵工程中的特徵選擇與特徵表達,本文我們來討論特徵預處理的相關問題。主要包括特徵的歸一化和標準化,異常特徵樣本清洗與樣本資料不平衡問題的處理。由於標準化和歸一化這兩個詞經常混用,所以本文不再區別標準化和歸一化,而通過具體的標準化和歸一化方法來區別具體的預處理操作。z score標...