4. 过滤式方法进阶:卡方检验(Chi-square)用于分类特征选择
卡方检验(Chi-square Test)是过滤式特征选择中处理分类特征与分类目标之间相关性的经典统计方法。它通过衡量观测频数与期望频数之间的偏差,判断特征与标签是否独立,从而筛选出对分类任务有显著影响的特征。
4.1 核心原理:独立性检验
卡方检验的原假设(H₀)为“特征与标签相互独立”。若计算出的卡方统计量大于临界值,则拒绝原假设,认为特征与标签存在显著关联。统计量计算公式如下:
χ² = Σ [(Oᵢ - Eᵢ)² / Eᵢ]
其中:
- Oᵢ:第 i 个单元格的观测频数
- Eᵢ:第 i 个单元格的期望频数(行合计 × 列合计 / 总样本数)
- 自由度 df = (r-1) × (c-1),r 为特征取值数,c 为类别数
关键理解: 卡方值越大,说明观测值与期望值差异越大,特征与标签越不独立,该特征越值得保留。
4.2 适用场景与数据要求
| 维度 | 要求 | 说明 |
|---|---|---|
| 特征类型 | 分类变量(名义/有序) | 连续变量需先离散化(如等频分箱) |
| 目标类型 | 分类变量(二分类/多分类) | 不支持回归任务 |
| 样本量 | 每个单元格期望频数 ≥ 5 | 否则需使用 Fisher 精确检验 |
| 稀疏矩阵 | 不适用高稀疏分类特征 | 大量零频数会导致检验失效 |
4.3 卡方检验工作流程
下图展示了从原始分类数据到特征排序的完整流程:
4.4 手动计算示例
假设有一个二分类特征“颜色”(红/蓝)与二分类标签“购买”(是/否),观测数据如下:
| 颜色 | 购买=是 | 购买=否 | 行合计 |
|---|---|---|---|
| 红 | 30 | 20 | 50 |
| 蓝 | 10 | 40 | 50 |
| 列合计 | 40 | 60 | 100 |
计算期望频数(以红/是为例): E = (50 × 40) / 100 = 20
期望频数矩阵:
购买=是 购买=否
红 20 30
蓝 20 30
卡方计算:
χ² = (30-20)²/20 + (20-30)²/30 + (10-20)²/20 + (40-30)²/30
= 100/20 + 100/30 + 100/20 + 100/30
= 5 + 3.33 + 5 + 3.33
= 16.66
自由度 df = (2-1)×(2-1) = 1
查表得 p < 0.001,拒绝原假设 → “颜色”与“购买”显著相关
4.5 Python 实现与代码示例
使用 scikit-learn 的 SelectKBest 配合 chi2 评分函数,可以快速完成特征选择:
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.preprocessing import LabelEncoder
import pandas as pd
# 示例数据:分类特征矩阵(已编码)
X = pd.DataFrame({
'color': ['red','blue','red','blue','red'],
'size': ['S','M','L','S','M'],
'shape': ['round','square','round','square','round']
})
y = [1, 0, 1, 0, 1] # 二分类标签
# 对特征进行标签编码
X_encoded = X.apply(LabelEncoder().fit_transform)
# 卡方特征选择:选择 top-2 特征
selector = SelectKBest(score_func=chi2, k=2)
selector.fit(X_encoded, y)
# 输出卡方值和p值
for i, col in enumerate(X.columns):
print(f"{col}: χ²={selector.scores_[i]:.2f}, p-value={selector.pvalues_[i]:.4f}")
# 获取选中的特征
selected_features = X.columns[selector.get_support()]
print(f"选中特征: {list(selected_features)}")
实践建议: 对于高基数分类特征(如城市ID、用户ID),卡方检验容易产生偏差,建议先进行频数合并或改用互信息(Mutual Information)方法。
4.6 卡方检验 vs 其他过滤式方法
| 方法 | 特征类型 | 目标类型 | 输出形式 | 主要局限 |
|---|---|---|---|---|
| 卡方检验 | 分类 | 分类 | χ²值 + p值 | 对稀疏数据敏感 |
| 互信息 | 分类/连续 | 分类/连续 | 互信息值 | 计算成本较高 |
| 方差分析(ANOVA) | 连续 | 分类 | F值 + p值 | 假设正态分布 |
| 皮尔逊相关系数 | 连续 | 连续 | 相关系数 | 仅线性关系 |
4.7 常见陷阱与避坑指南
- 陷阱一: 对连续特征直接使用卡方检验。连续特征必须先离散化(如等宽分箱、等频分箱),否则结果无意义。
- 陷阱二: 忽略小期望频数。当超过20%的单元格期望频数 < 5 时,卡方近似失效,应改用 Fisher 精确检验或合并类别。
- 陷阱三: 多重比较问题。同时检验大量特征时,需考虑多重假设检验校正(如 Bonferroni 校正、FDR 控制)。
- 陷阱四: 将卡方值直接作为特征重要性排序的唯一依据。卡方值受样本量和自由度影响,不同自由度的特征之间不可直接比较。
⚠ 重要提醒: 卡方检验只能检测线性关联,无法捕捉非线性或交互效应。在复杂任务中,建议将卡方检验作为初筛步骤,后续再结合包裹式或嵌入式方法进行精细化选择。