LightGBM - 与其他 Boosting 算法的比较

LightGBM 也适用于分类数据集,因为它使用拆分或分组方法处理分类特征。我们将所有分类特征转换为类别数据类型,以便与 LightGBM 中的分类特征交互。完成后,分类数据将自动处理,无需手动管理。

LightGBM 使用 GOSS 方法在训练决策树时对数据进行采样。此方法设置每个数据样本的方差并按降序排列。方差较小的数据样本已经表现良好,因此在对数据集进行采样时,它们的权重会较低。

因此,在本章中,我们将重点介绍增强算法之间的差异,并将它们与 LightGBM 进行比较。

您应该使用哪种增强算法?

现在,问题很简单:如果这些机器学习算法都表现良好、速度快且精度更高,您应该选择哪一种?!!

这些问题的答案不能是单一的增强策略,因为每种策略都最适合您将要处理的问题类型。

例如,如果您认为您的数据集需要正则化,那么您绝对可以使用 XGBoost。CatBoost 和 LightGBM 是处理分类数据的不错选择。如果您需要更多社区对该方法的支持,请探索多年前开发的 XGBoost 或 Gradient Boosting 等算法。

Boosting 算法之间的比较

将数据拟合到模型后,所有策略都提供相对相似的结果。与其他算法相比,LightGBM 的表现似乎较差,但 XGBoost 在这种情况下表现良好。

为了展示每种算法在相同数据上的表现,我们可以展示它们的 y_test 和 y_pred 值的图表。

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# 示例数据
y_test = np.linspace(0, 100, 100)

# 带有一些噪声的预测
y_pred1 = y_test + np.random.normal(0, 10, 100)
y_pred2 = y_test + np.random.normal(0, 8, 100)
y_pred3 = y_test + np.random.normal(0, 6, 100)
y_pred4 = y_test + np.random.normal(0, 4, 100)
y_pred5 = y_test + np.random.normal(0, 2, 100)

fig, ax = plt.subplots(figsize=(11, 5))

# 绘制每个模型的预测
sns.lineplot(x=y_test, y=y_pred1, label='GradientBoosting', ax=ax)
sns.lineplot(x=y_test, y=y_pred2, label='XGBoost', ax=ax)
sns.lineplot(x=y_test, y=y_pred3, label='AdaBoost', ax=ax)
sns.lineplot(x=y_test, y=y_pred4, label='CatBoost', ax=ax)
sns.lineplot(x=y_test, y=y_pred5, label='LightGBM', ax=ax)

# 设置标签
ax.set_xlabel('y_test', color='g')
ax.set_ylabel('y_pred', color='g')

# 显示图表
plt.show()

输出

这是上述代码的结果 −

Boosting 算法比较

上图显示了每种方法预期的 y_test 和 y_pred 值。我们可以看到,与其他算法相比,LightGBM 和 CatBoost 的表现较差,因为它们预测的 y_pred 值比其他方法高得多或低得多。如图所示,XGBoost 和 GradientBoosting 在这些数据上的表现优于所有其他算法,预测结果似乎是所有算法的平均值。

不同 Boosting 算法之间的差异

以下是不同 Boosting 算法之间的表格差异 −

特征 梯度 Boosting LightGBM XGBoost CatBoost AdaBoost
推出年份 不是具体 2017 2014 2017 1995
处理分类数据 需要额外步骤,如独热编码 需要额外步骤 无需特殊步骤 自动处理 无需特殊步骤需要
速度/可扩展性 中等 快速 快速 中等 快速
内存使用率 中等 中等
正则化(防止过度拟合)
并行处理(一次运行多个任务)
GPU 支持(可以使用显卡)
功能重要性(显示哪些功能问题) 是的 是的 是的 是的 是的