我做第一个竞赛时使用的特征筛选策略。
Pearson卡方检验,有时也简称简称卡方检验,是以卡尔·皮尔逊的名字命名的,也是我做第一个数据竞赛时尝试的第一个特征筛选方法。卡方检验是一种统计假设检验,它假设(Null假设):
一个分类变量的观测频率与该分类变量的期望频率相匹配。
当我们样本的观测频率与期望频率相差较大时,Pearson’s Chi-Squared计算得到的值较大;而当两者接近时,这个值很小。的值较大意味着观测到的频率和预期的频率相差很远。的值较小意味着相反的结果:被观察者接近预期。所以给出了观测频率和期望频率之间的距离。
如果我们计算得到的结果 < Critical Value:我们认为这是在拒绝null假设时失败了,两个变量是独立的,可以考虑删除该变量。
本文,我们介绍一种特征选择的技术-Pearson卡方检验,现在在非常多的问题中,该策略也会经常作为特征筛选的重要Baseline进行比较。
1. 单变量的ChiSquare计算
单个特征变量的ChiSquare计算公式如下:
为某列特征,为第个样本对应的特征值;
2.双变量的ChiSquare计算
为观测值,为样本数
1. 手动计算Pearson’s Chi-Squared的值
手动计算的步骤如下;
需要先构建交叉频率表; 计算期望; 按照上面的数学式计算Chi-Squared的值。
import pandas as pd
from functools import reduce
import numpy as np
from scipy import stats
from sklearn.feature_selection import SelectKBest, chi2
# 构建数据集
df = pd.DataFrame()
df['f1'] = [0,0,0,0,0] * 10
df['f2'] = [1,1,0,0,0] * 10
df['y'] = [1,1,0,0,0] * 10
df_f1_y_crosstab = pd.crosstab(df['f1'], df['y'], margins=True)
df_f2_y_crosstab = pd.crosstab(df['f2'], df['y'], margins=True)
def margins(a):
margsums = []
ranged = list(range(a.ndim))
for k in ranged:
marg = np.apply_over_axes(np.sum, a, [j for j in ranged if j != k])
margsums.append(marg)
return margsums
observed = df_f2_y_crosstab.values
d = observed.ndim
margsums = margins(observed)
expected = reduce(np.multiply, margsums) / observed.sum() ** (d - 1)
terms = (observed - expected)**2 / (expected)
stat = terms.sum()
stat
[0, 1]
50.0
2. stats.chi2_contingency
因为Pearson’s Chi-Squared是非常流行的一种策略,所以在stats中也已经集成了,可以直接调用进行特征筛选。
def check_dependency(df_crosstab_table, confidence_interval):
chi2, p, dof, expected = stats.chi2_contingency(df_crosstab_table)
print ("Chi2 value = {}".format(chi2))
print ("PValue = {}".format(p))
alpha = 1.0 - confidence_interval
if p <= alpha:
print('Dependent (reject H0)')
else:
print('Independent (fail to reject H0)')
return expected
_ = check_dependency(df_f1_y_crosstab, 0.95)
Chi2 value = 0.0
PValue = 1.0
Independent (fail to reject H0)
_ = check_dependency(df_f2_y_crosstab, 0.95)
Chi2 value = 50.0
PValue = 3.610865404890647e-10
Dependent (reject H0)
我们发现我们最终使用工具包计算得到的Chi2的值和我们自己算的是一样的,此外我们将置信度设置为0.95,最终得到的结果基本符合我们的预期。
一般Pearson_Chi-Squared使用在分类问题中,判断类别变量与标签之间的关系,然后基于计算得到的值进行特征的筛选,自定义置信度的值进行特征的筛选。
Chi-Squared For Feature Selection using SelectKBest Statistical Thinking - Chi Square Test - Feature Selection https://github.com/scipy/scipy/blob/v0.14.0/scipy/stats/stats.py https://github.com/scipy/scipy/blob/v0.14.0/scipy/stats/contingency.py#L64 Wiki.皮尔逊卡方检验 https://nbviewer.jupyter.org/github/bhattbhavesh91/chi-squared-feature-selection-selectkbest/blob/master/chi-squared-selectkbest-notebook.ipynb A Gentle Introduction to the Chi-Squared Test for Machine Learning
双一流高校研究生团队创建 ↓
专注于计算机视觉原创并分享相关知识 ☞
整理不易,点赞三连!
评论