3. 特征重要性基础:默认特征重要性(Split 与 Gain)的定义与计算逻辑

在 LightGBM 中,特征重要性是模型解释性的核心起点。LightGBM 内置了两种最常用的特征重要性度量方式:Split(分裂次数)和 Gain(信息增益)。理解这两种指标的定义与计算逻辑,是后续进行特征筛选、模型简化和业务洞察的基础。

3.1 两种默认特征重要性的定义

指标名称 英文全称 核心定义 反映的维度
Split Frequency / Split Count 特征被选为分裂节点的总次数 特征的使用频率
Gain Information Gain / Total Gain 特征在所有分裂中带来的总信息增益 特征对模型精度的贡献量
关键区别: Split 只关心“用了几次”,Gain 关心“每次用了之后提升了多少”。一个特征可能被频繁使用(Split 高),但每次提升很小(Gain 低);反之,一个特征可能只被使用一次,但那次分裂带来了巨大的纯度提升(Gain 高)。

3.2 Split 重要性的计算逻辑

Split 重要性是最直观的度量方式。LightGBM 在训练过程中,每构建一棵决策树时,都会记录每个特征被选为分裂节点的次数。最终的特征重要性分数就是所有树上该特征分裂次数的累加和。

  • 计算单位: 次数(Count)。
  • 累加范围: 所有迭代轮次(所有决策树)。
  • 特点: 计算简单,速度快,能快速识别出模型“依赖”哪些特征进行决策。
  • 局限性: 容易偏向于取值种类多(高基数)的特征,因为这些特征更容易找到分裂点;且无法区分“好分裂”与“坏分裂”。
# 获取 Split 重要性示例(Python)
import lightgbm as lgb

model = lgb.LGBMClassifier()
model.fit(X_train, y_train)

# 默认 importance_type='split'
split_importance = model.feature_importances_
print("Split Importance:", split_importance)

3.3 Gain 重要性的计算逻辑

Gain 重要性比 Split 更精确。它不仅记录特征被使用的次数,还累加每次分裂带来的信息增益(通常使用基尼系数或均方误差的减少量)。

  • 计算单位: 信息增益的累加值(无量纲,但可比较大小)。
  • 累加范围: 所有迭代轮次中,该特征作为分裂节点时产生的增益之和。
  • 特点: 更能反映特征对模型预测能力的实际贡献,是特征筛选的优先选择。
  • 局限性: 计算量稍大;增益值可能受树深度和分裂点位置影响,不同特征之间的增益绝对值差异可能很大。
# 获取 Gain 重要性示例(Python)
# 通过设置 importance_type 参数
gain_importance = model.feature_importances_
# 注意:需要在训练时或通过参数指定 'gain'
# 或者在训练后重新设置:
model.booster_.feature_importance(importance_type='gain')
print("Gain Importance:", gain_importance)

3.4 Split 与 Gain 的对比分析

对比维度 Split 重要性 Gain 重要性
核心逻辑 计数(使用频率) 求和(贡献大小)
对高基数特征 容易偏高(偏向性) 相对稳健
对噪声特征 可能虚高(被误用) 通常较低(增益小)
业务解释性 “模型最常参考哪些字段” “哪些字段对结果影响最大”
推荐场景 快速初筛、特征数量对比 特征选择、模型精简
实践建议: 在实际项目中,建议同时输出 Split 和 Gain 两种重要性进行交叉验证。如果一个特征在 Split 中排名很高,但在 Gain 中排名很低,说明它虽然被频繁使用,但每次带来的提升有限,可能是冗余特征或噪声特征,可以考虑剔除。

3.5 特征重要性计算流程(SVG 图)

下图展示了 LightGBM 在训练过程中如何为单个特征累积 Split 和 Gain 重要性分数。

LightGBM 特征重要性计算流程(Split 与 Gain) 特征重要性计算流程(Split vs Gain) 训练数据 & 特征 LightGBM 决策树构建(逐层分裂) 分裂事件 特征 A 被选中分裂 Split 计数 +1 计算信息增益 分裂前后纯度提升量 Gain 累加 +ΔGain 输出:特征重要性列表(Split & Gain)

3.6 代码实践:获取两种重要性

以下代码展示了如何在 LightGBM 训练完成后,分别提取 Split 和 Gain 两种特征重要性,并进行简单的对比。

import lightgbm as lgb
import pandas as pd

# 假设 X_train, y_train 已准备好
model = lgb.LGBMClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# 获取特征名称
feature_names = X_train.columns.tolist()

# 1. 获取 Split 重要性(默认)
split_imp = model.feature_importances_  # 默认 importance_type='split'

# 2. 获取 Gain 重要性
# 方法一:通过 booster 对象
gain_imp = model.booster_.feature_importance(importance_type='gain')

# 方法二:训练时指定参数(推荐)
# model = lgb.LGBMClassifier(importance_type='gain')
# model.fit(X_train, y_train)
# gain_imp = model.feature_importances_

# 构建对比 DataFrame
importance_df = pd.DataFrame({
    'feature': feature_names,
    'split_importance': split_imp,
    'gain_importance': gain_imp
})

# 按 Gain 排序
importance_df = importance_df.sort_values('gain_importance', ascending=False)
print(importance_df.head(10))
注意事项:
  • Gain 重要性在 LightGBM 的不同版本中,默认可能返回的是“总增益”还是“平均增益”略有差异。建议查阅当前版本的官方文档确认。
  • 当特征数量非常多时,Gain 重要性可能会出现少数特征占据绝对主导的情况,这是正常的,反映了模型对这些特征的强依赖。
  • 不要仅依赖单一指标做特征删除,建议结合业务理解和模型性能验证(如交叉验证)进行综合判断。