目錄
1 Filter
1.1 移除低方差特征(Removing features with low variance)
1.2 單變量特征選擇 (Univariate feature selection)
1.2.1 卡方檢驗 (Chi2)
1.2.2 Pearson 相關系數 (Pearson Correlation)
2 Wrapper
2.1 遞歸特征消除 (Recursive Feature Elimination)
3 Embedding
3.1 使用 SelectFromModel 選擇特征 (Feature selection using SelectFromModel)
1 Filter
1.1 移除低方差特征 (Removing features with low variance)
即去掉那些取值變化小的特征
當特征值都是離散型變量的時候這種方法才能用,如果是連續型變量,就需要將連續變量離散化之后才能用。
# Variance 偏差 Threshold閾值 from sklearn.feature_selection import VarianceThreshold X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]] sel = VarianceThreshold(threshold=(.8*(1-.8))) sel.fit_transform(X)
可見,移除了 特征值為 0 的概率達到了 5/6 的第一列。
1.2 單變量特征選擇 (Univariate feature selection)
對於分類問題 (y離散),可采用:
-
-
卡方檢驗
-
對於回歸問題 (y連續),可采用:
-
-
皮爾森相關系數 余弦值cos(只考慮了方向)
-
f_regression,
-
mutual_info_regression
-
-
1.2.1 卡方檢驗 (Chi2)
檢驗定性自變量對定性因變量的相關性。如 對樣本進行一次卡方檢驗來選擇最佳的兩項特征:
from sklearn.datasets import load_iris # 鳶尾花數據集 # 用於特征選擇的包 from sklearn.feature_selection import SelectKBest # 訓練的套路 from sklearn.feature_selection import chi2 iris = load_iris() x, y = iris.data, iris.target # 參數解釋:chi2 使用卡方檢驗,k=2 留下兩個特征 x_new = SelectKBest(chi2,k=2).fit_transform(x,y)
4 個特征只剩 2 個
1.2.2 Pearson 相關系數 (Pearson Correlation)
該方法衡量的是變量之間的線性相關性,結果的取值區間為[-1,1],-1表示完全的負相關,+1表示完全的正相關,0表示沒有線性相關。
import numpy as np from scipy.stats import pearsonr # sciPy 科學python哈哈,stats:統計學 np.random.seed(0) # 設置生成隨機數的種子 size = 300 x = np.random.normal(0,1,size=size) # 生成標准正態分布的300個數 # Lower noise pearsonr(x, x + np.random.normal(0,1,size)) # Higher noise pearsonr(x, x + np.random.normal(1,10,size))
當噪音比較小的時候,相關性很強,p-value很低。
2. Wrapper
2.1 遞歸特征消除 (Recursive Feature Elimination)
遞歸消除特征法使用一個基模型來進行多輪訓練,每輪訓練后,移除若干權值系數的特征,再基於新的特征集進行下一輪訓練。
對特征含有權重的預測模型(例如,線性模型對應參數coefficients),RFE (即 一個訓練的套路) 通過遞歸減少考察的特征集規模來選擇特征。首先,預測模型在原始特征上訓練,每個特征指定一個權重。之后,那些擁有最小絕對值權重的特征被踢出特征集。如此往復遞歸,直至剩余的特征數量達到所需的特征數量。
from sklearn.feature_selection import RFE from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris # 建立一個決策樹模型 rf = RandomForestClassifier() # 加載鳶尾花數據 iris=load_iris() x, y=iris.data,iris.target # 創建RFE 遞歸消除特征 # estimator 傳入RFE使用到的模型,n_features_to_select 最終剩下幾個特征 rfe = RFE(estimator=rf, n_features_to_select=3) x_rfe = rfe.fit_transform(x,y) x_rfe.shape
3 Embedded
3.1 基於L1的特征選擇 (L1-based feature selection)
很難指定最終剩幾個特征,剩多少算多少哈哈
常用於此目的的稀疏預測模型有 linear_model.Lasso(回歸), linear_model.LogisticRegression 和 svm.LinearSVC(分類)
from sklearn.feature_selection import SelectFromModel # 訓練套路 from sklearn.svm import LinearSVC # 模型 # penalty 懲罰項,邏輯回歸中也有。一般都是默認 l2范數,這里【必須改成 l1】 lsvc = LinearSVC(C=1, penalty='l1', dual=False).fit(x,y) # 進行特征選擇,很難預測最后剩幾個特征 model = SelectFromModel(lsvc, prefit=True) x_embed = model.transform(x)
本文只用於學習