LightGBM - 树生长策略



梯度提升框架 LightGBM 使用“叶节点优先”(leaf-wise)生长,这是一种新的树生长方法。在机器学习和数据分析中,决策树对于分类和回归都非常有用。LightGBM 的一个显著特点是其叶节点优先的树生长方法,这与大多数决策树学习算法使用的标准层级优先(level-wise)树生长技术不同。

在本章中,我们将了解叶节点优先的树生长方法和层级优先的树生长方法,并阐明它与大多数决策树学习算法使用的典型层级优先树生长策略的不同之处。

LightGBM 旨在有效地训练大型数据集并创建高精度的预测模型。在深入探讨层级优先和叶节点优先树生长之前,让我们先定义一些关键术语。

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

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

  • 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:控制训练步长的大小。尽管它需要更多的提升循环,但较低的值可以产生更好的结果。

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

# Generate synthetic dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, random_state=42)

# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Create a dataset for LightGBM
train_data = lgb.Dataset(X_train, label=y_train)

# Parameters for LightGBM with leaf-wise growth
params = {
   'objective': 'binary',
   'boosting_type': 'gbdt',  # Gradient Boosting Decision Tree
   'num_leaves': 31,         # Controls the complexity (number of leaves)
   'learning_rate': 0.05,
   'metric': 'binary_logloss',
   'verbose': -1
}

# Train the model
gbm = lgb.train(params, train_data, num_boost_round=100)

# Predict and evaluate
y_pred = gbm.predict(X_test)
y_pred_binary = [1 if p > 0.5 else 0 for p in y_pred]
print(f"Accuracy: {accuracy_score(y_test, y_pred_binary):.4f}")

输出

以上 LightGBM 模型的结果是

Accuracy: 0.9450

叶节点优先与层级优先树生长

以下是层级优先和叶节点优先树生长方法之间的比较 -

标准 层级优先树生长 叶节点优先树生长 (LightGBM)
生长模式 逐层添加节点,平等地扩展当前深度的所有叶子节点。 将节点添加到增益最大的叶子节点,一次专注于一个叶子节点。
树结构 生成对称树,所有叶子节点都在同一层。 生成非对称树,某些分支可以生长得更深。
贪婪性 不太贪婪,因为它考虑每一层的所有可能的分割。 更贪婪,因为它专注于下一个最有希望的叶子节点进行分割。
效率 通常更节省内存,但可能需要更长的时间来找到最佳分割。 在查找最佳分割方面更有效,但由于树更深,因此可能会使用更多内存。
准确性 可能无法快速找到最佳分割,可能导致准确性降低。 由于专注于最重要的分割,因此通常会产生更好的准确性。
过拟合风险 过拟合风险较低,因为树以平衡的方式生长。 过拟合风险较高,尤其是在数据嘈杂的情况下,因为生长更深。
使用场景 适用于小型数据集或内存使用量成为问题的情况。 适用于大型数据集,其中准确性是首要任务。
广告