1. 程式人生 > 其它 >scikit基礎與機器學習入門(7)特徵的選擇

scikit基礎與機器學習入門(7)特徵的選擇

選擇特徵有以下兩方面依據:

特徵是否發散:如果一個特徵不發散,例如方差接近於0,也就是說樣本在這個特徵上基本上沒有差異,這個特徵對於樣本的區分並沒有什麼用。

特徵與目標的相關性:這點比較顯見,與目標相關性高的特徵,應當優選選擇。除方差法外,本文介紹的其他方法均從相關性考慮。

根據特徵選擇的形式又可以將特徵選擇方法分為3種:

  • Filter:過濾法,按照發散性或者相關性對各個特徵進行評分,設定閾值或者待選擇閾值的個數,選擇特徵。
  • Wrapper:包裝法,根據目標函式(通常是預測效果評分),每次選擇若干特徵,或者排除若干特徵。
  • Embedded:嵌入法,先使用某些機器學習的演算法和模型進行訓練,得到各個特徵的權值係數,根據係數從大到小選擇特徵。類似於Filter方法,但是是通過訓練來確定特徵的優劣。

Filter過濾法

基於方差進行過濾

VarianceThreshold(threshold=3),方差選擇法,返回值為特徵選擇後的資料,引數threshold為方差的閾值

from sklearn import datasets
from sklearn.feature_selection import VarianceThreshold

vardata = VarianceThreshold(threshold=3).fit_transform(iris.data)
print(vardata[:10])
#print(iris.data)

基於皮爾遜係數進行過濾

相關係數通常只適合於連續特徵的選擇

第一個引數為計算評估特徵是否好的函式,

第二個引數K表示選擇K個最好的特徵,返回選擇特徵後的資料

該函式輸入特徵矩陣和目標向量,輸出二元組(評分,P值)的陣列,陣列第i項為第i個特徵的評分和P值。

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
import numpy as np
f = lambda X, Y:np.array(list(map(lambda x:pearsonr(x, Y)[0], X.T))).T
SelectKBest(f,k=2).fit_transform(iris.data, iris.target)[:10]

基於卡方檢驗進行過濾

經典的卡方檢驗是檢驗定性自變數定性因變數的相關性。假設自變數有N種取值,因變數有M種取值,考慮自變數等於i且因變數等於j的樣本頻數的觀察值與期望的差距,構建統計量:

\[\chi^{2}=\sum\frac{(A-E)^{2}}{E^{2}} \]
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#選擇K個最好的特徵,返回選擇特徵後的資料
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)[:10]

互資訊法

經典的互資訊也是評價定性自變數對定性因變數的相關性的。相關係數,卡方檢驗,互資訊法選擇特徵的原理是相似的。

import numpy as np
from sklearn.feature_selection import SelectKBest
from sklearn import metrics
mic = metrics.mutual_info_score
g = lambda X, Y: np.array(list(map(lambda x:mic(x, Y), X.T))).T
#選擇K個最好的特徵,返回特徵選擇後的資料
SelectKBest(g, k=2).fit_transform(iris.data, iris.target)[:10]

Wrapper包裝法

遞迴特徵消除法

遞迴消除特徵法使用一個基模型來進行多輪訓練,每輪訓練後,消除若干權值係數的特徵,再基於新的特徵集進行下一輪訓練。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#遞迴特徵消除法,返回特徵選擇後的資料
#引數estimator為基模型
#引數n_features_to_select為選擇的特徵個數
RFE(estimator=LogisticRegression(),
n_features_to_select=2).fit_transform(iris.data, iris.target)[:10]

Embedded嵌入法

基於L1和L2正則化的方法(Lasso迴歸和嶺迴歸)

使用帶懲罰項的基模型,除了篩選出特徵外,同時也進行了降維。使用feature_selection庫的SelectFromModel類結合帶L1懲罰項的邏輯迴歸模型,來選擇特徵的程式碼如下:

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
#帶L1懲罰項的邏輯迴歸作為基模型的特徵選擇
SelectFromModel(LogisticRegression(
penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)[:10]

L1懲罰項降維的原理在於保留多個對目標值具有同等相關性的特徵中的一個,所以沒選到的特徵不代表不重要。故,可結合L2懲罰項來優化。具體操作為:若一個特徵在L1中的權值為1,選擇在L2中權值差別不大且在L1中權值為0的特徵構成同類集合,將這一集合中的特徵平分L1中的權值,故需要構建一個新的邏輯迴歸模型:

基於樹模型的特徵選擇法

樹模型中GBDT也可用來作為基模型進行特徵選擇,使用feature_selection庫的SelectFromModel類,結合GBDT模型,來選擇特徵的程式碼如下:

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
#GBDT作為基模型的特徵選擇
SelectFromModel(GradientBoostingClassifier()
).fit_transform(iris.data, iris.target)[:10]
很喜歡聽到一個老師說的“半年理論”,現在做出的努力,一般要在半年的沉澱之後,才能出結果,所以在遇到瓶頸之時,不妨再努力半年