LightGBM - 树生长策略

梯度提升框架 LightGBM 使用"逐叶"开发,这是一种新的树生长方法。在机器学习和数据分析方面,决策树对分类和回归都有好处。LightGBM 的显著特点是其逐叶树开发方法,它不同于大多数决策树学习算法使用的标准逐级树生长技术。

在本章中,我们将了解逐叶树生长方法、逐级树生长方法,并阐明它与大多数决策树学习算法使用的典型逐级树生长策略有何不同。

LightGBM 旨在有效地训练大型数据集并创建高精度预测模型。在讨论逐级和逐叶树生长之前,我们先定义几个关键术语:

  • 梯度提升:一种机器学习方法,通过组合几个弱模型(通常是决策树)来构建强大的预测模型。

  • 决策树:一种类似树的模型,在叶节点处给出标签,并根据特征在每个内部节点处做出决策。

  • LightGBM:微软开发了一种名为 LightGBM 的梯度提升框架,可以高效地训练决策树,用于各种机器学习用途。

传统的逐级树生长

了解决策树和不同梯度提升框架中使用的传统逐级树生长方法,对于逐叶开发是必要的。随着树越长越深,树在每一层都会水平分裂,形成一棵更宽、更浅的树。在梯度提升中开发决策树的最流行方法是逐层树构建方法。

在进入树的下一层之前,它会在同一层或深度上生长每个节点。优化目标函数的理想特征和限制将根节点分为两个子节点。之后,对每个子节点执行相同的过程,直到满足初始标准(如最大深度、最小样本量或最小改进)。逐层树开发技术确保树是平衡的,并且每个叶子的深度相同。

逐叶树生长

逐叶树生长方法是在梯度提升中创建决策树的另一种方法。

它的工作原理是生长树上所有叶子中分裂回报最多的叶节点。通过选择最大化目标函数的特征和级别,将根节点拆分为两个子节点。接下来,通过选择其中一个子节点作为下一个要拆分的叶子,重复该过程,直到达到停止标准(如最大深度、最大叶子数或最小改进)。即使采用逐叶树开发策略,树也可能不平衡或叶子的深度都相同。

LightGBM 使用逐叶增长而不是深度增长。使用这种方法,可以生成更深更小的树,因为算法会选择提供最大损失函数减少的叶节点。与深度增长相比,这种策略可以用更少的节点生成更准确的模型。

叶级增长的工作原理是什么?

让我们深入讨论叶级增长策略 −

  • 在 LightGBM 中,所有训练数据最初都保存在单个根节点上。

  • LightGBM 计算节点可能出现的每种拆分方案的潜在增益或模型性能的提升。

  • LightGBM 通过选择增益最大的拆分将原始节点分成两个新叶子。

  • 与在每一级拆分所有节点的级别增长不同,叶级增长将通过选择(所有当前叶子中)增益最大的叶子并将其拆分来进行。此过程持续进行,直到满足停止条件(如最大树深度、最小增益或叶子中的最小样本数)。

逐叶生长的优势

以下是 LightGBM 中逐叶生长的一些优势 −

  • 更准确:逐叶生长通常提供更好的精度,因为它积极地针对树中可以提供更高精度的部分。

  • 效率:LightGBM 运行速度更快,因为它不会浪费能量在对减少损失没有实际影响的扩展叶子上。

逐叶生长的缺点

以下是 LightGBM 中逐叶生长的一些缺点 −

  • 过度拟合:由于树的一侧可能长得很深,如果数据不确定或很小,则更容易过度拟合。为了帮助最大限度地减少这种情况,LightGBM 提供了 max_depth 和 min_child_samples 等参数。

  • 内存使用不平衡:树的生长可能不均衡,导致内存使用情况不同,并对特定程序造成挑战。

控制叶级生长的关键参数

下面列出了一些关键参数,您可以在 LightGBM 中的叶级树生长中使用它们 −

  • num_leaves:定义树允许拥有的最大叶子数。更多叶子可以提高准确率,尽管它们可能导致过度拟合。

  • min_child_samples:每片叶子所需的最低数据量。增加此值可以减少过度拟合。

  • max_depth:树的最大深度。控制树的深度,并有能力防止它变得太深。

  • learning_rate:控制训练步骤的大小。尽管需要更多 boosting 循环,但较低的值可以产生更好的结果。

LightGBM 逐叶树生长示例

这里有一个简单的示例来展示 LightGBM 如何使用逐叶生长 −

import lightgbm as lgb
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 生成合成数据集
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, random_state=42)

# 拆分数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 为 LightGBM 创建数据集
train_data = lgb.Dataset(X_train, label=y_train)

# 具有叶级增长的 LightGBM 参数
params = {
    'objective': 'binary',
    'boosting_type': 'gbdt', # 梯度提升决策树
    'num_leaves': 31, # 控制复杂度(叶子数量)
    'learning_rate': 0.05,
    'metric': 'binary_logloss',
    'verbose': -1
}

# 训练模型
gbm = lgb.train(params, train_data, num_boost_round=100)

# 预测并评估
y_pred = gbm.predict(X_test)
y_pred_binary = [1 if p > 0.5 else 0 for p in y_pred]
print(f"准确率:{accuracy_score(y_test, y_pred_binary):.4f}")

输出

上述LightGBM模型的结果为:

准确率:0.9450

逐叶树生长与逐层树生长

以下是逐层树生长方法与逐叶树生长方法的比较 −

标准 逐层树生长 逐叶树生长 (LightGBM)
生长模式 逐级添加节点,平等扩展当前深度的所有叶子。 将节点添加到增益最大的叶子,每次关注一片叶子。
树结构 生成对称树,所有叶子都在同一层。 生成不对称树,某些分支可以生长得更深。
贪婪 贪婪程度较低,因为它考虑了每一层的所有可能分裂。 贪婪程度较高,因为它关注最有希望分裂的叶子。
效率 通常更节省内存,但可能需要更长时间才能找到最佳分割。 更有效地找到最佳分割,但由于树更深,可能会使用更多内存。
准确性 可能无法快速找到最佳分割,从而可能导致准确性降低。 由于专注于最重要的分割,通常会提高准确性。
过度拟合风险 由于树以平衡的方式生长,因此过度拟合的风险较低。 由于生长深度较深,过度拟合的风险较高,尤其是在有噪声数据的情况下。
用例 适用于小型数据集或内存使用量令人担忧的情况。 适用于准确性至关重要的大型数据集优先级。