用特徵選擇方法優化模型|python數據挖掘思考筆記(1)
為什麼要進行特徵選擇?
我們並沒有辦法把客觀實體,塞進一個演算法如決策樹,隨機森林,SVM等,得到一個結果。
所以需要對客觀世界對象建立近似模型,模型以機器挖掘演算法能夠理解的近似的方式來表示客觀對象。而特徵可用於建模,只有先把客觀對象用特徵表示出來,才能藉助數據挖掘的力量找到問題的答案。
也就是說模型描述了客觀世界對象的某些方面,是客觀世界對象的一個簡化版本。它降低真實世界的複雜度,讓問題有了被解決的可能性。
然而通常情況下,特徵數量很多,但我們只想選用其中一小部分。有如下幾個原因:
- 降低複雜度:隨著特徵數量的增加,很多數據挖掘演算法需要更多的時間和資源。減少特徵數量,是提高演算法運行速度,減少資源使用的好方法。
- 降低噪音:增加額外特徵並不總會提升演算法的表現。額外特徵可能擾亂演算法的正常工作,這些額外特徵間的相關性和模式沒有實際應用價值(這種情況在小數據集上很常見)。只選擇合適的特徵有助於減少出現沒有實際意義的相關性的幾率。
- 增加模型可讀性:根據成千上萬個特徵創建的模型來解答一個問題,對計算機來說很容易,但模型對我們自己來說就晦澀無比。因此,使用更少的特徵,創建我們自己可以理解的模型,就很有必要。
然而,選擇合適的特徵是項技術活,需要考慮特徵和最終結果之間的相互關係——例如,身高這個特徵描述的是一個人外表的某個方面,但是不能說明這個人學習成績如何,所以預測學習成績時,我們沒必要去測量每個人的身高。
什麼是特徵選擇?
特徵選擇( Feature Selection )也稱特徵子集選擇( Feature Subset Selection , FSS ),或屬性選擇( Attribute Selection )。是指從已有的M個特徵(Feature)中選擇N個特徵使得系統的特定指標最優化,是從原始特徵中選擇出一些最有效特徵以降低數據集維度的過程,是提高學習演算法性能的一個重要手段,也是模式識別中關鍵的數據預處理步驟。對於一個學習演算法來說,好的學習樣本是訓練模型的關鍵。(來源於百度百科)
特徵選擇的方法:
數據驅動:分析手上已有的訓練數據,得出哪些x裡面的特徵對預測y最重要的。主要的四大種類方法如下:
- 方差選擇法:使用方差選擇法,先要計算各個特徵的方差,然後根據閾值,選擇方差大於閾值的特徵。
scikit-learn 中的 VarianceThreshold 轉換器可用來刪除特徵值的方差達不到最低標準的特徵。
#創建簡單矩陣(10個個體、3個特徵的數據集)import numpy as npX = np.arange(30).reshape((10, 3))X#輸出:array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19, 20], [21, 22, 23], [24, 25, 26], [27, 28, 29]])#把所有第二列的數值都改為1X[:,1] = 1X#輸出:array([[ 0, 1, 2], [ 3, 1, 5], [ 6, 1, 8], [ 9, 1, 11], [12, 1, 14], [15, 1, 17], [18, 1, 20], [21, 1, 23], [24, 1, 26], [27, 1, 29]])#第二列方差為0,而第一、三列特徵值方差很大#來創建 VarianceThreshold 轉換器,用它處理數據集from sklearn.feature_selection import VarianceThresholdvt = VarianceThreshold()Xt = vt.fit_transform(X)Xt#輸出:array([[ 0, 2], [ 3, 5], [ 6, 8], [ 9, 11], [12, 14], [15, 17], [18, 20], [21, 23], [24, 26], [27, 29]])#輸出每一列的方差print(vt.variances_)#輸出:[ 74.25 0. 74.25]
方差為0的特徵不但對數據挖掘沒有絲毫用處,相反還會拖慢演算法的運行速度。無論什麼時候,拿到數據後,先做下類似簡單、直接的分析,對數據集的特點做到心中有數。
- 相關性:考察在我們已有的數據裡面的特徵x與預測值y的相關度
特徵很多的情況下,一般是去找表現好的單個特徵(單變數),依據是它們各自所能達到的精確度。分類任務通常是這麼做的,我們一般只要測量變數和目標類別之間的某種相關性就行。
單個特徵和某一類別之間相關性的計算方法有很多。最常用的有卡方檢驗(χ2)。其他方法還有互信息和信息熵。
經典的卡方檢驗是檢驗定性自變數對定性因變數的相關性。
#scikit-learn 提供了幾個用於選擇單變數特徵的轉換器,#其中 SelectKBest 返回k個最佳特徵, SelectPercentile 返回表現最佳的前r%個特徵。from sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2transformer = SelectKBest(score_func=chi2, k=n)Xt_chi2 = transformer.fit_transform(X, y)print(transformer.scores_)
在自然科學領域中,Pearson係數廣泛用於度量兩個變數之間的相關程度,其值介於-1與1之間。-1表示完全的負相關,1表示完全的正相關,0表示沒有線性相關。
Pearson Correlation速度快、易於計算,經常在拿到數據(經過清洗和特徵提取之後的)之後第一時間就執行。
from scipy.stats import pearsonr# pearsonr(x, y)的輸入為特徵矩陣和目標向量pearsonr(x,y)# 輸出為二元組(score, p-value)的數組(score, p-value)
Pearson相關係數的一個明顯缺陷是,作為特徵排序機制,他只對線性關係敏感。如果關係是非線性的,即便兩個變數具有一一對應的關係,Pearson相關性也可能會接近0
- 迭代刪除(增加):確定要使用哪個演算法後,選擇最合適的訓練子集,從而使得模型的效果最好
- 基於模型:通過隨機森林等可以直接得出每個訓練特徵的重要性的模型;或者是在進行預測時加入的一些正則化調整,引起的對特徵的篩選,從而挑選出最重要的特徵
領域專家:挑選好的特徵離不開直覺,這需要需要專業領域知識和數據挖掘經驗。
有時,僅僅選擇已有特徵不夠用。這時,我們就可以用不同的方法從已有特徵中發掘新特徵,比如連續特徵離散化,數值特徵轉化為分類特徵,分類特徵轉化為數值特徵等。
參考文章:
一次kaggle的特徵工程總結
預測型數據分析:用特徵選擇方法優化模型
參考書籍:《Python數據挖掘入門與實踐》,人民郵電出版社
推薦閱讀:
※推薦相關梳理
※Python 數據分析(五):數據的處理
※明略數據的2018「行星計劃」是啥?
※大數據看190部國產片,年輕人的觀影口味發生了這些變化
※2017年歷史文章匯總|機器學習