过滤法
过滤法是在机器学习训练之前进行的数据预处理,根据各种统计检验指标筛选出较好的特征子集。
方差过滤
- VarianceThreshold类
通过特征的方差来筛选特征的类。有些特征的方差很小,所以要首先消除方差为0的特征。其中的参数threshold,表示方差的阈值,消除方差小于阈值的特征,默认值是0. 相关操作及注释:
import pandas as pd
import numpy as np
from sklearn.feature_selection import VarianceThreshold
data = pd.read_csv()
X = data.iloc[:,1:]
Y = data.iloc[:,0]
selector = VarianceThreshold()
X_var0 = selector.fit_transform(X)
np.sort(X.var().values)[100]
对于KNN、SVM、神经网络等算法,需要遍历所有特征,计算量很大,过滤法过滤后的数据就可以降低这些算法的计算成本。而随机森林是随机选择特征进行分支。
- 参数threshold选择
经验,尝试。通常用阈值为0或者阈值很小的方差来过滤,先消除明显用不到的特征。
相关性过滤
方差过滤后,希望挑选出与标签相关且有意义的特征来为我们提供大量信息。在sklearn中评判相关性的有:卡方、F检验、互信息
- 卡方过滤
卡方过滤是专门针对离散型标签(即分类问题)的相关性过滤。卡方检验类为:feature_selectio.chi2,可以计算每个非负特征和标签之间的卡方统计量,并按照卡方统计量由高到低为特征排序。然后可以结合feature_selection.SelectKBest来获取前k个相关的特征。 相关操作:
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
X_fschi = SelectKBest(chi2, k=356).fit_transform(X_fsvar, y)
cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()
调参时可以根据统计学中的相关性检验来调参,就是让两者之间的相关性越强越好,看p值,p值越小越好。 可以chi2训练结果中返回。
chival, pval = chi2(X_fsvar, y)
- F检验
F检验,又称ANOVA,方差齐性检验,用来捕捉每个特征和标签之间的线性关系的过滤方法,既可以做回归,又可以做分类。在sklearn中有feature_selection.f_classif和feature_selection.f_regression两种。同样,要和SelectKBest同时使用来获取前k个特征。F检验和卡方检验结果可能相差不大。 相关操作:
from sklearn.feature_selection import f_classif
F, p = f_classif(X_fsvar,y)
F
- 互信息法
互信息可以获取每个特征和标签之间的任意关系。既可以做回归,也可以做分类。分别为:feature_selection.mutual_info_classif和mutual_info_regression 互信息返回是两个量之间的估计,在0-1之间,为0表示两个变量独立,为1则表示两个变量完全相关。 相关操作也是fit啥的都一样。
嵌入法
嵌入法是一种让算法自己决定使用那些特征的方法,特征选择和训练同时进行。在使用嵌入法时,我们先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小选择特征。这些权值系数往往代表了特征对于模型的某种贡献或某种重要性,比如决策树和树的集成模型中的feature_importances_属性,可以列出各个特征对树的建立的贡献,我们就可以基于这种贡献的评估,找出对模型建立最有用的特征。 嵌入法的类:feature_selection.SelectFromModel SelectFromModel是一个元变换器,可以与任何在拟合后具有coef_,feature_importances_属性或参数中可选惩 罚项的评估器一起使用(比如随机森林和树模型就具有属性feature_importances_,逻辑回归就带有l1和l2惩罚 项,线性支持向量机也支持l2惩罚)。
包装法
包装法也是一个特征选择和算法训练同时进行的方法,与嵌入法十分相似,它也是依赖于算法自身的选择,比如coef_属性或feature_importances_属性来完成特征选择。但不同的是,我们往往使用一个目标函数作为黑盒来帮助我们选取特征,而不是自己输入某个评估指标或统计量的阈值。这个算法是专用的数据挖掘算法,常见的是递归特征消除法(RFE)。它是一种贪婪的优化算法,旨在找到性能最佳的特征子集。 它反复创建模型,并在每次迭代时保留最佳特征或剔除最差特征,下一次迭代时,它会使用上一次建模中没有被选中的特征来构建下一个模型,直到所有特征都耗尽为止。 然后,它根据自己保留或 剔除特征的顺序来对特征进行排名,最终选出一个最佳子集。
- feature_selection.RFE
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一模一样。 也是fit、transform等操作进行操作。
|