共计 1901 个字符,预计需要花费 5 分钟才能阅读完成。
1. 开篇:为什么需要特征预筛选?
面对 30 维特征的数据集时,直接训练决策树会产生三大典型问题:

- 计算资源浪费:决策树会递归评估所有特征的分裂质量,30 维特征意味着约 2^30 种可能的组合方式
- 过拟合风险:无关特征会干扰决策树的生长,导致模型记住噪声而非规律
- 解释性下降:重要特征可能被淹没在大量无关特征中
2. 技术方案对比
2.1 统计方法筛选
方差阈值法
适用于初步剔除低方差特征(通常为常量或近常量特征):
from sklearn.feature_selection import VarianceThreshold
# 删除方差小于 0.1 的特征
selector = VarianceThreshold(threshold=0.1)
X_reduced = selector.fit_transform(X)
互信息法
衡量特征与目标变量的非线性相关性,适用于分类问题:
from sklearn.feature_selection import mutual_info_classif
mi_scores = mutual_info_classif(X, y)
# 取 Top15 特征
important_idx = np.argsort(mi_scores)[-15:]
2.2 领域知识筛选
建议构建特征 - 业务价值对照表:
| 特征名称 | 业务含义 | 预期重要性 | 保留依据 |
|---|---|---|---|
| age | 用户年龄 | 高 | 与购买力强相关 |
| login_freq | 登录频率 | 中 | 反映用户活跃度 |
2.3 可视化辅助
热力图分析
import seaborn as sns
# 计算相关系数矩阵
corr = X.corr()
# 绘制热力图
sns.heatmap(corr, annot=True, fmt=".2f")
箱线图对比
import matplotlib.pyplot as plt
plt.figure(figsize=(10,6))
sns.boxplot(data=X[['feature1','feature2','feature3']])
plt.xticks(rotation=45)
3. 完整代码示例
3.1 预处理流程
# 缺失值处理
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='median')
X_imputed = imputer.fit_transform(X)
# 标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_imputed)
3.2 特征选择实现
from sklearn.feature_selection import SelectKBest, chi2
# 选择卡方检验得分最高的 10 个特征
selector = SelectKBest(chi2, k=10)
X_new = selector.fit_transform(X_scaled, y)
# 获取特征重要性得分
scores = selector.scores_
plt.bar(range(len(scores)), scores)
plt.xticks(range(len(scores)), X.columns, rotation=90)
4. 避坑指南
4.1 类别型特征处理
- 必须对名义变量进行独热编码(One-Hot Encoding)
- 使用互信息而非卡方检验处理高基数特征
4.2 多重共线性场景
- 使用方差膨胀因子 (VIF) 检测:
from statsmodels.stats.outliers_influence import variance_inflation_factor vif = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] - VIF>5 的特征建议剔除
4.3 小样本场景
- 优先使用互信息而非统计检验
- 采用分层抽样确保特征分布均衡
- 考虑使用正则化方法(L1 惩罚项)
5. 进阶思考
当统计筛选结果与业务经验矛盾时,建议采用:
- 交叉验证对比两种方案的效果差异
- 构建包含争议特征的 AB 测试集
- 通过 SHAP 值分析特征真实贡献度
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
结语
特征预筛选是提升决策树效率的关键步骤,通过本文介绍的方法,可以在保持模型性能的同时减少 70% 以上的计算开销。建议在实践中建立特征评估 - 筛选 - 验证的闭环流程,持续优化特征组合。
正文完
发表至: 未分类
近两天内
