sklearn之特徵選擇

2021-10-03 04:26:53 字數 4746 閱讀 9888

嵌入法是一種讓演算法自己決定使用哪些特徵的方法,即特徵選擇和演算法訓練同時進行。在使用嵌入法時,我們先使用某些機器學習的演算法和全部特徵對模型進行訓練,得到各個特徵的權值係數,根據權值係數從大到小選擇特徵。這些權值係數往往代表了特徵對於模型的某種貢獻或某種重要性,比如決策樹和樹的整合模型中的feature_importances_屬性,可以列出各個特徵對樹的建立的貢獻,我們就可以基於這種貢獻的評估,找出對模型建立最有用的特徵。

嵌入法的結果會更加精確到模型的效用本身,對於提高模型效力有更好的效果。並且,由於考慮特徵對模型的貢獻,因此無關的特徵(需要相關性過濾的特徵)和無區分度的特徵(需要方差過濾的特徵)都會因為缺乏對模型的貢獻而被刪除掉。

但當大量特徵都對模型有貢獻且貢獻不一時,我們就很難去界定乙個有效的臨界值。這種情況下,模型權值係數就是我們的超引數,我們或許需要學習曲線,或者根據模型本身的某些性質去判斷這個超引數的最佳值究竟應該是多少。每個演算法,都會提到這個演算法中的特徵工程是如何處理,包括具體到每個演算法的嵌入法如何使用

sklearn.feature_selection.selectfrommodel (estimator, threshold=none, prefit=false, norm_order=1,max_features=none)

selectfrommodel是乙個元變換器,可以與任何在擬合後具有coef_,feature_importances_屬性或引數中可選懲罰項的評估器一起使用(比如隨機森林和樹模型就具有屬性feature_importances_,邏輯回歸就帶有l1和l2懲罰項,線性支援向量機也支援l2懲罰項)。

對於有feature_importances_的模型來說,若重要性低於提供的閾值引數,則認為這些特徵不重要並被移除。feature_importances_的取值範圍是[0,1],如果設定閾值很小,比如0.001,就可以刪除那些對標籤**完全沒貢獻的特徵。如果設定得很接近1,可能只有很少的特徵會被留下

##########引數說明(重點考慮前兩個引數)

1.estimator

使用的模型評估器,只要是帶feature_importances_或者coef_屬性,或帶有l1和l2懲罰項的模型都可以使用

2.threshold

特徵重要性的閾值,重要性低於這個閾值的特徵都將被刪除

3.prefit

預設false,判斷是否將例項化後的模型直接傳遞給建構函式。如果為true,則必須直接呼叫fit和transform,不能使用fit_transform,並且selectfrommodel不能與cross_val_score,gridsearchcv和轉殖估計器的類似實用程式一起使用。

4.norm_order

k可輸入非零整數,正無窮,負無窮,預設值為1 在評估器的coef_屬性高於一維的情況下,用於過濾低於閾值的係數的向量的範數的階數。

5.max_features

在閾值設定下,要選擇的最大特徵數。要禁用閾值並僅根據max_features選擇,請設定threshold = -np.inf

# 手寫數字識別資料集

from sklearn.feature_selection import selectfrommodel

from sklearn.model_selection import cross_val_score

from sklearn.ensemble import randomforestclassifier

import matplotlib.pyplot as plt

import numpy as np

rfc = randomforestclassifier(n_estimators=

10,random_state=0)

# 隨機森林例項化

x_embedded = selectfrommodel(rfc,threshold=

0.005

).fit_transform(x , y)

# 全部特徵和全部標籤

print

(x_embedded.shape)

# (42000, 47) 原785特徵

# 畫學習曲線來找最佳閾值

threshold = np.linspace(0,

(rfc.fit(x,y)

.feature_importances_)

.max()

,20)# array([0. , 0.00067177, 0.00134354, 0.00201531, 0.00268707,

# 0.00335884, 0.00403061, 0.00470238, 0.00537415, 0.00604592,

# 0.00671769, 0.00738945, 0.00806122, 0.00873299, 0.00940476,

# 0.01007653, 0.0107483 , 0.01142007, 0.01209183, 0.0127636 ])

score =

for i in threshold:

x_embedded = selectfrommodel(rfc,threshold=i)

.fit_transform(x,y)

once = cross_val_score(rfc,x_embedded,y,cv=5)

.mean(

)plt.plot(threshold,score)

plt.show(

)

包裝法也是乙個特徵選擇和演算法訓練同時進行的方法,與嵌入法十分相似,它也是依賴於演算法自身的選擇,比如coef_屬性或feature_importances_屬性來完成特徵選擇。但不同的是,我們往往使用乙個目標函式(專門選取特徵的演算法)作為黑盒來幫助我們選取特徵,而不是自己輸入某個評估指標或統計量的閾值。包裝法在初始特徵集上訓練評估器,並且通過coef_屬性或通過feature_importances_屬性獲得每個特徵的重要性。然後,從當前的一組特徵中修剪最不重要的特徵。在修剪的集合上遞迴地重複該過程,直到最終到達所需數量的要選擇的特徵。區別於嵌入法的一次訓練解決所有問題,包裝法要使用特徵子集進行多次訓練,因此它所需要的計算成本是最高的。

最典型的目標函式是遞迴特徵消除法(recursive feature elimination, 簡寫為rfe)。它是一種貪婪的優化演算法,旨在找到效能最佳的特徵子集。 它反覆建立模型,並在每次迭代時保留最佳特徵或剔除最差特徵,下一次迭代時,它會使用上一次建模中沒有被選中的特徵來構建下乙個模型,直到所有特徵都耗盡為止。然後,它根據自己保留或剔除特徵的順序來對特徵進行排名,最終選出乙個最佳子集。包裝法的效果是所有特徵選擇方法中最利於提公升模型表現的,它可以使用很少的特徵達到很優秀的效果。除此之外,在特徵數目相同時,包裝法和嵌入法的效果能夠匹敵,不過它比嵌入法算得更快,但是他的計算量也比較龐大,所以也不適用於太大型的資料。相比之下,包裝法是最能保證模型效果的特徵選擇方法。

feature_selection.rfe

sklearn.feature_selection.rfe (estimator, n_features_to_select=none, step=1, verbose=0)

1.estimator

是需要填寫的例項化後的評估器,

2.n_features_to_select

是想要選擇的特徵個數

3.step

表示每次迭代中希望移除的特徵個數。

除此之外,rfe類有兩個很重要的屬性

1.support_ 返回所有的特徵的是否最後被選中的布林矩陣

2..ranking_ 返回特徵的按數次迭代中綜合重要性的排名。

類feature_selection.rfecv會在交叉驗證迴圈中執行rfe以找到最佳數量的特徵,增加引數cv,其他用法都和rfe一模一樣。

from sklearn.model_selection import cross_val_score

from sklearn.ensemble import randomforestclassifier

from sklearn.feature_selection import rfe

import matplotlib.pyplot as plt

import numpy as np

rfc = randomforestclassifier(n_estimators=

10,random_state=0)

selector = rfe(rfc,n_features_to_select=

340,step=50)

.fit(x,y)

print

(selector.support_.

sum())

# 返回所有特徵是否被選中的布林矩陣 求和一共340個特徵被選中

print

(selector.ranking_)

# 所有特徵的重要性排名 重要性相同排名就會一樣5)

.mean(

)# 包裝法學習曲線來找最佳閾值

score =

for i in

range(1

,751,50

):50)

.fit_transform(x,y)5)

.mean(

)plt.figure(figsize=[20

,5])

plt.plot(

range(1

,751,50

),score)

plt.xticks(

range(1

,751,50

))plt.show(

)

sklearn學習 特徵選擇

當特徵特別多的時候,且有冗餘的情況下,對特徵進行選擇不僅能使訓練速度加快,還可以排除一些負面特徵的干擾。sklearn的feature seletion提供了它許多特徵選取函式,目前包括單變數選擇方法和遞迴特徵消除演算法。它們均為轉化器,故在此不舉例說明如何使用。除了使用feature seleti...

基於sklearn的特徵選擇方法

在資料探勘工作中,通常處理的是乙個包含大量特徵且含義未知的資料集,並基於該資料集挖掘到有用的特徵。那麼這裡面一般是四個步驟 特徵工程 特徵選擇 模型構造 模型融合。特徵工程主要是清洗特徵 刪除無用特徵和構造新特徵,經過特徵工程這個過程我們可能會得到大量的特徵 而特徵選擇的目的就是從這大量的特徵中挑選...

sklearn第十七講 特徵選擇

sklearn.feature selection模組裡的類能被用來在樣本集上作特徵選擇 或者叫維數降低,改善估計量的準確性 在高維空間的表現。下面我們介紹幾種常用的特徵選擇方法。variancethreshold是乙個簡單的特徵選擇基準方法。它刪除所有方差小於某閾值的特徵。預設刪除所有0方差特徵,...