1.關(guān)于特征選擇
簡單來說苟蹈,特征選擇就是在你使用機器學(xué)習(xí)算法之前糊渊,通過相關(guān)處理來選擇與你的預(yù)測變量或者輸出結(jié)果,最有用或最相關(guān)的那些特征慧脱。它是特征工程的一部分渺绒,在機器學(xué)習(xí)中,我們通常會面臨非常多的特征變量菱鸥,幾十個甚至上百個宗兼。對于這些特征,一方面全部納入機器學(xué)習(xí)算法中會導(dǎo)致計算機開銷很大氮采,影響訓(xùn)練效率殷绍,另一方面,部分特征并不與預(yù)測變量有太大相關(guān)鹊漠,納入算法中反而會降低模型的準確性主到,特別是在線性回歸、邏輯回歸等算法中躯概。
特征選擇的好處有:
減少過度擬合:減少冗余數(shù)據(jù)意味著根據(jù)噪聲做出決策的機會減少登钥。
提高準確度:減少誤導(dǎo)性數(shù)據(jù)意味著提高建模精度。
縮短訓(xùn)練時間:減少數(shù)據(jù)意味著算法訓(xùn)練更快娶靡。
2.機器學(xué)習(xí)中的特征選擇方案以及Python舉例
下面以python的sklearn中自帶iris鳶尾花數(shù)據(jù)集為例牧牢,來簡單演示一些特征選擇的案例以及Python實現(xiàn)。該數(shù)據(jù)集是個二分類問題,且所有屬性都是數(shù)字塔鳍。
(1)單變量選擇
我們可以采用統(tǒng)計中的一些檢驗來選擇與輸出變量最相關(guān)的那些特征伯铣。比如以卡方檢驗來檢驗與數(shù)據(jù)集預(yù)測變量(類別)的最佳特征。
其基本思想:通過觀察實際值和理論值的偏差來確定原假設(shè)是否成立轮纫。首先假設(shè)兩個變量是獨立的(此為原假設(shè))腔寡,然后觀察實際值和理論值之間的偏差程度,若偏差足夠小蜡感,則認為偏差是很自然的樣本誤差蹬蚁,接受原假設(shè)。若偏差大到一定程度郑兴,則否則原假設(shè)犀斋,接受備擇假設(shè)。
在這里采用卡方檢驗來選擇與class關(guān)系最強的變量情连。
import pandas as pd
import numpy as np
from sklearn.feature_selection import SelectKBest #導(dǎo)入SelectKBest庫
from sklearn.feature_selection import chi2 #導(dǎo)入卡方檢驗
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pd.read_csv("D:\\diabetes.csv", names=names) #讀取數(shù)據(jù)集
dataframe.head()
array = dataframe.values
X = array[:,0:8] #選取前8列為特征變量
Y = array[:,8] #選取class為目標變量
print(X[0:5,:]) #打印前5行
輸出結(jié)果為:
[[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) #設(shè)置卡方檢驗叽粹,選擇k=2個最佳特征
fit = test.fit(X, y) #進行檢驗
print(fit.scores_) #打印卡方檢驗值
features = fit.transform(X) #返回選擇特征后的數(shù)據(jù)
print(features[0:2,:]) #打印前2行
輸出結(jié)果為:
[ 10.81782088 3.59449902 116.16984746 67.24482759]
[[1.4 0.2]
[1.4 0.2]]
可以看到篩選X的最后兩列為最優(yōu)變量。
(2)遞歸特征消除法
遞歸消除特征法使用一個基模型來進行多輪訓(xùn)練却舀,每輪訓(xùn)練后虫几,消除若干權(quán)值系數(shù)的特征,再基于新的特征集進行下一輪訓(xùn)練挽拔。它使用模型精度來識別哪些屬性(和屬性組合)對預(yù)測目標屬性的貢獻最大辆脸。可以通過sklearn庫中的RFE來實現(xiàn)螃诅。
from sklearn.feature_selection import RFE #導(dǎo)入RFE庫
from sklearn.linear_model import LogisticRegression #導(dǎo)入邏輯回歸庫
model = LogisticRegression() #設(shè)置算法為邏輯回歸
rfe = RFE(model, 2) #選擇2個最佳特征變量啡氢,并進行RFE
fit = rfe.fit(X, y) #進行RFE遞歸
print(fit.n_features_) #打印最優(yōu)特征變量數(shù)
print( fit.support_) #打印選擇的最優(yōu)特征變量
print(fit.ranking_) #特征消除排序
輸出結(jié)果為:
2
[False True False True]
[3 1 2 1]
可以看到X變量的第2、第4列選為最優(yōu)變量术裸,即True倘是。最后的[3 1 2 1]也是說明第2、第4列保留到最后袭艺。
(3)主成分分析法
主成分分析法是一種降維技術(shù)搀崭,不同于前邊兩種方法,他不消除變量猾编,而是通過變量之間的方差瘤睹、協(xié)方差,吸收最有效信息答倡,通過變量線性組合而成默蚌,原轉(zhuǎn)換為維度較小的幾個變量∥郏可以通過sklearn庫中的PCA來實現(xiàn)。
from sklearn.decomposition import PCA #導(dǎo)入主成分分析庫
pca = PCA(n_components=2) #提取出2個變量
fit = pca.fit(X) #模型訓(xùn)練
print(fit.explained_variance_ratio_) #方差貢獻率
print(fit.components_) #得到的主成分
輸出結(jié)果為:
[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變量轉(zhuǎn)換為2個新變量的方差貢獻率,下邊兩行的得到兩個新變量的載荷矩陣设江。
(4)基于樹模型的特征選擇
可以采用隨機森林的算法锦茁,通過樹的模型訓(xùn)練可以計算每一個屬性的重要性。重要性的值可以幫助我們選擇出重要的特征儿捧。sklearn.ensemble模塊包含了兩種基于隨機決策樹的平均算法:RandomForest算法和Extra-Trees算法延窜。這里使用Extra-Trees算法纵东。
from sklearn.ensemble import ExtraTreesClassifier #導(dǎo)入ExtraTrees
model = ExtraTreesClassifier() #設(shè)置ExtraTrees
model.fit(X, y)
print(model.feature_importances_) #得到特征變量的重要性值
輸出結(jié)果為:
[0.02757014 0.04987713 0.58655833 0.33599439]
我們可以根據(jù)不同特征變量的重要性的值,來選擇最佳變量稿存。
以上是一些特征選擇的簡單舉例,在實際應(yīng)用中還有很多其他方法瞳秽,比如相關(guān)系數(shù)法瓣履、互信息法等等。另外练俐,對于鳶尾花數(shù)據(jù)集來說袖迎,其變量屬性并不多,且每個變量都有其作用腺晾,所以在實際中還需結(jié)合更多情況去應(yīng)用燕锥。