寻找与标签有相关性的特征。
卡方过滤
- 专门针对离散型标签(分类问题)相关过滤
- 类
feature_selection.chi2
- 计算每个非负(不能计算负数,要进行归一化或者标准化)特征和标签之间的卡方统计量,越高越好(相关性越强)
- 如果检测的方差为0的数据,会提示先用方差过滤
- 结合
feature_selectio.SelectKbest
- 选出卡方分数最高的K个
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2 # 卡方检验
X_schi = SelectionKBest(chi2, k=10).fit_transform(X_var, y)
交叉验证使用:
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
cross_val_score(RFC(n_estimators=10, random_state=0), X_schi, y, cv=5).mean()
"""
获得交叉验证准确率均值
"""
获得准确率之后判断上升还是降低,如果降低,证明,滤掉了一些相关性比较高的特征,可以高 参数K。
选取超参数K:
==1、==可以通过学习曲线进行选取超参数K
import matplotlib.pyplot as plt
score = []
for i in range(390, 200, -10):
X_schi = SelectKBest(chi2, k=i).fit_transform(X_var, y)
once = cross_val_score(RFC(n_estimators=10, random_state=0), X_schi, y, cv=5).mean()
score.append(once)
plt.plot(range(350,200,-10), score)
plt.show()
一般来说曲线应该会有一个全局高峰,如果只出现单调,则可能特征都与标签相关
2、卡方检验会返回两个统计量,卡方值很难界定有效范围,但是p值可以0.01或者0.05作为显著性水平,就是p值判断边界
- p值 <= 0.05 or 0.01(希望的)
- 数据的差异不是自然形成的
- 两组数据是相关的
- 拒绝原假设,接受备择假设
- p值 >= 0.05 or 0.01
- 两者数据相互独立
- 与上相反。
在调用KBest之前,可以从chi2实例化后的模型中获得各个特征所对应的卡方值和p值。
通过p值来选取k的个数
chivalue, pvalues_chi = chi2(X_var, y)
k = chivalue.shape[0] - (pvalues_chi > 0.01).sum()
F检验
用来捕捉每个特征与标签之间的线性关系。可以做回归也能做分类。
原假设是:数据不存在原假设的线性关系,也会返回 f 值(也很难界定) 和 p 值
feature_selection.f_classif
- 使用于标签是离散型变量的数据
feature_selection.f_regression
- 使用于标签是连续型变量的数据
from sklearn.feature_selection import f_classif
F , pvalues = f_classif(X_var, y)
k = F.shape[0] - (pvalues > 0.05).sum()
互信息法
比 F检验 更加强大
捕捉每个特征与标签之间的任意关系(线性和非线性)
feature_selection.mutual_info_regression
互信息回归feature_selection.mutual_info_classif
互信息分类
不返回统计量(p 值 或者 f 值),但返回每个特征与目标之间的互信息量的估计,处于[0,1]
,0表示两个变量独立,1表示两个变量完全相关。
from sklearn.feature_selection import mutual_info_classif as MIF
result = MIC(X_var, y)
k = result.shape[0] - (result <= 0).sum()
过滤法总结
一般:先试用方差过滤,然后用互信息法。