機器學習中的特徵選擇及其Python舉例

1.關於特徵選擇

簡單來說,特徵選擇就是在你使用機器學習算法之前,通過相關處理來選擇與你的預測變量或者輸出結果,最有用或最相關的那些特徵。它是特徵工程的一部分,在機器學習中,我們通常會面臨非常多的特徵變量,幾十個甚至上百個。對於這些特徵,一方面全部納入機器學習算法中會導致計算機開銷很大,影響訓練效率,另一方面,部分特徵並不與預測變量有太大相關,納入算法中反而會降低模型的準確性,特別是在線性迴歸、邏輯迴歸等算法中。 

特徵選擇的好處有:

減少過度擬合:減少冗餘數據意味着根據噪聲做出決策的機會減少。

提高準確度:減少誤導性數據意味着提高建模精度。

縮短訓練時間:減少數據意味着算法訓練更快。

2.機器學習中的特徵選擇方案以及Python舉例

下面以python的sklearn中自帶iris鳶尾花數據集爲例,來簡單演示一些特徵選擇的案例以及Python實現。該數據集是個二分類問題,且所有屬性都是數字。

(1)單變量選擇

我們可以採用統計中的一些檢驗來選擇與輸出變量最相關的那些特徵。比如以卡方檢驗來檢驗與數據集預測變量(類別)的最佳特徵。

其基本思想:通過觀察實際值和理論值的偏差來確定原假設是否成立。首先假設兩個變量是獨立的(此爲原假設),然後觀察實際值和理論值之間的偏差程度,若偏差足夠小,則認爲偏差是很自然的樣本誤差,接受原假設。若偏差大到一定程度,則否則原假設,接受備擇假設。

在這裏採用卡方檢驗來選擇與class關係最強的變量。


import pandas as pd
import numpy as np
from sklearn.feature_selection import SelectKBest #導入SelectKBest庫
from sklearn.feature_selection import chi2 #導入卡方檢驗 names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pd.read_csv("D:\\diabetes.csv", names=names) #讀取數據集 dataframe.head() array = dataframe.values
print(X[0:5,:]) #打印前5行
X = array[:,0:8] #選取前8列爲特徵變量
Y = array[:,8] #選取class爲目標變量

輸出結果爲:
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]]


test = SelectKBest(score_func=chi2, k=2) #設置卡方檢驗,選擇k=2個最佳特徵
fit = test.fit(X, y) #進行檢驗 print(fit.scores_) #打印卡方檢驗值
print(features[0:2,:]) #打印前2行
features = fit.transform(X) #返回選擇特徵後的數據

輸出結果爲:
[ 10.81782088 3.59449902 116.16984746 67.24482759]
[[1.4 0.2]
[1.4 0.2]]

可以看到篩選X的最後兩列爲最優變量。

(2)遞歸特徵消除法

遞歸消除特徵法使用一個基模型來進行多輪訓練,每輪訓練後,消除若干權值係數的特徵,再基於新的特徵集進行下一輪訓練。它使用模型精度來識別哪些屬性(和屬性組合)對預測目標屬性的貢獻最大。可以通過sklearn庫中的RFE來實現。


from sklearn.feature_selection import RFE #導入RFE庫
from sklearn.linear_model import LogisticRegression #導入邏輯迴歸庫
model = LogisticRegression() #設置算法爲邏輯迴歸
fit = rfe.fit(X, y) #進行RFE遞歸
rfe = RFE(model, 2) #選擇2個最佳特徵變量,並進行RFE print(fit.n_features_) #打印最優特徵變量數
print(fit.ranking_) #特徵消除排序
print( fit.support_) #打印選擇的最優特徵變量

輸出結果爲:
2
[False True False True]
[3 1 2 1]

可以看到X變量的第2、第4列選爲最優變量,即True。最後的[3 1 2 1]也是說明第2、第4列保留到最後。

(3)主成分分析法

主成分分析法是一種降維技術,不同於前邊兩種方法,他不消除變量,而是通過變量之間的方差、協方差,吸收最有效信息,通過變量線性組合而成,原轉換爲維度較小的幾個變量。可以通過sklearn庫中的PCA來實現。


from sklearn.decomposition import PCA #導入主成分分析庫
pca = PCA(n_components=2) #提取出2個變量
print(fit.explained_variance_ratio_) #方差貢獻率
fit = pca.fit(X) #模型訓練
print(fit.components_) #得到的主成分

輸出結果爲:
[0.92461621 0.05301557]
[[ 0.36158968 -0.08226889 0.85657211 0.35884393]
[ 0.65653988 0.72971237 -0.1757674 -0.07470647]]
[0.92461621 0.05301557]是X變量轉換爲2個新變量的方差貢獻率,下邊兩行的得到兩個新變量的載荷矩陣。

(4)基於樹模型的特徵選擇

可以採用隨機森林的算法,通過樹的模型訓練可以計算每一個屬性的重要性。重要性的值可以幫助我們選擇出重要的特徵。sklearn.ensemble模塊包含了兩種基於隨機決策樹的平均算法:RandomForest算法和Extra-Trees算法。這裏使用Extra-Trees算法。


from sklearn.ensemble import ExtraTreesClassifier #導入ExtraTrees
model = ExtraTreesClassifier() #設置ExtraTrees model.fit(X, y)
print(model.feature_importances_) #得到特徵變量的重要性值

輸出結果爲:
[0.02757014 0.04987713 0.58655833 0.33599439]

我們可以根據不同特徵變量的重要性的值,來選擇最佳變量。

以上是一些特徵選擇的簡單舉例,在實際應用中還有很多其他方法,比如相關係數法、互信息法等等。另外,對於鳶尾花數據集來說,其變量屬性並不多,且每個變量都有其作用,所以在實際中還需結合更多情況去應用。


原文發佈時間爲:2018-11-24

本文作者:博觀厚積

本文來自雲棲社區合作伙伴“Python愛好者社區”,瞭解相關信息可以關注“Python愛好者社區”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章