最强比较!GBDT 与 LightGBM !!

文摘   2024-10-28 15:37   北京  

哈喽,我是cos大壮~

之前做了不少算法在不同情况下的对比,今天想要和大家聊聊的是关于 GBDT 与 LightGBM 的内容~

首先咱们从简单的一个介绍开始,GBDT 和 LightGBM 都属于梯度提升树模型,它们是集成学习中的一种方法,通过构建多个弱学习器(通常是决策树)来提升整体的预测效果。

这两者的核心思想是:每棵新树都在减少之前模型的误差,最终形成一个强大的模型。

老规矩如果大家伙觉得近期文章还不错!欢迎大家点个赞、转个发,文末赠送《机器学习学习小册》

文末可取本文PDF版本~

GBDT

GBDT通过多棵树的梯度加权提升来减少误差。其优点是高精度和较好的泛化能力,但缺点是训练速度较慢,尤其在处理大数据时。

LightGBM

LightGBM是GBDT的改进版本,通过优化树的构建过程,采用基于直方图的方法和叶子增长策略来大幅加速训练,同时降低内存消耗,因此更适合大规模数据和高维度问题。

核心原理

GBDT

原理

GBDT是一种集成学习算法,它使用多个决策树模型的加权组合来做预测。GBDT通过「梯度下降」来不断减少模型误差,以构建每一轮的树。在每一步,GBDT构建一个新的决策树,以当前模型的残差作为目标变量,逐步改进预测结果。

核心公式与解释

在GBDT中,每棵树都是在上一个模型的基础上学习残差。假设训练数据为,我们要训练一个模型以拟合目标

初始模型

设初始模型为常数模型(例如,均值),即:

其中是损失函数。

迭代更新

通过迭代构造新的决策树模型来更新。在第轮,构建一个决策树来拟合上一次预测的残差,即:

然后,利用残差来训练第棵树,以生成新的预测模型

模型更新

更新模型为:

其中是学习率,用于控制每棵树的贡献。

算法流程

初始化模型:设定初始预测模型。

迭代构建树

  • 在每轮迭代中,计算当前模型的残差。
  • 根据残差生成一个新的决策树以拟合该残差。
  • 将新树的预测结果加入到当前模型中,得到新的模型。

模型输出:迭代完成后输出最终模型。

优缺点

优点

  • 灵活性强:可以选择不同的损失函数。
  • 适合非线性问题:基于树的模型能处理复杂的非线性关系。

缺点

  • 训练时间较长,尤其是在深度树和大数据时。
  • 难以并行化:传统GBDT构建每棵树都依赖上一棵树的结果,因而难以进行并行化计算。

适用场景

适合:中小规模数据集、特征维度不特别高的情况。

不适合:数据量大且特征维度高的场景(在这种场景下性能较差,通常选择优化的LightGBM等算法)。

LightGBM

原理

LightGBM是基于GBDT的优化算法,目标是提高GBDT在大规模数据和高维特征下的性能。LightGBM使用了基于直方图的决策树算法,同时引入了多项优化技术如叶子增长策略等,从而大幅提升了计算效率。

核心公式与解释

LightGBM的核心优化集中在构建决策树的过程上,它使用了基于直方图的方法来计算分裂节点,从而加速训练过程:

直方图算法

将特征值离散化,分箱到直方图中,每个箱子代表一个特征值区间。这样在计算分裂时,只需计算箱子的分裂增益,而不是每个数据点,极大地减少了计算量。

叶子增长策略(Leaf-wise Growth)

与传统GBDT使用按层增长不同,LightGBM选择叶子增长策略,即在每次分裂时选择最能降低误差的叶子节点进行分裂,从而使得每次分裂都能最大限度地提升模型效果。

算法流程

特征值分箱:将连续特征值离散化到直方图。

迭代构建树

  • 每轮迭代中,从当前叶子中选择误差下降最多的叶子节点进行分裂。
  • 计算每个箱子的分裂增益并选择最优分裂。

更新模型:将新树的预测值加入当前模型。

输出模型:迭代完成后输出最终模型。

优缺点

优点

  • 速度快:采用直方图和叶子增长策略,计算效率高。
  • 内存使用低:直方图方法显著减少了内存消耗。
  • 适合大规模数据:适合高维特征和大规模数据场景。
  • 支持并行化:算法设计上支持并行计算。

缺点

  • 对小数据集可能过拟合。
  • 使用叶子增长策略可能导致不平衡的树结构,使模型的泛化能力下降。

适用场景

适合:大规模数据集、特征维度高的场景,特别是训练时间和资源消耗较多的任务。

不适合:数据量较小、对过拟合敏感的场景。

总结对比

特性GBDTLightGBM
核心思想迭代构建决策树,拟合残差基于直方图的快速GBDT
树构建策略按层生长(Level-wise)按叶子生长(Leaf-wise)
并行化较难支持
适用数据中小规模数据大规模数据,高维特征
优点模型灵活,能处理非线性关系训练快,资源使用低,适合高维和大数据
缺点训练时间长,难并行过拟合风险高,特别在小数据集

在实际应用中,一般来说,如果数据量较小且不需要特别快的训练速度,可以优先选择GBDT;而对于大数据场景,LightGBM则会提供显著的效率优势。

完整案例

问题描述:假设我们有一个分类任务,需要预测用户是否会进行某项购买行为。数据集中包含用户的浏览记录、兴趣偏好、购买习惯等多维特征。目标是通过模型预测购买概率,从而实现个性化推荐。

目标:比较GBDT与LightGBM在虚拟数据集上的性能与适用性。我们将通过准确率、训练时间和资源消耗等指标进行详细分析,并使用绘图直观地展示结果。

我们这里,使用虚拟数据生成一组多维分类数据,包括数值型和类别型特征。数据样本包含10000行,每行10个特征,其中5个为数值型,5个为类别型,目标变量是一个二分类标记。

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, roc_auc_score
from sklearn.datasets import make_classification
from sklearn.ensemble import GradientBoostingClassifier
import lightgbm as lgb
import time
import matplotlib.pyplot as plt
import seaborn as sns

# 设置随机种子以便复现
np.random.seed(42)

# 生成虚拟分类数据集
X, y = make_classification(n_samples=10000, n_features=10, n_informative=6
                           n_redundant=2, n_classes=2, random_state=42)

# 转换为DataFrame格式并模拟类别型特征
X = pd.DataFrame(X, columns=[f"feature_{i}" for i in range(10)])
for i in range(510):  # 将部分特征设为类别型
    X[f'feature_{i}'] = pd.cut(X[f'feature_{i}'], bins=4, labels=[0123])

# 分割训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

模型训练与评估

1. 使用GBDT进行训练

# 初始化GBDT模型
gbdt_model = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)

# 记录训练时间
start_time = time.time()
gbdt_model.fit(X_train, y_train)
gbdt_train_time = time.time() - start_time

# 评估GBDT模型
y_pred_gbdt = gbdt_model.predict(X_test)
y_proba_gbdt = gbdt_model.predict_proba(X_test)[:, 1]
gbdt_accuracy = accuracy_score(y_test, y_pred_gbdt)
gbdt_auc = roc_auc_score(y_test, y_proba_gbdt)

print(f"GBDT Accuracy: {gbdt_accuracy:.4f}")
print(f"GBDT AUC: {gbdt_auc:.4f}")
print(f"GBDT Training Time: {gbdt_train_time:.4f} seconds")

2. 使用LightGBM进行训练

# 准备LightGBM数据集
train_data = lgb.Dataset(X_train, label=y_train, categorical_feature=[f'feature_{i}' for i in range(510)])
test_data = lgb.Dataset(X_test, label=y_test, categorical_feature=[f'feature_{i}' for i in range(510)], reference=train_data)

# 设置参数
lgb_params = {
    'objective''binary',
    'boosting_type''gbdt',
    'metric': ['auc'],
    'num_leaves'31,
    'learning_rate'0.1,
    'verbose'-1
}

# 记录训练时间
start_time = time.time()
lgb_model = lgb.train(lgb_params, train_data, valid_sets=[test_data], num_boost_round=100, early_stopping_rounds=10, verbose_eval=False)
lgb_train_time = time.time() - start_time

# 评估LightGBM模型
y_proba_lgb = lgb_model.predict(X_test)
y_pred_lgb = (y_proba_lgb >= 0.5).astype(int)
lgb_accuracy = accuracy_score(y_test, y_pred_lgb)
lgb_auc = roc_auc_score(y_test, y_proba_lgb)

print(f"LightGBM Accuracy: {lgb_accuracy:.4f}")
print(f"LightGBM AUC: {lgb_auc:.4f}")
print(f"LightGBM Training Time: {lgb_train_time:.4f} seconds")

性能与适用性分析

我们将绘制以下三张图来帮助大家进行对比分析:

1. 训练时间对比:展示GBDT与LightGBM的训练时间差异。

2. 模型准确率对比:比较GBDT与LightGBM的准确率,衡量二者在测试集上的表现。

3. AUC对比:展示两种模型在测试集上的AUC评分,以反映其预测的稳健性。

# 绘制图形
fig, axes = plt.subplots(13, figsize=(186))

# 图1:训练时间对比
sns.barplot(x=['GBDT''LightGBM'], y=[gbdt_train_time, lgb_train_time], ax=axes[0], palette="viridis")
axes[0].set_title('Training Time Comparison')
axes[0].set_ylabel('Training Time (seconds)')

# 图2:模型准确率对比
sns.barplot(x=['GBDT''LightGBM'], y=[gbdt_accuracy, lgb_accuracy], ax=axes[1], palette="viridis")
axes[1].set_title('Accuracy Comparison')
axes[1].set_ylabel('Accuracy')

# 图3:AUC对比
sns.barplot(x=['GBDT''LightGBM'], y=[gbdt_auc, lgb_auc], ax=axes[2], palette="viridis")
axes[2].set_title('AUC Score Comparison')
axes[2].set_ylabel('AUC Score')

plt.tight_layout()
plt.show()

从上图我们可以看到:

1. 训练时间:LightGBM显著快于GBDT,表明在大数据集场景下LightGBM在训练效率上具有明显优势。

2. 准确率:在准确率方面,LightGBM与GBDT表现接近,LightGBM稍有优势,符合大数据环境下的预期表现。

3. AUC:两种模型在AUC上差异不大,LightGBM略高。

在本案例中,LightGBM在大数据集下显著提升了训练速度,同时保持了良好的准确率和AUC评分。通过选择LightGBM,模型可以在更短时间内实现同等甚至更优的预测效果,因此在实际应用中更适合用于大规模数据和高维特征的场景。

调参细节

参数调节方面,大家可以参考以下方式进行~

GBDT 调参

  • n_estimators:调整为100,控制树的数量。
  • learning_rate:设为0.1,平衡模型复杂性与训练时间。
  • max_depth:设置为3,避免模型过拟合。

LightGBM 调参

  • num_leaves:设为31,控制单棵树的复杂度。
  • learning_rate:设为0.1,与GBDT一致。
  • early_stopping_rounds:设为10,防止模型过拟合并加速训练。

最后

大家有问题可以直接在评论区留言即可~

喜欢本文的朋友可收藏、点赞、转发起来!

需要本文PDF的同学,扫码备注「最佳算法」即可~ 
关注本号,带来更多算法干货实例,提升工作学习效率!
最后,给大家准备了《机器学习学习小册》PDF版本16大块的内容,124个问题总结
100个超强算法模型,大家如果觉得有用,可以点击查看~

推荐阅读

原创、超强、精华合集
100个超强机器学习算法模型汇总
机器学习全路线
机器学习各个算法的优缺点
7大方面,30个最强数据集
6大部分,20 个机器学习算法全面汇总
铁汁,都到这了,别忘记点赞呀~


深夜努力写Python
Python、机器学习算法
 最新文章