1. XGBoost特征重要性原理揭秘
第一次用XGBoost做特征筛选时,我被它输出的重要性评分搞懵了——同样的数据跑三次居然给出不同的特征排序。后来才发现,原来XGBoost提供了三种不同的重要性计算方式,就像医生用不同体检指标评估健康状况一样。
weight指标相当于统计每个特征被用作分裂节点的次数。就像篮球运动员的出场次数,出场越多说明教练越依赖他。但有个问题:靠近根节点的分裂和末端节点的分裂权重相同,这显然不合理。
gain指标就聪明多了,它计算每个特征带来的平均信息增益。好比评估球员不仅要看出场时间,更要看得分贡献。我做过对比实验,用gain指标筛选的特征子集,模型AUC通常比weight指标高0.02-0.05。
cover指标最特别,它统计被该特征影响的样本量比例。比如信用卡欺诈检测中,某个特征可能只参与3次分裂,但覆盖了80%的欺诈样本,这种特征用cover指标就会脱颖而出。实测发现,对于样本分布极度不均衡的场景,cover指标往往有惊喜。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 可视化分析实战技巧
2.1 绘制基础重要性图谱
用matplotlib画特征重要性条形图是基本功,但新手常犯两个错误:一是忘记排序,二是没处理长特征名。这是我的改进方案:
python复制# 获取特征重要性并排序
importances = model.feature_importances_
indices = np.argsort(importances)[::-1]
# 处理长特征名
feat_names = [f[:15]+'...' if len(f)>15 else f for f in feature_names]
# 绘制横向条形图
plt.figure(figsize=(10,8))
plt.barh(range(len(indices)), importances[indices], color='#1f77b4')
plt.yticks(range(len(indices)), [feat_names[i] for i in indices])
plt.tight_layout()
这个方案比直接使用plot_importance()更灵活,特别是当需要自定义颜色或添加其他标注时。
