機器學習sklearn(46): 特征工程(十三) 特征選擇(四)簡介 /Filter過濾法


當數據預處理完成后,我們就要開始進行特征工程了。

 

 

 

#導入數據,讓我們使用digit recognizor數據來一展身手
import pandas as pd
data = pd.read_csv(r"C:\work\learnbetter\micro-class\week 3 Preprocessing\digit recognizor.csv") 
X = data.iloc[:,1:]
y = data.iloc[:,0]
X.shape
""" 這個數據量相對誇張,如果使用支持向量機和神經網絡,很可能會直接跑不出來。使用KNN跑一次大概需要半個小時。 用這個數據舉例,能更夠體現特征工程的重要性。 """

1 Filter過濾法

過濾方法通常用作預處理步驟,特征選擇完全獨立於任何機器學習算法。它是根據各種統計檢驗中的分數以及相關性的各項指標來選擇特征。 
1.1 方差過濾
1.1.1 VarianceThreshold

from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold() #實例化,不填參數默認方差為0
X_var0 = selector.fit_transform(X) #獲取刪除不合格特征之后的新特征矩陣
#也可以直接寫成 X = VairanceThreshold().fit_transform(X)
X_var0.shape

import numpy as np
X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X) 
X.var().values np.median(X.var().values) X_fsvar.shape

 

 

#若特征是伯努利隨機變量,假設p=0.8,即二分類特征中某種分類占到80%以上的時候刪除特征
X_bvar = VarianceThreshold(.8 * (1 - .8)).fit_transform(X)
X_bvar.shape
1.1.2 方差過濾對模型的影響

1. 導入模塊並准備數據 
#KNN vs 隨機森林在不同方差過濾效果下的對比
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.neighbors import KNeighborsClassifier as KNN
from sklearn.model_selection import cross_val_score
import numpy as np
X = data.iloc[:,1:]
y = data.iloc[:,0]
X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X)

2. KNN方差過濾前 
#======【TIME WARNING:35mins +】======#
cross_val_score(KNN(),X,y,cv=5).mean()
#python中的魔法命令,可以直接使用%%timeit來計算運行這個cell中的代碼所需的時間
#為了計算所需的時間,需要將這個cell中的代碼運行很多次(通常是7次)后求平均值,因此運行%%timeit的時間會
遠遠超過cell中的代碼單獨運行的時間
#======【TIME WARNING:4 hours】======#
%%timeit
cross_val_score(KNN(),X,y,cv=5).mean()

3. KNN方差過濾后 
#======【TIME WARNING:20 mins+】======#
cross_val_score(KNN(),X_fsvar,y,cv=5).mean()
#======【TIME WARNING:2 hours】======#
%%timeit
cross_val_score(KNN(),X,y,cv=5).mean()
cross_val_score(RFC(n_estimators=10,random_state=0),X,y,cv=5).mean()

4. 隨機森林方差過濾前 
cross_val_score(RFC(n_estimators=10,random_state=0),X,y,cv=5).mean()

5. 隨機森林方差過濾后
cross_val_score(RFC(n_estimators=10,random_state=0),X_fsvar,y,cv=5).mean()

 

 

 

對受影響的算法來說,我們可以將方差過濾的影響總結如下:

 

 

 

1.1.3 選取超參數threshold

1.2 相關性過濾

1.2.1 卡方過濾

 

 

from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#假設在這里我一直我需要300個特征
X_fschi = SelectKBest(chi2, k=300).fit_transform(X_fsvar, y)
X_fschi.shape
驗證一下模型的效果如何: 
cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()

1.2.2 選取超參數K

 

 

#======【TIME WARNING: 5 mins】======#
%matplotlib inline
import matplotlib.pyplot as plt
score = []
for i in range(390,200,-10):
    X_fschi = SelectKBest(chi2, k=i).fit_transform(X_fsvar, y)
    once = cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()
    score.append(once)
plt.plot(range(350,200,-10),score)
plt.show()

 

 

chivalue, pvalues_chi = chi2(X_fsvar,y)
chivalue
pvalues_chi
#k取多少?我們想要消除所有p值大於設定值,比如0.05或0.01的特征:
k = chivalue.shape[0] - (pvalues_chi > 0.05).sum()
#X_fschi = SelectKBest(chi2, k=填寫具體的k).fit_transform(X_fsvar, y)
#cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()

 

 

from sklearn.feature_selection import f_classif
F, pvalues_f = f_classif(X_fsvar,y) 
F pvalues_f k
= F.shape[0] - (pvalues_f > 0.05).sum() #X_fsF = SelectKBest(f_classif, k=填寫具體的k).fit_transform(X_fsvar, y) #cross_val_score(RFC(n_estimators=10,random_state=0),X_fsF,y,cv=5).mean()

1.2.4 互信息法

from sklearn.feature_selection import mutual_info_classif as MIC
result = MIC(X_fsvar,y) k = result.shape[0] - sum(result <= 0)
#X_fsmic = SelectKBest(MIC, k=填寫具體的k).fit_transform(X_fsvar, y)
#cross_val_score(RFC(n_estimators=10,random_state=0),X_fsmic,y,cv=5).mean()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM