XGboost 中的学习率 (eta)

2025年6月20日 | 阅读 10 分钟

什么是学习率?

学习率或步长是调节模型参数或权重在卷积神经网络 (CNN) 训练过程中如何改变的超参数。学习率对模型的性能和学习速度有很大影响。

模型适应错误的速度被称为学习率。机器学习 (ML) 的研究人员和开发人员通常使用 0.0 到 1.0 之间的值。

这个变量决定了模型在训练过程中调整其权重的程度。为了让人工智能 (AI) 模型能够快速稳定地学习,研究人员正努力寻找理想的学习率。

如果输入值太小,模型要么会卡住,要么学习速度慢。同样,如果值太大,模型会适应得太快,从而阻碍其产生准确的预测。

Learning Rate (eta) in XGboost

如前所述,模型的学习率决定了它在训练过程中如何调整其权重。研究人员和开发人员通常会尝试各种变量,看看哪个变量能提供最佳性能,以确定理想的学习率。

任何提供高学习率而不会导致不稳定的值都是理想的学习率。选择此数字的最终目标是通过最小化损失函数来提高模型的准确性,损失函数是 ML 模型预测输出与实际输出之间的差异。

什么是 XGBoost?

XGBoost (eXtreme Gradient Boosting) 是一个全球性的开源机器学习库,它使用梯度提升决策树,这是一种 监督学习 提升算法,利用 梯度下降。它以其速度、效率以及处理大型数据集的能力而闻名。

决策树用于处理涉及回归或分类的机器学习问题。在它们的层级树结构中,内部节点代表一个特征,分支代表一个决策规则,每个叶节点代表数据集的结果。

像提升这样的集成技术通常可以用来产生更鲁棒的模型,因为决策树容易过拟合。提升将多个弱树(或性能仅略好于随机的模型)组合成一个强学习器。通过依次训练每个弱学习器来纠正先前模型的错误。这需要数百个周期才能将弱学习者转化为强学习者。

提升算法和随机森林都是著名的集成学习方法,它们都使用单个学习者树来提高预测性能。随机森林背后的理念是装袋(bootstrap aggregating),其中每棵树都是独立训练的,然后聚合其预测。相比之下,提升算法使用加性方法,其中弱学习者被连续训练以纠正先前模型的错误。

XGBoost 的特点

以下概述了 XGBoost 在 Python 中的一些特性,这些特性使其与 scikit-learn2 的标准梯度提升包区别开来。

  • 分布式和并行计算:数据以块的形式存储在库中,这些块是内存单元。可以使用内存外的计算将单个块存储在外部内存中,或将它们分布在多个处理器上。XGBoost 还支持更复杂的用例,例如跨计算机集群进行分布式训练以加快计算速度。Apache Spark、Dask 或 Kubernetes 等工具也可用于以分布式形式实现 XGBoost。
  • 缓存感知预取算法:XGBoost 使用此技术来帮助缩短大型数据集的运行时间。在单台计算机上,该库的运行速度可以比当前使用的竞争框架快近 10 倍。由于其卓越的速度,XGBoost 是一个可扩展的树提升系统,能够以最少的资源处理数十亿个样本。
  • 与标准梯度提升相比,XGBoost 在学习目标中包含了正则化。还可以通过调整超参数来对数据进行正则化。此外,通过利用 XGBoost 的内置正则化,该库能够提供比标准 scikit-learn 梯度提升包更好的结果。
  • XGBoost 采用稀疏感知算法来处理稀疏数据,以处理缺失值。当数据集中某个值缺失时,算法会学习处理缺失值的最佳方向。然后将数据点归类到默认方向。

XGBoost 中的学习率

梯度提升是依次构建和添加树到模型的过程。为了纠正当前树序列所做预测中的剩余错误,会构建新的树。因此,模型在快速拟合训练数据集后可能会过拟合。

应用加权因子来调整新添加树所做的调整是减缓梯度提升模型学习过程的一种方法。根据技术或文献,这种权重被称为学习率或收缩因子。

当收缩因子设置为 1.0 时,朴素梯度提升等同于具有收缩的梯度提升。当值设置为低于 1.0 时,添加到模型的每棵树的调整都会更少。因此,需要将更多的树合并到模型中。

通常,值会低于 0.1,而适中的值在 0.1 到 0.3 之间。让我们看看一个典型机器学习数据集如何受到学习率的影响。

Otto 数据集

本文将使用 Otto Group 产品分类挑战数据集。

该数据集可在 Kaggle 上免费获取,但您需要先注册一个帐户才能下载。您可以从“数据”页面下载训练数据集 train.csv.zip,解压后将其放在您的工作目录中。

该数据集描述了约 61,000 件商品的 93 个隐藏细节,分为 10 个产品类别(时尚、电子产品等)。各种类型事件的计数是输入特征。

多类对数损失,也称为交叉熵,用于评估模型,并根据每个类别(共十个)的概率范围为新商品生成预测。

由于其非凡的样本量、复杂性和最小的数据准备(除了将文本类别变量编码为整数),该数据集对 XGBoost 来说是一个严峻的挑战。该竞赛于 2015 年 5 月结束。

XGBoost 学习率调优

使用 XGBoost 的 scikit-learn 包装器创建的梯度提升模型,可以通过调整 learning_rate 参数来控制新添加树的权重。

可以使用 scikit-learn 的网格搜索功能来评估使用不同学习率值训练梯度提升模型对对数损失的影响。

使用 Otto 数据集,我们将评估一系列标准学习率值,同时将树的数量保持在默认值 100。

将调查六种不同的学习率变体,每种变体将使用 10 折交叉验证进行评估。这意味着总共需要训练和评估 60 个 XGBoost 模型,即 6×10。

将提供产生最佳性能的值以及每种学习率的对数损失。

代码

注意:由于数值精度变化、算法的随机性或评估过程,您的结果可能会有所不同。请考虑多次运行示例,然后比较平均结果。

运行此示例时,将打印出评估过的学习率的对数损失以及最佳结果。

输出

 
Best: -0.001154 using {'learning_rate': 0.2}
-2.155497 (0.000082) with: {'learning_rate': 0.0001}
-1.841069 (0.000726) with: {'learning_rate': 0.001}
-0.597299 (0.000821) with: {'learning_rate': 0.01}
-0.001239 (0.001731) with: {'learning_rate': 0.1}
-0.001154 (0.001675) with: {'learning_rate': 0.2}
-0.001158 (0.001667) with: {'learning_rate': 0.3}   

有趣的是,0.2 是最优学习率。

这种快速的学习率增加了默认设置的 100 棵树可能不足以应付的可能性,应该增加树的数量。

学习率(反向)对数损失得分也可以绘制出来,尽管由于所选 learning_rate 值的对数 10 范围,大多数都会被压缩到图的左侧,接近零。

Learning Rate (eta) in XGboost

调整 XGBoost 的学习率和树的数量

通常需要将更多的树添加到模型中才能获得较小的学习率。

可以评估一组参数对来研究这种关系。学习率将在 log10 尺度上从 0.0001 变化到 0.1,决策树的数量将从 100 变化到 500。

n_estimators_arr = [100, 200, 300, 400, 500]

learning_rate_arr = [0.0001, 0.001, 0.01, 0.1]

有四个 learning_rate 变量和五个 n_estimator 变体。由于将使用 10 折交叉验证来评估每种组合,因此总共需要训练和评估 4x5x10 或 200 个 XGBoost 模型。

随着树的数量增加,在给定学习率下性能预计会提高,然后趋于平稳。完整的代码清单可在下方查看。

代码

注意:由于数值精度变化、算法的随机性或评估过程,您的结果可能会有所不同。请考虑多次运行示例,然后比较平均结果。

运行示例时,将打印出评估过的每对组合的对数损失以及最优组合。

输出

 
Best: -0.001151 using {'n_estimators': 300, 'learning_rate': 0.1}
-2.155497 (0.000081) with: {'n_estimators': 100, 'learning_rate': 0.0001}
-2.115542 (0.000159) with: {'n_estimators': 200, 'learning_rate': 0.0001}
-2.077213 (0.000233) with: {'n_estimators': 300, 'learning_rate': 0.0001}
-2.040387 (0.000304) with: {'n_estimators': 400, 'learning_rate': 0.0001}
-2.004956 (0.000373) with: {'n_estimators': 500, 'learning_rate': 0.0001}
-1.841068 (0.000716) with: {'n_estimators': 100, 'learning_rate': 0.001}
-1.572387 (0.000692) with: {'n_estimators': 200, 'learning_rate': 0.001}
-1.364542 (0.000699) with: {'n_estimators': 300, 'learning_rate': 0.001}
-1.196492 (0.000713) with: {'n_estimators': 400, 'learning_rate': 0.001}
-1.056686 (0.000728) with: {'n_estimators': 500, 'learning_rate': 0.001}
-0.597298 (0.000822) with: {'n_estimators': 100, 'learning_rate': 0.01}
-0.214312 (0.000929) with: {'n_estimators': 200, 'learning_rate': 0.01}
-0.080728 (0.000982) with: {'n_estimators': 300, 'learning_rate': 0.01}
-0.030532 (0.000949) with: {'n_estimators': 400, 'learning_rate': 0.01}
-0.011768 (0.001071) with: {'n_estimators': 500, 'learning_rate': 0.01}
-0.001238 (0.001730) with: {'n_estimators': 100, 'learning_rate': 0.1}
-0.001154 (0.001702) with: {'n_estimators': 200, 'learning_rate': 0.1}
-0.001152 (0.001704) with: {'n_estimators': 300, 'learning_rate': 0.1}
-0.001153 (0.001708) with: {'n_estimators': 400, 'learning_rate': 0.1}
-0.001153 (0.001708) with: {'n_estimators': 500, 'learning_rate': 0.1}   

正如我们所见,0.1 的学习率和 300 棵树产生了最佳结果。

较小的负对数损失结果和原始数据使得难以辨别趋势。每种学习率都绘制成一条系列线,说明随着树的数量变化,对数损失的性能。

Learning Rate (eta) in XGboost

随着树的数量增加,我们可以看到性能(反向对数损失)得到改善,正如总体趋势所预测的那样。

对于较小的学习率,性能通常较差,表明需要更多数量的树。我们可能需要添加更多的树,这可能会非常耗费计算资源。

图表巨大的 Y 轴比例模糊了 learning_rate=0.1 的结果。仅对于 learning_rate=0.1,我们可以提取性能指标并直接可视化它们。

代码

运行此代码时,性能随着添加树的数量而增加,然后在 400 到 500 棵树之间趋于平稳。

Learning Rate (eta) in XGboost

在本文中,您了解了收缩(也称为学习率),它是通过对添加到梯度提升模型中的新树进行加权而产生的。

特别是,您了解了

  • 引入学习率的目的是减缓模型适应训练数据的速度。
  • 如何在一系列学习率值上评估您的机器学习挑战。
  • 如何评估更改学习率和树的数量如何影响您的问题。