上一篇文章介绍了特征的方差过滤,方差过滤完毕之后,我们要考虑下一个问题:相关性。我们希望选出的特征与标签相关且有意义,因为这样的特征能够为我们提供更有用的信息。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