【機器學習】:特徵工程
我總結了以下特徵工程的一些方法,好的資料和特徵往往在資料探勘當中會給我們帶來更好的acc,尤其對於資料探勘而言。資料決定了預測準確度的上線,而模型的目的則是去儘量逼近這個上限。由此可見,對資料進行特徵工程,擁有良好的資料是多麼的重要。
對於特徵工程而言,我們一般會對類別型資料或者數值型資料進行相應的編碼。下面我們首先來看看對類別型資料進行編碼:
一.one-hot編碼
形式:one-hot編碼是以one of k的形式。
用途:在所有的線性模型,nlp的詞彙也可以用這種方式進行編碼,樹模型不適合
優點:簡單,可以對所有類別型資料進行編碼
缺點:會帶來維度爆炸(如果屬性的類別過多,那麼經過one hot處理之後,會產生2^n個新的維度)和特徵稀疏(因為會出現很多0)
實現方法:
1.在pandas中使用:get_dummies
2.在sklearn中使用OneHotEncode
如下圖所示:
二.Label Encoding 標籤編碼
形式:將每個類別資料使用獨立的數字IDj進行編碼
用途:在樹模型當中比較適合
優點:簡單,不增加類別的維度
缺點:會改變原始標籤的類別次序,one-hot不會具有大小關係
實現方法;
sklearn的labelencoder
pandas中的factorize
如下圖所示:
在lightbgm和catboost當中會指定類別型別,當然在xgboost/lightbgm的後續版本當總已經不需要使用labelencoder,會自動對已經是數值型的類別資料進行相應的處理
三.順序編碼
形式:按照類別的大小關係進行編碼
用途:在大部分場景都適用
優點;簡單,不會增加類別的維度
缺點:需要人工知識
實現方法:手動定義字典進行對映
使用程式碼如下所示:
四.Frequency Encoding, Count Encoding
形式:按照類別出現的次數和頻率進行編碼(做的優先順序低於前面的encoding)
用途:在大部分場景都適用
優點;簡單,可以統計類別的次數,從一列的角度進行統計,模型可以學習到頻率的資訊
缺點:容易收到類別分佈帶來的影響,比如train 和test的類別分佈頻率是不一樣的,那麼對test預測結果可能就沒有那麼準確,acc不升反降。
實現方法:使用次數進行統計
使用程式碼如下所示:
五. Mean/Target Encoding
形式:將類別對應的標籤概率進行相應的編碼,比如某個country在某個target下出現的概率大小。example:
country為china,target為0或者1,那麼概率為0.5 。如果target為0,1,2,則概率為1/3
用途:在大部分場景都適用
優點;讓模型能夠學習到標籤之間相互的一個資訊
缺點:容易過擬合,因為比如target只有一個數值,china對應的這一個數值1的概率也永遠為1,相當於把country=china這個數值洩漏了出去。造成過擬合
實現方法:使用次數進行統計
下面我們進行數值型資料的特徵工程:
一.Round
形式:將數值進行縮放,取整
用途:在大部分場景都適用
優點:可以保留數值的大部分資訊
二.資料的分箱
特點:將連續的特徵離散化
備註:其實cart迴歸樹(決策樹/xgboost/gbdt當中均使用)自動也會幫我們形成一個最優的資料分箱策略,使用的是均方誤差來進行的衡量,有的時候可能還比我們手動做資料的分箱更加管用
程式碼如下所示: