我做第一個(gè)競(jìng)賽時(shí)使用的特征篩選策略。

Pearson卡方檢驗(yàn),有時(shí)也簡(jiǎn)稱簡(jiǎn)稱卡方檢驗(yàn),是以卡爾·皮爾遜的名字命名的,也是我做第一個(gè)數(shù)據(jù)競(jìng)賽時(shí)嘗試的第一個(gè)特征篩選方法??ǚ綑z驗(yàn)是一種統(tǒng)計(jì)假設(shè)檢驗(yàn),它假設(shè)(Null假設(shè)):
一個(gè)分類變量的觀測(cè)頻率與該分類變量的期望頻率相匹配。
當(dāng)我們樣本的觀測(cè)頻率與期望頻率相差較大時(shí),Pearson’s Chi-Squared計(jì)算得到的值較大;而當(dāng)兩者接近時(shí),這個(gè)值很小。的值較大意味著觀測(cè)到的頻率和預(yù)期的頻率相差很遠(yuǎn)。的值較小意味著相反的結(jié)果:被觀察者接近預(yù)期。所以給出了觀測(cè)頻率和期望頻率之間的距離。
如果我們計(jì)算得到的結(jié)果 < Critical Value:我們認(rèn)為這是在拒絕null假設(shè)時(shí)失敗了,兩個(gè)變量是獨(dú)立的,可以考慮刪除該變量。
本文,我們介紹一種特征選擇的技術(shù)-Pearson卡方檢驗(yàn),現(xiàn)在在非常多的問題中,該策略也會(huì)經(jīng)常作為特征篩選的重要Baseline進(jìn)行比較。

1. 單變量的ChiSquare計(jì)算
單個(gè)特征變量的ChiSquare計(jì)算公式如下:
為某列特征,為第個(gè)樣本對(duì)應(yīng)的特征值;
2.雙變量的ChiSquare計(jì)算
為觀測(cè)值,為樣本數(shù)

1. 手動(dòng)計(jì)算Pearson’s Chi-Squared的值
手動(dòng)計(jì)算的步驟如下;
需要先構(gòu)建交叉頻率表; 計(jì)算期望; 按照上面的數(shù)學(xué)式計(jì)算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
# 構(gòu)建數(shù)據(jù)集
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
因?yàn)镻earson’s Chi-Squared是非常流行的一種策略,所以在stats中也已經(jīng)集成了,可以直接調(diào)用進(jìn)行特征篩選。
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)
我們發(fā)現(xiàn)我們最終使用工具包計(jì)算得到的Chi2的值和我們自己算的是一樣的,此外我們將置信度設(shè)置為0.95,最終得到的結(jié)果基本符合我們的預(yù)期。

一般Pearson_Chi-Squared使用在分類問題中,判斷類別變量與標(biāo)簽之間的關(guān)系,然后基于計(jì)算得到的值進(jìn)行特征的篩選,自定義置信度的值進(jìn)行特征的篩選。

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.皮爾遜卡方檢驗(yàn) 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
雙一流高校研究生團(tuán)隊(duì)創(chuàng)建 ↓
專注于計(jì)算機(jī)視覺原創(chuàng)并分享相關(guān)知識(shí) ?
整理不易,點(diǎn)贊三連!
