我正在学习关于特征选择的卡方检验,并发现了像这个的代码
然而,我的理解是,卡方得分越高意味着特征越独立(因此对模型的用处越小),所以我们应该关注那些得分最低的特征。然而,使用scikit-learn的SelectKBest,选择器返回的是卡方得分最高的值。我对使用卡方检验的理解是否有误?还是说sklearn中的卡方得分产生了不同于卡方统计量的其他东西?
请看下面的代码以了解我的意思(除了结尾部分,大部分是从上面的链接中复制过来的)
from sklearn.datasets import load_irisfrom sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2import pandas as pdimport numpy as np# 加载鸢尾花数据iris = load_iris()# 创建特征和目标X = iris.datay = iris.target# 通过将数据转换为整数来转换为分类数据X = X.astype(int)# 选择卡方统计量最高的两个特征chi2_selector = SelectKBest(chi2, k=2)chi2_selector.fit(X, y)# 查看选择器为每个特征返回的得分chi2_scores = pd.DataFrame(list(zip(iris.feature_names, chi2_selector.scores_, chi2_selector.pvalues_)), columns=['ftr', 'score', 'pval'])chi2_scores# 你可以看到SelectKBest返回的kbest是得分最高的两个特征kbest = np.asarray(iris.feature_names)[chi2_selector.get_support()]kbest
回答:
你的理解是相反的。
卡方检验的原假设是“两个分类变量是独立的”。因此,卡方统计量的值越高意味着“两个分类变量是相关的”,对分类更加有用。
SelectKBest根据更高的卡方值为你提供最好的两个(k=2)特征。因此,你需要获取它提供的那些特征,而不是获取卡方选择器上的“其他特征”。
你从chi2_selector.scores_获取卡方统计量并从chi2_selector.get_support()获取最佳特征是正确的。它将根据独立性检验的卡方检验为你提供“花瓣长度(cm)”和“花瓣宽度(cm)”作为前两个特征。希望这能澄清这个算法。