LightGBM(Light Gradient Boosting Machine)是 Microsoft 提出的基于决策树算法的梯度提升框架。它具有高效、准确和高可扩展性的特点,能够在海量数据上快速训练模型,并在不牺牲精度的前提下提高处理速度。下面将从底层原理到源代码的实现方面全面讲解 LightGBM 的工作原理和其在 Python 中的实现。
梯度提升树(Gradient Boosting Decision Tree, GBDT)是一种基于加法模型和前向分步算法的提升方法。GBDT 通过迭代地构建决策树来优化目标函数,其中每一棵树都拟合上一个模型的残差或负梯度。GBDT 在分类问题中通常使用交叉熵作为目标函数,而在回归问题中使用平方误差损失。
LightGBM 相较传统的 GBDT 框架进行了多项改进,主要包括:
在决策树中,叶子节点增长策略会优先选择增益最大的叶子节点进行分裂,使模型更加精确。虽然叶子节点增长策略在理论上比层级增长策略(Level-wise)更容易过拟合,但其在性能和准确性上优于传统的 GBDT 方法。
数学公式:
对于每一棵树,目标是最小化以下目标函数:

其中, 是预测误差损失,Ω(f) 是正则化项,用于防止过拟合。每次计算增益(Gain)时,都会计算增益最大的位置并在此位置分裂节点,从而使目标函数的值最小化。
传统的 GBDT 需要对所有特征的每个分裂点计算增益,这一过程的时间复杂度较高。而 LightGBM 的直方图算法会将连续特征离散化,将其划分为 k 个区间,每个区间的值为这些值的均值。
在训练过程中,LightGBM 仅需计算 k 个区间的增益,而不必针对每个特征值都计算增益,这显著减少了计算量。
单边梯度采样(GOSS)通过保留较大的梯度样本并对小梯度样本进行随机采样,减少了样本数量,从而降低了计算成本。假设 a% 的样本有较大梯度,b% 的样本有较小梯度,GOSS 将保留所有大的梯度样本,并从小梯度样本中随机采样一个子集,以加速计算过程。
稀疏特征在高维数据中常见,而这些稀疏特征的非零值通常不会出现在同一个样本中。LightGBM 利用这一特点将稀疏特征捆绑成一个新的组合特征,以减少特征的维数。通过 EFB,算法可以减少计算量,而不会对模型精度产生明显的影响。
在 Python 中,LightGBM 的核心实现是基于 C++ 的,Python API 提供了简单易用的接口。以下是 LightGBM 在 Python 中的代码实现流程。
在安装时,LightGBM 需要编译,因此最好使用 pip 或者从源码安装:
pip install lightgbm
在使用 LightGBM 进行训练之前,我们需要将数据加载并转换为 Dataset 对象。Dataset 对象包含了特征、标签和其他元数据信息,并用于构建直方图。
- import lightgbm as lgb
- from sklearn.datasets import load_iris
- from sklearn.model_selection import train_test_split
-
- # 加载数据
- data = load_iris()
- X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)
-
- # 转换为 LightGBM 的 Dataset 格式
- train_data = lgb.Dataset(X_train, label=y_train)
- test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)
LightGBM 支持多种参数来控制训练过程。在 Python 中,可以通过定义一个包含参数的字典来设置模型的各项超参数。
- # 定义模型参数
- params = {
- 'objective': 'multiclass', # 多分类任务
- 'num_class': 3, # 类别数
- 'metric': 'multi_logloss', # 评价指标
- 'boosting_type': 'gbdt', # 梯度提升树
- 'num_leaves': 31, # 叶子节点数
- 'learning_rate': 0.05, # 学习率
- 'feature_fraction': 0.9 # 特征采样
- }
-
- # 模型训练
- model = lgb.train(params,
- train_data,
- num_boost_round=100,
- valid_sets=[train_data, test_data],
- early_stopping_rounds=10)
在 lgb.train() 函数中,num_boost_round 参数决定了模型的训练轮数,而 early_stopping_rounds 可以防止模型过拟合,通过监测验证集的误差,如果连续 10 次迭代误差没有降低,训练将会提前停止。
模型训练完成后,可以使用模型进行预测并评估其在测试集上的性能。
- # 模型预测
- y_pred = model.predict(X_test)
- y_pred = [list(x).index(max(x)) for x in y_pred] # 将概率转换为预测类别
-
- # 评估预测准确性
- from sklearn.metrics import accuracy_score
- accuracy = accuracy_score(y_test, y_pred)
- print(f'Accuracy: {accuracy}')
LightGBM 提供了便捷的方法来查看每个特征的重要性,可以通过绘图来展示。
- import matplotlib.pyplot as plt
-
- lgb.plot_importance(model, max_num_features=10)
- plt.show()
在 lightgbm 源码中,C++ 实现是核心部分,以下是核心模块的说明:
LightGBM 通过多项优化使得 GBDT 在性能和效率上有了大幅提升。其基于叶节点的生长策略和直方图算法的创新设计,显著提高了模型的训练速度和精度。在 Python 中,LightGBM 提供了丰富的 API,支持灵活的调参和高效的模型训练。掌握 LightGBM 的底层原理和实现细节,有助于在实际项目中更好地使用和优化该算法。