上一篇文章介绍了特征的方差过滤,方差过滤完毕之后,我们要考虑下一个问题:相关性。我们希望选出的特征与标签相关且有意义,因为这样的特征能够为我们提供更有用的信息。Sklearn中有三种常用方法,来判断特征和标签之间的相关性:卡方、F检验、互信息。本文先介绍第一种卡方过滤。
卡方过滤是专门针对离散型标签(即分类问题)的相关性过滤,卡方检验类feature_selection.chi2,可以计算每个非负特征和标签之间的卡方统计量,并依照卡方统计量由高到低位特征排名,再结合feature_selection.SelectKBest,结合评分标准来选取前K个分数最高的特征。
1、卡方过滤
import pandas as pd from sklearn.feature_selection import chi2 from sklearn.feature_selection import SelectKBest from sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestClassifier as RFC data = pd.read_csv('./datas/digit_recognizor_simple.csv') x = data.iloc[:, 1:] y = data.iloc[:, 0] x_chi = SelectKBest(chi2, k=300).fit_transform(x, y) score = cross_val_score(RFC(random_state=42), x_chi, y, cv=5).mean() print(score) # 0.855
2、学习曲线选K值
import matplotlib.pyplot as plt score_l = [] for i in range(200, 401, 10): x_chi = SelectKBest(chi2, k=i).fit_transform(x, y) score = cross_val_score(RFC(random_state=42), x_chi, y, cv=5).mean() score_l.append(score) plt.plot(range(200, 401, 10), score_l) plt.show()
3、P值调参
卡方检测会返回卡方值和P值两个统计量,其中卡方值很难界定有效范围,但P值一般使用0.01或0.05作为显著性水平,即p值的判断边界。p<=0.05或0.01,说明两组数据是相关的,反之相互独立。
chi, p = chi2(x, y) # k的取值,可以用总特征数,减去p大于设置值的总数 k = chi.shape[0] - (p>0.01).sum() print(k) # 784
很遗憾,k值最后结果和特征数相等,说明卡方过滤对该组数据不适用,可以考虑只用前面学过的特征方差过滤。
本文为 陈华 原创,欢迎转载,但请注明出处:http://ichenhua.cn/read/268