全文链接:https://tecdat.cn/?p=36275

原文出处:拓端数据部落公众号

Light Gradient Boosted Machine(简称LightGBM)是一个开源库,它为梯度提升算法提供了高效且有效的实现。

LightGBM通过添加一种自动特征选择的方式,并专注于提升具有较大梯度的样本,来扩展梯度提升算法。这可以显著加速训练过程并提高预测性能。

Light Gradient Boosted Machine算法

梯度提升是指一类可用于分类或回归预测建模问题的集成机器学习算法。

集成模型由决策树模型构建而成。树模型被逐个添加到集成中,并用于纠正先前模型产生的预测错误。这是一种被称为提升的集成机器学习模型类型。

模型使用任何可微分的损失函数和梯度下降优化算法进行拟合。这种技术之所以被称为“梯度提升”,是因为在模型拟合过程中,损失梯度被最小化,这与神经网络类似。

LightGBM由Guolin Ke等人在2017年的论文《LightGBM: 一个高效的梯度提升决策树》中进行了描述。该实现引入了两个关键思想:GOSS和EFB。

基于梯度的单侧采样(Gradient-based One-Side Sampling),简称GOSS,是梯度提升方法的一种改进,它专注于那些导致较大梯度的训练样本,从而加速学习并降低方法的计算复杂度。

通过GOSS,我们排除了具有较小梯度的数据实例的很大一部分,而仅使用其余部分来估计信息增益。我们证明,由于具有较大梯度的数据实例在信息增益的计算中扮演更重要的角色,因此GOSS可以用较小的数据量相当准确地估计信息增益。

— LightGBM: 一个高效的梯度提升决策树,2017年。

这两个改进一起可以将算法的训练时间加速高达20倍。因此,可以将LightGBM视为加入了GOSS和EFB的梯度提升决策树(GBDT)。

我们将加入GOSS和EFB的新GBDT实现称为LightGBM。我们在多个公开数据集上的实验表明,LightGBM将传统GBDT的训练过程加速高达20倍以上,同时几乎保持相同的准确性。

—— 《LightGBM:一种高效的梯度提升决策树》,2017年

如何开发轻量级梯度提升机(LightGBM)集成

LightGBM通过在梯度提升算法中添加一种自动特征选择,并专注于对具有较大梯度的样本进行提升,从而实现了训练速度的显著提升和预测性能的改善。

因此,LightGBM已成为处理表格数据进行回归和分类预测建模任务的机器学习竞赛中的实际算法。因此,它与其他梯度提升方法(如极限梯度提升XGBoost)一同,为梯度提升方法的普及和广泛采用做出了一定的贡献。

Light Gradient Boosted Machine算法

梯度提升是指一类可用于分类或回归预测建模问题的集成机器学习算法。

集成模型由决策树模型构建而成。树模型被逐个添加到集成中,并对先前模型产生的预测误差进行修正。这是一种被称为boosting的集成机器学习模型类型。

模型使用任何可微分的损失函数和梯度下降优化算法进行拟合。这使得该技术被称为“梯度提升”,因为在模型拟合过程中,损失梯度被最小化,这与神经网络非常相似。

LightGBM由Guolin Ke等人在2017年的论文《LightGBM:一种高效的梯度提升决策树》中进行了描述。该实现引入了两个关键思想:GOSS和EFB。

基于梯度的单边采样(Gradient-based One-Side Sampling),简称GOSS,是对梯度提升方法的一种改进,它主要关注那些导致较大梯度的训练样本,从而加快学习速度并降低方法的计算复杂度。

通过GOSS,我们排除了具有较小梯度的数据实例的很大一部分,仅使用剩余部分来估计信息增益。我们证明,由于具有较大梯度的数据实例在计算信息增益中起着更重要的作用,因此GOSS能够以较小的数据量获得相当准确的信息增益估计。

—— 《LightGBM:一种高效的梯度提升决策树》,2017年

独占特征捆绑(Exclusive Feature Bundling),简称EFB,是一种用于捆绑稀疏(大多为零)且互斥的特征的方法,例如已经被独热编码的类别变量输入。因此,它是一种自动特征选择的方法。

……我们捆绑互斥的特征(即,它们很少同时取非零值),以减少特征的数量。

—— 《LightGBM:一种高效的梯度提升决策树》,2017年

这两个改进一起可以将算法的训练时间加速高达20倍。因此,可以将LightGBM视为加入了GOSS和EFB的梯度提升决策树(GBDT)。

我们称我们新实现的具有GOSS和EFB的GBDT为LightGBM。我们在多个公开数据集上的实验表明,LightGBM在几乎保持相同准确率的同时,将传统GBDT的训练过程加速了超过20倍。

—— 《LightGBM:一种高效的梯度提升决策树》,2017年

LightGBM的Scikit-Learn API

如果尚未安装LightGBM库,可以将其作为独立库进行安装,并使用scikit-learn API开发LightGBM模型。

第一步是安装LightGBM库(如果尚未安装)。在大多数平台上,这可以通过pip Python包管理器实现;

你的版本应该相同或更高。如果不是,你必须升级你的LightGBM库版本。

image.png

两种模型的操作方式相同,并且都接受相同的参数来影响决策树的创建和添加到集成中的方式。

在模型构建中使用了随机性。这意味着每次算法在相同的数据上运行时,都会生成一个略有不同的模型。

当使用具有随机学习算法的机器学习算法时,一种好的做法是通过多次运行或重复交叉验证的平均性能来评估它们。在拟合最终模型时,可能希望增加树的数量,直到模型在重复评估中的方差减少,或者拟合多个最终模型并平均它们的预测。

接下来,我们来看看如何为分类和回归问题开发LightGBM集成。

LightGBM分类集成

在本节中,我们将查看如何使用LightGBM处理分类问题。
完整的示例如下所示。

测试分类数据集


    # 概括数据集  

    print(X.shape, y.shape)

运行上述示例将创建数据集,并概括输入和输出组件的形状。

image.png
接下来,我们可以在这个数据集上评估LightGBM算法。

我们将使用具有三次重复和10个折叠的重复分层k折交叉验证来评估模型。我们将报告模型在所有重复和折叠上的准确率的均值和标准差。

评估LightGBM分类算法




    # 评估模型  

    cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, 
        

运行此示例将报告模型的平均准确率和标准差。

在这种情况下,我们可以看到使用默认超参数的LightGBM集成在这个测试数据集上达到了约92.5%的分类准确率。

image.png

我们也可以使用LightGBM模型作为最终模型,并为分类任务进行预测。

首先,LightGBM集成模型会在所有可用数据上进行拟合,然后可以调用predict()函数对新数据进行预测。

下面的示例在我们的二元分类数据集上展示了这一过程。

运行这个示例会在整个数据集上拟合LightGBM集成模型,然后用其来预测新数据行的类别,这类似于在实际应用中使用模型时的情形。

现在我们已经熟悉了使用LightGBM进行分类,接下来让我们看看用于回归的API。

LightGBM集成用于回归

在本节中,我们将探讨如何使用LightGBM来解决回归问题。

示例如下。



    # 概括数据集  

    print(X.shape, y.shape)

运行该示例将创建数据集,并概述输入和输出组件的形状。

image.png

接下来,我们可以在这个数据集上评估LightGBM算法。

和上一节一样,我们将使用重复k折交叉验证来评估模型,具体是3次重复和10折。我们将报告模型在所有重复和折上的平均绝对误差(MAE)。在scikit-learn库中,MAE是负的,因此它是被最大化而不是最小化的。这意味着更大的负MAE值表示模型性能更好,而完美的模型具有0的MAE。

完整的示例如下。

评估LightGBM集成用于回归


    n_scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, 

运行此示例将报告模型的平均和标准差准确度。

在此情况下,我们可以看到使用默认超参数的LightGBM集成实现了约60的MAE。

image.png

我们还可以将LightGBM模型用作最终模型,并为回归任务进行预测。

首先,LightGBM集成会在所有可用数据上进行拟合,然后可以调用predict()函数对新数据进行预测。

下面的示例在我们的回归数据集上展示了这一点。

梯度提升LightGBM用于回归预测



    yhat = model.predict([row])  

    print('预测值: %d' % yhat[0])

运行此示例将在整个数据集上拟合LightGBM集成模型,并随后用于对新的一行数据进行预测,这类似于在实际应用中使用该模型时的情况。

现在我们已经熟悉了使用scikit-learn API来评估和使用LightGBM集成模型,接下来让我们看看如何配置模型。

LightGBM超参数

在本节中,我们将更详细地探讨一些你应该考虑为LightGBM集成调整的超参数以及它们对模型性能的影响。

对于LightGBM,我们可以查看许多超参数,但在这里,我们将关注树的数量和树的深度、学习率以及提升类型。

探索树的数量

LightGBM集成算法的一个重要超参数是集成中使用的决策树的数量。

请注意,决策树是按顺序添加到模型中的,以纠正并改进先前树所做的预测。因此,通常更多的树会更好。

树的数量可以通过“n_estimators”参数进行设置,其默认值为100。

下面的示例将探讨树的数量在10到5,000之间的效果。

探索LightGBM中决策树数量对性能的影响



    # 评估模型并保存结果  

    results, names = list(), list()  

    for name, model in models.items():  

        scores = evaluate_model(model)  

    
        

运行此示例时,首先会报告为每个配置的决策树数量配置的模型的平均准确率。

在这种情况下,我们可以看到在这个数据集上,随着树的数量增加到大约500棵,性能会有所提升,之后性能似乎趋于稳定。

image.png

为每个配置的树的数量生成的箱线图展示了准确率得分的分布情况。

我们可以看到模型性能和集成大小的一般趋势是增加的。

探索树深度

改变添加到集成中的每棵树的深度是梯度提升算法的另一个重要超参数。

树的深度控制着每棵树对训练数据集的专门化程度:它可能有多通用或多过拟合。

梯度提升算法通常在使用具有适中深度的树时表现良好,这些树在技能与泛化能力之间找到了平衡。

树的深度通过“max_depth”参数进行控制,其默认值为未指定,因为控制树复杂度的默认机制是使用叶节点数量。

控制树复杂度的主要方式有两种:树的最大深度和树中终端节点(叶节点)的最大数量。在这种情况下,我们正在探索叶节点的数量,因此需要通过设置“num_leaves”参数来增加叶节点数量以支持更深的树。

下面的示例探讨了树深度在1到10之间变化时对模型性能的影响。

运行示例后,将首先报告每个配置的树深度的平均准确率。

在这种情况下,我们可以看到随着树深度的增加,性能也在提高,可能一直到10层。探索更深的树可能会很有趣。

image.png

为每个配置的树深度创建了准确率得分的箱线图。

我们可以看到,随着树深度增加到5层,模型性能总体呈上升趋势,之后性能开始趋于稳定。

探索学习率

学习率控制每个模型对集成预测的贡献程度。

较小的学习率可能需要集成中更多的决策树。

可以通过“learning_rate”参数控制学习率,其默认值为0.1。

以下示例探索了学习率,并比较了0.0001到1.0之间的值的影响。

探索LightGBM学习率对性能的影响




    # 绘制模型性能比较图  

    pyplot.boxplot(results, labels=names, showmeans=True)  

    pyplot.show()

运行该示例首先报告了每个配置的学习率的平均准确率。

在本例中,我们可以看到较大的学习率在该数据集上获得了更好的性能。我们预期,对于较小的学习率,向集成中添加更多的树将进一步提高性能。

image.png

为每个配置的学习率生成的准确率得分的箱线图(Box-and-Whisker Plot)如下所示。

我们可以看到,随着学习率的增加,模型性能呈现出总体上升的趋势,直至达到较大的值1.0。

探索提升类型

LightGBM的一个特性是支持多种不同的提升算法,这些算法被称为提升类型(Boosting Type)。

提升类型可以通过“boosting_type”参数指定,该参数接受一个字符串来指定类型。选项包括:

  • gbdt’:梯度提升决策树(Gradient Boosting Decision Tree,GDBT)。
  • dart’:基于Dropout的多重加性回归树(Dropouts meet Multiple Additive Regression Trees,DART)。
  • goss’:基于梯度的单边采样(Gradient-based One-Side Sampling,GOSS)。

默认是GDBT,即经典的梯度提升算法。DART 算法是在 2015 年的一篇论文中提出的,标题为 “DART:Dropouts meet Multiple Additive Regression Trees”,该算法将深度学习中的 dropout 概念与 Multiple Additive Regression Trees (MART) 算法相结合,MART 算法是梯度提升决策树的前身。

这个算法有多个名称,包括 Gradient TreeBoost、boosted trees 和 Multiple Additive Regression Trees (MART)。我们使用后者来指代该算法。

— DART:Dropouts meet Multiple Additive Regression Trees, 2015.

GOSS 算法则是在 LightGBM 论文和库中引入的,该方法旨在仅使用导致大错误梯度的实例来更新模型,并丢弃其余实例。

… 我们排除了一大部分小梯度的数据实例,只使用剩余的实例来估计信息增益。

— LightGBM:A Highly Efficient Gradient Boosting Decision Tree, 2017.

下面的示例比较了 LightGBM 在合成分类数据集上的三个关键 boosting 技术。

以下是一个使用LightGBM算法进行分类任务的示例代码:



# 使用交叉验证评估模型
def evaluate_model(model):
    cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, 
    
    

运行示例代码后,首先报告每种配置的boosting类型的平均准确率。

注意:由于算法或评估过程的随机性,或者数值精度的差异,结果可能会有所不同。考虑多次运行示例代码并比较平均结果。

在这个案例中,我们可以看到默认的boosting方法比其他两种技术的性能更好。

image.png

然后,创建了一个箱形图,以比较每种配置的boosting方法的准确率分布。

image.png

CCUS-1536x15361.jpg


拓端tecdat
195 声望46 粉丝