4. 单变量特征选择(中):卡方检验(Chi-square)的原理与实战
卡方检验(Chi-square Test)是单变量特征选择中用于衡量类别型特征与类别型目标变量之间相关性的经典统计方法。它通过比较实际观测频数与理论期望频数之间的差异,判断特征与标签是否独立。若卡方统计量越大、p值越小,则特征与目标的相关性越强,越值得保留。
4.1 卡方检验的核心原理
卡方检验基于独立性检验的思想。假设特征 \(X\) 与目标 \(Y\) 相互独立,则每个单元格的期望频数可由行合计与列合计计算得出。实际频数与期望频数的偏差平方和除以期望频数,即得到卡方统计量:
\[ \chi^2 = \sum_{i=1}^{r} \sum_{j=1}^{c} \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]- \(O_{ij}\):第 \(i\) 行第 \(j\) 列的实际观测频数
- \(E_{ij}\):第 \(i\) 行第 \(j\) 列的期望频数 = (行合计 × 列合计) / 总样本数
- 自由度:\((r-1) \times (c-1)\),其中 \(r\) 为特征取值数,\(c\) 为目标类别数
适用条件:卡方检验要求特征与目标均为离散型变量,且样本量足够大(通常期望频数 ≥ 5)。对于连续型特征,需先进行分箱离散化处理。
4.2 卡方检验的假设与判定
| 假设类型 | 含义 | 判定标准 |
|---|---|---|
| 原假设 \(H_0\) | 特征与目标相互独立(无关联) | p值 ≥ 显著性水平(如 0.05) |
| 备择假设 \(H_1\) | 特征与目标存在显著关联 | p值 < 显著性水平 |
在实际特征筛选中,我们通常直接使用卡方统计量或p值进行排序:统计量越大(或 p 值越小),特征越重要。
4.3 卡方检验的实战流程
- 数据准备:确保特征矩阵 \(X\) 为类别型或已离散化,目标 \(y\) 为类别型。
- 构建列联表:对每个特征与目标计算交叉频数表。
- 计算卡方统计量与 p 值:使用统计公式或库函数(如 scikit-learn 的
chi2)。 - 特征排序与筛选:按卡方统计量降序或 p 值升序排列,选择 Top-K 特征。
实战要点:卡方检验对稀疏数据敏感,若某特征取值极少出现,可能导致期望频数过小,影响检验可靠性。建议先剔除低频类别或合并罕见值。
4.4 卡方检验的直观流程
下图展示了从原始类别特征到卡方统计量计算、特征排序的完整链路:
4.5 Python 实战代码
以下代码使用 scikit-learn 的 SelectKBest 与 chi2 评分函数,对类别型特征进行筛选:
import pandas as pd
import numpy as np
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.preprocessing import LabelEncoder
# 示例数据:类别特征与二分类目标
data = {
'color': ['red', 'blue', 'red', 'green', 'blue', 'green', 'red', 'blue'],
'size': ['S', 'M', 'L', 'S', 'M', 'L', 'S', 'M'],
'label': [1, 0, 1, 0, 1, 0, 1, 0]
}
df = pd.DataFrame(data)
# 将类别特征编码为数值
X = df[['color', 'size']].apply(LabelEncoder().fit_transform)
y = df['label']
# 使用卡方检验选择最佳特征
selector = SelectKBest(score_func=chi2, k=1)
X_selected = selector.fit_transform(X, y)
# 输出每个特征的卡方统计量与 p 值
scores = pd.DataFrame({
'feature': X.columns,
'chi2_stat': selector.scores_,
'p_value': selector.pvalues_
})
print(scores)
注意:卡方检验要求输入为非负数值。若特征编码后出现负值(如某些编码方式),需先进行绝对值或 Min-Max 缩放处理,否则会报错或产生无效结果。
4.6 卡方检验 vs 其他单变量方法
| 方法 | 适用特征类型 | 适用目标类型 | 输出指标 | 主要优势 |
|---|---|---|---|---|
| 卡方检验 | 类别型 | 类别型 | χ² 统计量、p 值 | 统计理论基础强,可解释性高 |
| 方差分析(ANOVA) | 连续型 | 类别型 | F 统计量、p 值 | 适用于连续特征与分类目标 |
| 互信息 | 连续型 / 类别型 | 连续型 / 类别型 | 互信息值 | 可捕捉非线性关系 |
4.7 卡方检验的局限性
- 仅适用于类别型数据:连续特征必须离散化,可能丢失信息。
- 对样本量敏感:小样本或稀疏单元格会导致检验失效。
- 只能检测线性关联:无法捕捉复杂的非线性交互关系。
- 不考虑特征间冗余:单变量筛选可能保留高度相关的重复特征。
最佳实践:卡方检验适合作为初步粗筛工具,快速剔除与目标明显无关的类别特征。后续可结合递归特征消除(RFE)或正则化模型进行精筛。