二、Embedded嵌入法
- 嵌入法是一种让算法自己决定使用哪些特征的方法,即特征选择和算法训练同时进行。
- 先使用某些机器学习的算法和模型进行训练
- 得到各个特征的权值系数,根据权值系数从大到小选择特征
- 有别于过滤法的 “ 手工 ” 操作方式:过滤法使用统计量(如P值),但嵌入法的权值系数没有参考临界值
- 应用feature_selection.SelectFromModel元变换器。可以与任何在拟合之后有coef_(回归系数),feature_importances_属性或参数中可选惩罚项的评估器一起使用,如随机森林和树模型
from sklearn.feature_selection import SelectFromModel from sklearn.ensemble import RandomForestClassifier as RFC RFC_ = RFC(n_estimators =10,random_state=0) X_embedded = SelectFromModel(RFC_,threshold=0.005).fit_transform(X,y) X_embedded.shape
# 模型的维度有没有降低? #学习曲线来找最佳阈值 import numpy as np import matplotlib.pyplot as plt RFC_.fit(X,y).feature_importances_ threshold = np.linspace(0,(RFC_.fit(X,y).feature_importances_).max(),20) 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() score.append(once) plt.plot(threshold,score) plt.show()
将最高部分的学习曲线进行放大:
score2 = [] for i in np.linspace(0,0.004,20): X_embedded = SelectFromModel(RFC_,threshold=i).fit_transform(X,y) once = cross_val_score(RFC_,X_embedded,y,cv=5).mean() score2.append(once) plt.figure(figsize=[20,5]) plt.plot(np.linspace(0,0.004,20),score2) plt.xticks(np.linspace(0,0.004,20)) plt.show()
三、Wrapper包装法
- 特征选择与算法(并非随机森林等)训练同时进行,类似嵌入法
- 不同:使用目标函数作为黑盒帮助选取特征,而非自己输入某个评估指标或者统计量的阈值
- 从
coef_
或者feature_importances_
属性获取每个特征的重要性 - 修建当前特征组中最不重要的特征,在修建的集合上递归重复该过程,直到最终达到所需数量的特征
- 要使用特征子集进行多次训练,计算成本较高,但其所选的特征是最有利于提升模型表现的
# 使用包装法 from sklearn.feature_selection import RFE RFC_ = RFC(n_estimators =10,random_state=0) selector = RFE(RFC_,n_features_to_select=340,step=50).fit(X,y) selector.support_.sum()
selector.ranking_
X_wrapper=selector.transform(X) cross_val_score(RFC_,X_wrapper,y,cv=5).mean() # 使用sklearn的cross_val_score进行交叉验证
#调参 100 from sklearn.feature_selection import RFE RFC_ = RFC(n_estimators =100,random_state=0) selector = RFE(RFC_, n_features_to_select=340, step=50).fit(X, y) # 特征选择340个,每个步骤做50个参数的调整 selector.support_.sum() selector.ranking_ X_wrapper = selector.transform(X) # 通过包装法得到最优结果 cross_val_score(RFC_,X_wrapper,y,cv=5).mean() # 使用交叉验证计算准确性