LightGBM
LightGBM 是一种梯度提升框架,它根据特征直方图按叶片生长决策树,从而快速训练大型表格数据集。
LightGBM(轻量级梯度提升机)是一个开源的梯度提升框架,能够在表格数据上训练集成模型,由决策树组成,专为大型数据集上的高速度和低内存占用而设计。Microsoft 于 2016 年发布了它,并在 NeurIPS 2017 论文 LightGBM:一种高效的梯度提升决策树中介绍了其算法。2026 年 3 月,官方代码库迁移到了由同一批维护者管理的 lightgbm-org GitHub 组织。LightGBM 可通过 Python、R、C++ 和命令行处理分类、回归和排序任务,并出现在许多机器学习竞赛的获胜方案中。对于约 10,000 行的中型表格数据,像 LightGBM 这样的树集成模型通常仍优于深度学习。
LightGBM 的工作原理#
梯度提升逐棵构建决策树。每棵新树都拟合当前集成模型预测值相对于损失函数的梯度;对于平方误差,这些梯度就是残差,因此新树会纠正之前的树留下的错误。模型的预测值是所有树输出的总和,每个输出都乘以一个学习率。计算开销最大的步骤是为每个节点寻找最佳分裂点,LightGBM 通过四种技术加速了这一过程:
- 基于直方图的分裂:训练前,LightGBM 会将每个连续特征分桶,最多分成 255 个箱(
max_bin)。搜索分裂点时会扫描箱边界,而不是遍历每个排序后的取值。分裂后,只需根据数据构建较小子节点的直方图,因为较大子节点的直方图等于父节点的直方图减去较小子节点的直方图。 - 按叶生长:LightGBM 总是分裂最佳分裂点能最大程度降低损失的叶节点,直到树达到
num_leaves个叶节点(默认值为 31),而不是先分裂同一层的所有节点再继续向下生长。叶节点数相同时,这种方式比按层生长能达到更低的损失,但也会生成深而不平衡的树,可能导致小型数据集过拟合。 - 基于梯度的单边采样(GOSS):梯度较大的样本表示模型仍然难以准确预测这些样本。使用
data_sample_strategy="goss"时,LightGBM 会保留梯度最大的 20% 样本,从其余样本中随机抽取另外 10%,并提高这部分样本的权重,使数据分布接近原始分布。 - 互斥特征捆绑(EFB):将很少同时取非零值的稀疏特征(例如独热编码列)合并为一个特征,从而减少需要构建的直方图数量。
每棵树都会重复搜索分裂点,直到用完叶节点预算或没有有效分裂为止;提升过程会在每一轮中重复这一操作:
如果在 categorical_feature 中列出整数编码的类别特征,LightGBM 还可以直接对这些特征进行分裂,在每次分裂时对类别分组,而不需要独热编码,并且默认会处理缺失值。训练可在 CPU、GPU(device_type="gpu" 或 "cuda")上运行,也可以通过分布式学习器跨机器运行。
训练和调优 LightGBM#
scikit-learn 风格的 LGBMClassifier、LGBMRegressor 和 LGBMRanker 类可以满足大多数用途。按叶生长的树可能会变得很深,因此防止过拟合的主要控制参数是 num_leaves、min_child_samples(每个叶节点默认 20 行)和 max_depth,再结合学习率和树的数量;通常可以通过超参数调优或在验证集上提前停止来确定这些参数。要展示直方图和按叶生长的优势,可以将其与 scikit-learn 经典的精确分裂梯度提升方法,在包含 20,000 行和 40 个特征的合成表格数据集上进行比较:
import time
import lightgbm as lgb
from sklearn.datasets import make_classification
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
X, y = make_classification(n_samples=20_000, n_features=40, n_informative=15, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# 200 trees each: exact split search vs. LightGBM's histograms and leaf-wise growth
for model in (GradientBoostingClassifier(n_estimators=200), lgb.LGBMClassifier(n_estimators=200, verbose=-1)):
start = time.perf_counter()
model.fit(X_train, y_train)
seconds = time.perf_counter() - start
print(f"{type(model).__name__}: {seconds:.1f} s, accuracy {model.score(X_test, y_test):.3f}")在 Apple M5 Pro CPU 上,LightGBM 不到一秒就能生长出 200 棵最多有 31 个叶节点的树,而 scikit-learn 构建 200 棵深度为 3 的精确分裂树约需 20 秒;LightGBM 的较大树在测试集上取得了 0.956 的准确率,而另一种方法为 0.901。训练好的模型可以保存为文本或 JSON 格式,并可通过 onnxmltools 转换为 ONNX,以便在 Python 之外提供服务。
LightGBM 与相关方法的比较#
- XGBoost:这是一种在 2014 年普及了正则化二阶提升的梯度提升库。它默认构建深度受限的树(
max_depth=6),也可以通过grow_policy="lossguide"按叶生长;从 2.0 版起,默认使用基于直方图的分裂查找,因此这两个库现在采用了大多数相同的技术。 - CatBoost:Yandex 于 2017 年发布的提升库,可构建对称树,并使用有序目标统计量对类别特征进行编码,以限制目标泄漏。
- 随机森林:在自助采样样本上独立训练深树,并对它们的预测结果取平均,从而降低方差。
- HistGradientBoosting:scikit-learn 的
HistGradientBoostingClassifier和HistGradientBoostingRegressor是受 LightGBM 启发的实现,采用相同方式将特征分桶并构建直方图。 - 表格基础模型:TabPFN 等预训练 Transformer 只需一次前向传播,就能对小型表格进行预测,无需针对每个数据集单独训练。










