【sklearn学习】特征选择
Filter過濾法
過濾方法通常用作預處理步驟根據各種統計檢驗分數或者各項指標來選擇特征
- 方差過濾
sklearn.feature_selection.VarianceThreshold
通過特征本身的方差來篩選特征的類,比如一個特征本身的方差很小,可能特征中大多數值都一樣,那么這個特征對于樣本的區分沒有什么作用,所以要優先消除方差為0的特征。
VarianceThreshold的參數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]])過濾法的應用是需要遍歷特征或提升維度的算法,如決策樹、KNN、SVM、神經網絡、回歸算法
過濾法的主要目的是在維持算法表現得前提下,幫助算法降低計算成本
通常情況下,會使用閾值為0或者閾值很小得方差過濾,優先消除明顯用不到得特征,然后用更優得特征選擇方法繼續削減特征數量。
- 相關性過濾
判斷特征和標簽之間的相關性:卡方、F檢驗、互信息
sklearn.feature_selection.chi2
按照卡方統計量由高到低為特征排名,選出前K個分數最高得特征得類
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)卡方檢驗得本質是推測兩組數據之間的差異,返回卡方值和p值兩個統計量
,卡方值難以界定有效范圍,一般使用p=0.01或0.05作為顯著性水平
- F檢驗
sklearn.feature_selection.f_classif
F檢驗分類用于標簽是離散型的數據,F檢驗回歸用于標簽是連續型的數據
需要和類selectKBest連用,在數據服從正態分布時效果會非常穩定
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檢驗只能找出線性關系,而互信息可以找出任意關系
互信息法不返回統計量,它返回“每個特征與目標之間的互信息量的估計”,0表示兩個變量獨立,1表示兩個變量完全相關。
from sklearn.feature_selection import mutual_info_calssif as MIC result = MIC(X_fsvar, y) k = result.shape[0] - sum(result <=0)| 類 | 說明 | 超參數的選擇 |
| VarianceThreshold | 方差過濾,可輸入方差閾值,返回方差大于閾值的新特征矩陣 | 使用0或1來篩選,畫學習曲線或中位數 |
| SelectKBest | 選取K個統計量姐夫哦最佳的特征,生成符合統計量要求的新特征矩陣 | |
| chi | 卡方檢驗,專用于分類算法 | 追求p小于顯著性水平的特征 |
| f_classif | F檢驗分類,捕捉線性相關性,要求數據服從正態分布 | 追求p小于顯著性水平的特征 |
| f_regression | F檢驗回歸,捕捉線性相關性,要求數據服從正態分布 | 追求p小于顯著性水平的特征 |
| mutual_ifo_classif | 互信息分類,捕捉任何相關性,不能用于稀疏矩陣 | 追求互信息估計大于0的特征 |
| mutual_info_regression | 互信息分類,捕捉任何相關性,不能用于稀疏矩陣 | 追求互信息估計大于0的特征 |
- Embedded嵌入法
嵌入法讓算法自己決定使用哪些特征,即特征選擇和算法訓練同時進行,先使用機器學習的算法和模型進行訓練,得到各個特征的權值系數,根據權值系數從大到小選擇
比如決策樹和隨機森林中的feature-importances,返回各個特征對樹的建立的貢獻。
無關的特征和無區分度的特征,會因為對模型缺乏貢獻,直接被刪除掉
- 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]])| 參數 | 說明 |
| estimator | 使用的模型評估器,帶feature_importances或coef屬性,或者帶懲罰項的模型都可以使用 |
| threshold | 特征重要性的閾值,重要性低于這個閾值的特征都將被刪除 |
| prefit | 判斷是否將實例化后的模型直接傳遞給構造函數 |
| norm_order | |
| max_features |
- 包裝法
算法不是用于評估的算法,而是專業的數據挖掘算法,專門用于選取特征,直到最終達到所需數量的要選擇的特征。
典型的目標函數是遞歸特征消除法。
- 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])總結
以上是生活随笔為你收集整理的【sklearn学习】特征选择的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 征信花了度小满好申请吗 征信花了度小满容
- 下一篇: 【sklearn学习】降维算法PCA和S