我做第一个竞赛时使用的特征筛选策略。

共 3958字,需浏览 8分钟

 ·

2021-05-13 07:34

简 介

Pearson卡方检验,有时也简称简称卡方检验,是以卡尔·皮尔逊的名字命名的,也是我做第一个数据竞赛时尝试的第一个特征筛选方法。卡方检验是一种统计假设检验,它假设(Null假设):

  • 一个分类变量的观测频率与该分类变量的期望频率相匹配

当我们样本的观测频率与期望频率相差较大时,Pearson’s Chi-Squared计算得到的值较大;而当两者接近时,这个值很小。的值较大意味着观测到的频率和预期的频率相差很远。的值较小意味着相反的结果:被观察者接近预期。所以给出了观测频率和期望频率之间的距离。

  • 如果我们计算得到的结果 < Critical Value:我们认为这是在拒绝null假设时失败了,两个变量是独立的,可以考虑删除该变量。

本文,我们介绍一种特征选择的技术-Pearson卡方检验,现在在非常多的问题中,该策略也会经常作为特征筛选的重要Baseline进行比较。

Pearson’s Chi-Squared Test

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使用在分类问题中,判断类别变量与标签之间的关系,然后基于计算得到的值进行特征的筛选,自定义置信度的值进行特征的筛选。

参考文献
  1. Chi-Squared For Feature Selection using SelectKBest
  2. Statistical Thinking - Chi Square Test - Feature Selection
  3. https://github.com/scipy/scipy/blob/v0.14.0/scipy/stats/stats.py
  4. https://github.com/scipy/scipy/blob/v0.14.0/scipy/stats/contingency.py#L64
  5. Wiki.皮尔逊卡方检验
  6. https://nbviewer.jupyter.org/github/bhattbhavesh91/chi-squared-feature-selection-selectkbest/blob/master/chi-squared-selectkbest-notebook.ipynb
  7. A Gentle Introduction to the Chi-Squared Test for Machine Learning

✄------------------------------------------------


双一流高校研究生团队创建 ↓

专注于计算机视觉原创并分享相关知识 


整理不易,点赞三连!

浏览 9
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报