參加kaggle的都知道,特征處理比跑模型重要的多,在特征處理上的時間也更多,這里總結一下常見的特征處理方法,在書上或者博客上看見一些比較好的處理特征的方法,我就總結在這里,並注明出處,持續更新。。。
先看看特征工程的總體,下面這幅圖來自一次kaggle的特征工程總結,后面的總結不像這幅圖系統,但是我會做到盡量分類,盡量系統。

離散型特征
離散型的值出現次數少
如果某一列是離散型特征,而且這一列有些值出現的次數非常小(經常要對離散型特征的值統計一下次數,才能判斷多小才是小),我們可以把這些值統一給一個值,例如Rare,在kaggle泰坦尼克號里面,就可以這么對人姓名的title這么處理。
去掉取值變化小的特征
這應該是最簡單的特征選擇方法了:假設某特征的特征值只有0和1,並且在所有輸入樣本中,95%的實例的該特征取值都是1,那就可以認為這個特征作用不大。如果100%都是1,那這個特征就沒意義了。當特征值都是離散型變量的時候這種方法才能用,如果是連續型變量,就需要將連續變量離散化之后才能用,而且實際當中,一般不太會有95%以上都取某個值的特征存在,所以這種方法雖然簡單但是不太好用。可以把它作為特征選擇的預處理,先去掉那些取值變化小的特征,然后再從接下來提到的的特征選擇方法中選擇合適的進行進一步的特征選擇。摘自干貨:結合Scikit-learn介紹幾種常用的特征選擇方法
Label Encoding vs One Hot Encoding
參加我的這篇博客Label Encoding vs One Hot Encoding
連續型特征
連續型特征映射成離散型
連續型特征在kaggle里常常被映射成離散型特征,具體的分析可以看我的博客機器學習模型為什么要將特征離散化。
是否歸一化或者標准化
一般來說,連續型特征常常要做歸一化或者標准化處理,但是假如你把特征映射成了離散型特征,那這個歸一化或標准化處理可做可不做(一般可做可不做,就是不做,不然要增加計算量)。
缺失值處理
缺失值處理常見方法
用平均數、眾數、K最近鄰平均數等來賦值,要是離散型特征,可以直接用pandas的fillna()來填“missing”,然后做Label Encoding或者One Hot Encoding。
特征選擇
特征選擇的方法
這里的特征選擇僅僅是篩選特征,不包括降維。
按照周志華版的機器學習的第11章,他把特征選擇的方法總結成了三類:過濾式,包裹式和嵌入式。(注:過濾式和包裹式的處理方式挺少見)
過濾式
過濾式方法先對數據集進行特征選擇,然后再訓練學習器,特征選擇過程和后續的學習器無關。選擇過程有前向搜索和后向搜索,評價標准有子集的信息增益,相關統計量(周志華書)和擬合優度判定系數(ISLR)。
包裹式
包裹式特征選擇是把學習器的性能作為特征子集的評價標准。一般來說,包裹式特征選擇比過濾式更好(因為過濾式特征選擇不考慮后續的學習器的性能),但是計算開銷上卻比過濾式大得多。
嵌入式
嵌入式特征選擇是將特征選擇和學習器訓練過程融合一體,兩者在同一個優化過程中完成,常見的有L1正則化和L2正則化,但是L1正則化能更易獲得一個稀疏的解。
單變量特征選擇
單變量特征選擇能夠對每一個特征進行測試,衡量該特征和響應變量之間的關系,根據得分扔掉不好的特征。對於回歸和分類問題可以采用卡方檢驗,皮爾遜相關系數等方式對特征進行測試。
這種方法比較簡單,易於運行,易於理解,通常對於理解數據有較好的效果(但對特征優化、提高泛化能力來說不一定有效);這種方法有許多改進的版本、變種。摘自干貨:結合Scikit-learn介紹幾種常用的特征選擇方法 。
降維
降維的方法
一般經過One Hot Encoding后,矩陣的維度可能會變的很大,此時一般需要進行降維的操作,常見的降維方法有PCA,更多的方法可以看看我的博客機器學習降維方法總結。
特征構造
構造新特征的方法
泰坦尼克號比賽里面常用的一個構造新特征的方法是把兄弟姐妹的數量,伴侶的數據,父母子女的數量加起來,構造成一個新的特征:家庭的大小。
除了上面的直接相加,還有構造多項式特征(特征相乘)等。
