#导入数据 import pandas as pd import numpy as np data = pd.read_csv(r"./digit-recognizer/train.csv") X = data.iloc[:,1:] y = data.iloc[:,0] X.shape
Filter 过滤法
过滤方法通常用作预处理步骤,特征选择完全独立于任何机器学习算法。它是根据各种统计检验中的分数以及相关性的各项指标来选择特征。在文章中最常见的例子就是选择使用显著差异的特征进行建模,例如,在宏基因组数据中,我们可以先使用秩和检验找出差异菌株,然后选择 P 值较小的点来建立模型。但在这里我只介绍机器学习中一些常见的过滤法。
卡方检验适用于分类问题,feature_selection.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
F 检验是用来捕捉每个特征与标签之间的线性关系的过滤方法。它既可以做回归也可以做分类,因此包含feature_selection.f_classif( F 检验分类)和feature_selection.f_regression( F 检验回归)两个类。其中 F 检验分类用于标签是离散型变量的数据,而 F 检验回归用于标签是连续型变量的数据。和卡方检验一样,这两个类需要和类SelectKBest连用。
from sklearn.feature_selection import f_classif F, pvalues_f = f_classif(X_fsvar,y) F pvalues_f k = F.shape[0] - (pvalues_f > 0.05).sum() X_fsF = SelectKBest(f_classif, k=填写具体的k).fit_transform(X_fsvar, y) cross_val_score(RFC(n_estimators=10,random_state=0),X_fsF,y,cv=5).mean()
互信息法
互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。和 F 检验相似,它既可以做回归也可以做分类,包含两个类feature_selection.mutual_info_classif(互信息分类)和feature_selection.mutual_info_regression(互信息回归)。这两个类的用法和参数都和 F 检验一模一样,不过互信息法比 F 检验更加强大,F 检验只能够找出线性关系,而互信息法可以找出任意关系。
互信息法不返回 p 值或 F 值类似的统计量,它返回“每个特征与目标之间的互信息量的估计”,这个估计量在[0,1]之间 取值,为 0 则表示两个变量独立,为 1 则表示两个变量完全相关。以互信息分类为例的代码如下:
from sklearn.feature_selection import mutual_info_classif as MIC result = MIC(X_fsvar,y) # 计数不相关的特征数量 k = result.shape[0] - sum(result <= 0) X_fsmic = SelectKBest(MIC, k=填写具体的k).fit_transform(X_fsvar, y) cross_val_score(RFC(n_estimators=10,random_state=0),X_fsmic,y,cv=5).mean()
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.xticks(threshold) plt.show()