-
过滤
1.1 方差过滤
VarianceThreshold() 参数为threshold,使用方差过滤,一般是先剔出方差为0的特征,其次threshold经常使用的是方差的中位数,即np.median(X.var().values),X就是数据的特征矩阵。
1.2 相关性过滤
如你所见,包含以下三种。
1.2.1 卡方过滤
chi2(),搭配SelectKBest使用,都是feature_selection类的,X_chi2 = SelectKBest(chi2,k=350).fit_transform(X_fsvar,y),X_chi2即通过卡方过滤筛选出的剩余特征,SelectKBest()的常用参数为mutual_info_classif,f_classif,chi2, f_regression,mutual_info_regression。参数k为需要特征的数目。X_fsvar这里就体现了实际工作时的思路,先过滤方差为0的特征。
1.2.2 F检验
F检验的本质是寻找两组数据之间的线性关系,其原假设是”数据不存在显著的线性关系“。它返回F值和p值两个统计量。和卡方过滤一样,希望选取p值小于0.05或0.01的特征,这些特征与标签是显著线性相关的,而p值大于 0.05或0.01的特征则被我们认为是和标签没有显著线性关系的特征,应该被删除。
1.2.3 互信息
互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。和F检验相似,它既可以做回归也可以做分类,并且包含两个类feature_selection.mutual_info_classif(互信息分类)和 feature_selection.mutual_info_regression(互信息回归)。这两个类的用法和参数都和F检验一模一样,不过互信息法比F检验更加强大,F检验只能够找出线性关系,而互信息法可以找出任意关系。 互信息法不返回p值或F值类似的统计量,它返回“每个特征与目标之间的互信息量的估计”,这个估计量在[0,1]之间 取值,为0则表示两个变量独立,为1则表示两个变量完全相关。
-
嵌入
嵌入法让算法自己决定使用哪些特征,即特征选择和算法训练同时进行。在使用嵌入法时,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小选择特征。这些权值系数往往代表了特征对于模型的某种贡献或某种重要性,比如决策树和树的集成模型中的feature_importances_属性,可以列出各个特征对树的建立的贡献,我们就可以基于这种贡献的评估,找出对模型建立最有用的特征。因此相比于过滤法,嵌入法的结果会更加精确到模型的效用本身,对于提高模型效力有更好的效果。并且,由于考虑特征对模型的贡献,因此无关的特征(需要相关性过滤的特征)和无区分度的特征(需要方差过滤的特征)都会因为缺乏对模型的贡献而被删除掉。但计算量较大,特别是碰到KNN这种本身计算量就大的模型,那速度真是一言难尽。
使用SelectFromModel类,一般这样使用X_embedded = SelectFromModel(RFC_,threshold=xxx).fit_transform(X,y),即estimator机器学习算法模型,threshold 特征重要性的阈值,重要性低于这个阈值的特征都将被删除。
过滤法和嵌入法斗讲了,但是没讲怎么验证使用了这些过滤特征的方法,模型效果提升与否,使用类似cross_val_score(RFC_,X_embedded,y,cv=5).mean()的方法即可得到模型评估分数,RFC_是机器学习算法,X_embedded是过滤后剩下的特征,y是标签,cv是交叉验证的折数,取平均值更可信。
-
包装
使用feature_selection中的RFE类。
1
class sklearn.feature_selection.RFE (estimator, n_features_to_select=None, step=1, verbose=0)
参数estimator是需要填写的实例化后的评估器,n_features_to_select是想要选择的特征个数,step表示每次迭代中希望移除的特征个数。除此之外,RFE类有两个很重要的属性,.support_:返回所有的特征的是否最后被选 中的布尔矩阵,以及.ranking_返回特征的按数次迭代中综合重要性的排名。类feature_selection.RFECV会在交叉 验证循环中执行RFE以找到最佳数量的特征,增加参数cv,其他用法都和RFE一模一样。
说完了三个特征选择的方法,我还没讲学习曲线怎么画,这是一个通用的技能,通过画学习曲线确定最佳参数范围,通过学习曲线缩小范围,进而找到最佳阈值。
1
2
3
4
5
6
7score = []
for i in range(300,200,-10):
X_fschi = SelectKBest(chi2, k=i).fit_transform(X_fsvar, y)
once = cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()
score.append(once)
plt.plot(range(300,200,-10),score)
plt.show() -
降维
这值得开一篇专题,降维专题见!