【sklearn学习】特征选择
Filter過濾法
過濾方法通常用作預(yù)處理步驟根據(jù)各種統(tǒng)計(jì)檢驗(yàn)分?jǐn)?shù)或者各項(xiàng)指標(biāo)來選擇特征
- 方差過濾
sklearn.feature_selection.VarianceThreshold
通過特征本身的方差來篩選特征的類,比如一個(gè)特征本身的方差很小,可能特征中大多數(shù)值都一樣,那么這個(gè)特征對(duì)于樣本的區(qū)分沒有什么作用,所以要優(yōu)先消除方差為0的特征。
VarianceThreshold的參數(shù)threshold表示方差的閾值,表示舍棄所有方差小于threshold的特征
>>> from sklearn.feature_selection import VarianceThreshold >>> X = [[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]] >>> selector = VarianceThreshold() >>> selector.fit_transform(X) array([[2, 0],[1, 4],[1, 1]])過濾法的應(yīng)用是需要遍歷特征或提升維度的算法,如決策樹、KNN、SVM、神經(jīng)網(wǎng)絡(luò)、回歸算法
過濾法的主要目的是在維持算法表現(xiàn)得前提下,幫助算法降低計(jì)算成本
通常情況下,會(huì)使用閾值為0或者閾值很小得方差過濾,優(yōu)先消除明顯用不到得特征,然后用更優(yōu)得特征選擇方法繼續(xù)削減特征數(shù)量。
- 相關(guān)性過濾
判斷特征和標(biāo)簽之間的相關(guān)性:卡方、F檢驗(yàn)、互信息
sklearn.feature_selection.chi2
按照卡方統(tǒng)計(jì)量由高到低為特征排名,選出前K個(gè)分?jǐn)?shù)最高得特征得類
from sklearn.feature_selection import chi2 from sklearn.feature_selection import SelectKBestX_fschi = SelectKBest(chi2, k=300).fit_transform(X_fsvar, y)sklearn.feature_selection.chi2(X, y)卡方檢驗(yàn)得本質(zhì)是推測兩組數(shù)據(jù)之間的差異,返回卡方值和p值兩個(gè)統(tǒng)計(jì)量
,卡方值難以界定有效范圍,一般使用p=0.01或0.05作為顯著性水平
- F檢驗(yàn)
sklearn.feature_selection.f_classif
F檢驗(yàn)分類用于標(biāo)簽是離散型的數(shù)據(jù),F檢驗(yàn)回歸用于標(biāo)簽是連續(xù)型的數(shù)據(jù)
需要和類selectKBest連用,在數(shù)據(jù)服從正態(tài)分布時(shí)效果會(huì)非常穩(wěn)定
from sklearn.feature_selection import SelectKBest, f_classif from sklearn.pipeline import make_pipeline from sklearn.svm import LinearSVCanova_filter = SelectKBest(f_classif, k=3) clf = LinearSVC() anova_svm = make_pipeline(anova_filter, clf) anova_svm.fit(X_train, y_train)- 互信息法
sklearn.feature_selection.mutual_info_classif
F檢驗(yàn)只能找出線性關(guān)系,而互信息可以找出任意關(guān)系
互信息法不返回統(tǒng)計(jì)量,它返回“每個(gè)特征與目標(biāo)之間的互信息量的估計(jì)”,0表示兩個(gè)變量獨(dú)立,1表示兩個(gè)變量完全相關(guān)。
from sklearn.feature_selection import mutual_info_calssif as MIC result = MIC(X_fsvar, y) k = result.shape[0] - sum(result <=0)| 類 | 說明 | 超參數(shù)的選擇 |
| VarianceThreshold | 方差過濾,可輸入方差閾值,返回方差大于閾值的新特征矩陣 | 使用0或1來篩選,畫學(xué)習(xí)曲線或中位數(shù) |
| SelectKBest | 選取K個(gè)統(tǒng)計(jì)量姐夫哦最佳的特征,生成符合統(tǒng)計(jì)量要求的新特征矩陣 | |
| chi | 卡方檢驗(yàn),專用于分類算法 | 追求p小于顯著性水平的特征 |
| f_classif | F檢驗(yàn)分類,捕捉線性相關(guān)性,要求數(shù)據(jù)服從正態(tài)分布 | 追求p小于顯著性水平的特征 |
| f_regression | F檢驗(yàn)回歸,捕捉線性相關(guān)性,要求數(shù)據(jù)服從正態(tài)分布 | 追求p小于顯著性水平的特征 |
| mutual_ifo_classif | 互信息分類,捕捉任何相關(guān)性,不能用于稀疏矩陣 | 追求互信息估計(jì)大于0的特征 |
| mutual_info_regression | 互信息分類,捕捉任何相關(guān)性,不能用于稀疏矩陣 | 追求互信息估計(jì)大于0的特征 |
- Embedded嵌入法
嵌入法讓算法自己決定使用哪些特征,即特征選擇和算法訓(xùn)練同時(shí)進(jìn)行,先使用機(jī)器學(xué)習(xí)的算法和模型進(jìn)行訓(xùn)練,得到各個(gè)特征的權(quán)值系數(shù),根據(jù)權(quán)值系數(shù)從大到小選擇
比如決策樹和隨機(jī)森林中的feature-importances,返回各個(gè)特征對(duì)樹的建立的貢獻(xiàn)。
無關(guān)的特征和無區(qū)分度的特征,會(huì)因?yàn)閷?duì)模型缺乏貢獻(xiàn),直接被刪除掉
- feature_selection.SelectFromModel
class?sklearn.feature_selection.SelectFromModel(estimator,?*,?threshold=None,?prefit=False,?norm_order=1,?max_features=None,?importance_getter='auto')
>>> from sklearn.feature_selection import SelectFromModel >>> from sklearn.linear_model import LogisticRegression >>> X = [[ 0.87, -1.34, 0.31 ], ... [-2.79, -0.02, -0.85 ], ... [-1.34, -0.48, -2.55 ], ... [ 1.92, 1.48, 0.65 ]] >>> y = [0, 1, 0, 1] >>> selector = SelectFromModel(estimator=LogisticRegression()).fit(X, y) >>> selector.estimator_.coef_ array([[-0.3252302 , 0.83462377, 0.49750423]]) >>> selector.threshold_ 0.55245... >>> selector.get_support() array([False, True, False]) >>> selector.transform(X) array([[-1.34],[-0.02],[-0.48],[ 1.48]])| 參數(shù) | 說明 |
| estimator | 使用的模型評(píng)估器,帶feature_importances或coef屬性,或者帶懲罰項(xiàng)的模型都可以使用 |
| threshold | 特征重要性的閾值,重要性低于這個(gè)閾值的特征都將被刪除 |
| prefit | 判斷是否將實(shí)例化后的模型直接傳遞給構(gòu)造函數(shù) |
| norm_order | |
| max_features |
- 包裝法
算法不是用于評(píng)估的算法,而是專業(yè)的數(shù)據(jù)挖掘算法,專門用于選取特征,直到最終達(dá)到所需數(shù)量的要選擇的特征。
典型的目標(biāo)函數(shù)是遞歸特征消除法。
- feature_selection.RFE
class?sklearn.feature_selection.RFE(estimator,?*,?n_features_to_select=None,?step=1,?verbose=0,?importance_getter='auto')
>>> from sklearn.datasets import make_friedman1 >>> from sklearn.feature_selection import RFE >>> from sklearn.svm import SVR >>> X, y = make_friedman1(n_samples=50, n_features=10, random_state=0) >>> estimator = SVR(kernel="linear") >>> selector = RFE(estimator, n_features_to_select=5, step=1) >>> selector = selector.fit(X, y) >>> selector.support_ array([ True, True, True, True, True, False, False, False, False,False]) >>> selector.ranking_ array([1, 1, 1, 1, 1, 6, 4, 3, 2, 5])總結(jié)
以上是生活随笔為你收集整理的【sklearn学习】特征选择的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 征信花了度小满好申请吗 征信花了度小满容
- 下一篇: hd615相当于什么显卡