特征选择中如何选择卡方阈值

How to choose the Chi Squared threshold in feature selection

关于这个:

我找到了这段代码:

    import pandas as pd
    import numpy as np
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.feature_selection import chi2

    THRESHOLD_CHI = 5 # or whatever you like. You may try with
     # for threshold_chi in [1,2,3,4,5,6,7,8,9,10] if you prefer
     # and measure the f1 scores

    X = df['text']
    y = df['labels']

    cv = CountVectorizer()
    cv_sparse_matrix = cv.fit_transform(X)
    cv_dense_matrix = cv_sparse_matrix.todense()

    chi2_stat, pval = chi2(cv_dense_matrix, y)

    chi2_reshaped = chi2_stat.reshape(1,-1)
    which_ones_to_keep = chi2_reshaped > THRESHOLD_CHI
    which_ones_to_keep = np.repeat(which_ones_to_keep ,axis=0,repeats=which_ones_to_keep.shape[1])

此代码计算卡方检验,应将最佳特征保持在选定的阈值内。 我的问题是如何为卡方测试分数选择阈值?

卡方没有特定的结果范围,所以很难事先确定一个阈值。通常你可以做的是根据变量的 p 值对变量进行排序,逻辑是 p 值越低越好,因为它们意味着特征和目标变量之间的相关性更高(我们想丢弃独立的特征,即不目标变量的预测变量)。在这种情况下,您无论如何都必须决定要保留多少特征,这是一个超参数,您可以手动调整或使用网格搜索更好地调整。

请注意,您可以避免手动执行 selection,sklearn 已经实现了一个函数 SelectKBest 到 select 基于卡方的最佳 k 个特征,您可以使用它如下:

from sklearn.feature_selection import SelectKBest, chi2

X_new = SelectKBest(chi2, k=2).fit_transform(X, y)

但如果出于任何原因你想完全依赖原始 chi2 值,你可以计算变量中的最小值和最大值,然后将间隔分成 n 步以通过网格搜索进行测试。