如何使用 XGBoost 开发随机森林集成

XGBoost 库提供了一种高效的梯度提升实现,可以配置为训练随机森林集成模型。

随机森林算法比梯度提升更简单。XGBoost 库允许以一种重用和利用库中为训练随机森林模型而实现的计算效率的方式来训练模型。

在本教程中,您将了解如何使用 XGBoost 库开发随机森林集成模型。

完成本教程后,您将了解:

  • XGBoost 提供了一种高效的梯度提升实现,可以配置为训练随机森林集成模型。
  • 如何使用 XGBoost API 为分类和回归训练和评估随机森林集成模型。
  • 如何调整 XGBoost 随机森林集成模型的超参数。

开始您的项目,阅读我的新书《Python 集成学习算法》,其中包含分步教程和所有示例的Python 源代码文件。

让我们开始吧。

How to Develop Random Forest Ensembles With XGBoost

如何使用 XGBoost 开发随机森林集成
照片作者:Jan Mosimann,保留部分权利。

教程概述

本教程分为五个部分;它们是:

  1. XGBoost 随机森林
  2. XGBoost 随机森林 API
  3. XGBoost 随机森林分类
  4. XGBoost 随机森林回归
  5. XGBoost 随机森林超参数

XGBoost 随机森林

XGBoost 是一个开源库,它提供了梯度提升集成算法的高效实现,简称为 Extreme Gradient Boosting 或 XGBoost。

因此,XGBoost 指的是项目、库和算法本身。

梯度提升是分类和回归预测建模项目的首选算法,因为它通常能获得最佳性能。梯度提升的问题在于训练模型通常非常慢,而且对于大型数据集来说这个问题会更加严重。

XGBoost 通过引入多种技术来解决梯度提升的速度问题,这些技术可以极大地加速模型的训练,并且通常能获得更好的模型整体性能。

您可以在本教程中了解更多关于 XGBoost 的信息

除了支持梯度提升,核心 XGBoost 算法还可以配置为支持其他类型的树集成算法,例如随机森林。

随机森林是决策树算法的集成。

每棵决策树都拟合在训练数据集的自助采样上。这是训练数据集的一个样本,其中一个给定的样本(行)可能被选择多次,称为有放回抽样。

重要的是,在树的每个分裂点会考虑输入变量(列)的随机子集。这确保了添加到集成中的每棵树都具有技能,但又以随机的方式不同。在每个分裂点考虑的特征数量通常是一个小子集。例如,在分类问题上,一个常见的启发式方法是选择等于总特征数平方根的特征数量,例如,如果数据集有 20 个输入变量,则选择 4 个。

您可以在本教程中了解更多关于随机森林集成算法的信息

使用 XGBoost 库训练随机森林集成的最大优势是速度。与原生 scikit-learn 实现等其他实现相比,它预计会快得多。

既然我们知道 XGBoost 支持随机森林集成,那么让我们来看看具体的 API。

想开始学习集成学习吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

XGBoost 随机森林 API

第一步是安装 XGBoost 库。

我建议使用 pip 包管理器,从命令行使用以下命令

安装完成后,我们可以在 Python 脚本中加载库并打印版本号,以确认它已正确安装。

运行脚本将加载 XGBoost 库并打印库版本号。

您的版本号应与此相同或更高。

XGBoost 库提供了两个包装类,允许将库提供的随机森林实现与 scikit-learn 机器学习库一起使用。

它们分别是用于分类和回归的 XGBRFClassifierXGBRFRegressor 类。

集成中使用的树的数量可以通过“n_estimators”参数设置,通常会增加此值,直到模型性能不再有进一步的提升。通常使用数百或数千棵树。

XGBoost 不支持为每棵决策树抽取自助采样。这是该库的一个限制。

相反,可以通过“subsample”参数指定训练数据集的子样本(不放回抽样),其值为 0.0 到 1.0(训练数据集中的行数的 100%)之间的百分比。建议使用 0.8 或 0.9 的值,以确保数据集足够大以训练有技能的模型,但又足够多样以引入一些集成多样性。

在训练模型时,每隔分裂点使用的特征数量可以通过“colsample_bynode”参数指定,该参数接受数据集列数的百分比,范围从 0.0 到 1.0(训练数据集中的输入行数的 100%)。

如果我们的训练数据集中有 20 个输入变量,并且分类问题的启发式方法是特征数量的平方根,那么这可以设置为 sqrt(20) / 20,即约 4 / 20 或 0.2。

您可以在此处了解有关如何为随机森林集成配置 XGBoost 库的更多信息

现在我们熟悉了如何使用 XGBoost API 定义随机森林集成模型,让我们看一些实际示例。

XGBoost 随机森林分类

在本节中,我们将研究为分类问题开发 XGBoost 随机森林集成模型。

首先,我们可以使用 make_classification() 函数 创建一个包含 1,000 个示例和 20 个输入特征的合成二元分类问题。

完整的示例如下所示。

运行示例会创建数据集并总结输入和输出组件的形状。

接下来,我们可以在此数据集上评估 XGBoost 随机森林算法。

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

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

注意:鉴于算法或评估程序的随机性,或者数值精度的差异,您的结果可能有所不同。可以尝试多次运行示例并比较平均结果。

在这种情况下,我们可以看到 XGBoost 随机森林集成模型取得了大约 89.1% 的分类准确率。

我们还可以使用 XGBoost 随机森林模型作为最终模型,并进行分类预测。

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

以下示例在我们的二元分类数据集上演示了这一点。

运行示例将 XGBoost 随机森林集成模型拟合到整个数据集上,然后用于对新数据行进行预测,就像在应用程序中使用模型一样。

现在我们熟悉了如何将随机森林用于分类,让我们看看回归的 API。

XGBoost 随机森林回归

在本节中,我们将研究为回归问题开发 XGBoost 随机森林集成模型。

首先,我们可以使用 make_regression() 函数 创建一个包含 1,000 个示例和 20 个输入特征的合成回归问题。

完整的示例如下所示。

运行示例会创建数据集并总结输入和输出组件的形状。

接下来,我们可以在此数据集上评估 XGBoost 随机森林集成模型。

与上一节一样,我们将使用重复 K 折交叉验证来评估模型,进行三次重复和 10 折。

我们将报告模型在所有重复和折叠上的平均绝对误差 (MAE)。scikit-learn 库将 MAE 设为负数,以便最大化而不是最小化。这意味着较大的负 MAE 更好,而完美模型的 MAE 为 0。

完整的示例如下所示。

运行示例将报告模型平均绝对误差的平均值和标准差。

注意:鉴于算法或评估程序的随机性,或者数值精度的差异,您的结果可能有所不同。可以尝试多次运行示例并比较平均结果。

在这种情况下,我们可以看到默认超参数的随机森林集成模型达到了大约 108 的 MAE。

我们还可以使用 XGBoost 随机森林集成模型作为最终模型,并进行回归预测。

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

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

运行示例将 XGBoost 随机森林集成模型拟合到整个数据集上,然后用于对新数据行进行预测,就像在应用程序中使用模型一样。

现在我们熟悉了如何开发和评估 XGBoost 随机森林集成模型,让我们来看看如何配置模型。

XGBoost 随机森林超参数

在本节中,我们将仔细研究一些您应该考虑为随机森林集成模型调整的超参数,以及它们对模型性能的影响。

探索树的数量

树的数量是为 XGBoost 随机森林配置的另一个关键超参数。

通常,树的数量会增加,直到模型性能趋于稳定。直觉可能认为更多的树会导致过拟合,但事实并非如此。考虑到学习算法的随机性,装袋和随机森林算法似乎在一定程度上能抵抗对训练数据集的过拟合。

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

下面的示例探讨了树的数量对性能的影响,取值范围在 10 到 1,000 之间。

运行示例首先报告了每个配置的树数量的平均准确率。

注意:鉴于算法或评估程序的随机性,或者数值精度的差异,您的结果可能有所不同。可以尝试多次运行示例并比较平均结果。

在这种情况下,我们可以看到性能在约 500 棵树后开始上升并保持平稳。平均准确率分数在 500、1,000 和 5,000 棵树之间波动,这可能是统计噪声。

为每个配置的树数量创建了准确率分数的箱线图。

Box Plots of XGBoost Random Forest Ensemble Size vs. Classification Accuracy

XGBoost 随机森林集成大小与分类准确率的箱线图

探索特征数量

对于每个分裂点随机采样的特征数量可能是配置随机森林最重要的特征。

它通过“colsample_bynode”参数设置,该参数接受从 0 到 1 的输入特征数量的百分比。

下面的示例探讨了在每个分裂点随机选择的特征数量对模型准确率的影响。我们将尝试从 0.0 到 1.0 的值,增量为 0.1,尽管我们预计低于 0.2 或 0.3 的值将产生良好或最佳性能,因为这相当于输入特征数量的平方根,这是一个常见的启发式方法。

运行示例首先报告了每个特征集数量的平均准确率。

注意:鉴于算法或评估程序的随机性,或者数值精度的差异,您的结果可能有所不同。可以尝试多次运行示例并比较平均结果。

在这种情况下,我们可以看到随着集成成员使用更多的输入特征,平均模型性能呈下降趋势。

结果表明,在这种情况下,推荐值 0.2 将是一个不错的选择。

为每个特征集数量的准确率分数分布创建了箱线图。

我们可以看到,随着决策树考虑的特征数量的增加,性能呈下降趋势。

Box Plots of XGBoost Random Forest Feature Set Size vs. Classification Accuracy

XGBoost 随机森林特征集大小与分类准确率的箱线图

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

教程

API

总结

在本教程中,您了解了如何使用 XGBoost 库开发随机森林集成模型。

具体来说,你学到了:

  • XGBoost 提供了一种高效的梯度提升实现,可以配置为训练随机森林集成模型。
  • 如何使用 XGBoost API 为分类和回归训练和评估随机森林集成模型。
  • 如何调整 XGBoost 随机森林集成模型的超参数。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

掌握现代集成学习!

Ensemble Learning Algorithms With Python

在几分钟内改进您的预测

...只需几行python代码

在我的新电子书中探索如何实现
使用 Python 实现集成学习算法

它提供**自学教程**,并附有关于以下内容的**完整工作代码**:
堆叠、投票、提升、装袋、混合、超级学习器等等……

将现代集成学习技术带入
您的机器学习项目


查看内容

22 条对《如何使用 XGBoost 开发随机森林集成模型》的回复

  1. TLM 2021年1月3日 上午4:20 #

    嗨,Jason,
    好文!
    我唯一的观察
    使用时间序列交叉验证,我发现我的数据集的最佳超参数是 n_estimators=2 和 max_depth=24。这与默认参数非常不同,所以我感到很惊讶。
    此致!

  2. Anthony The Koala 2021年3月13日 下午4:27 #

    尊敬的Jason博士,
    当我运行“XGBoost 随机森林分类”标题下的代码时,在尝试拟合模型时会收到以下错误

    程序产生此“错误”消息

    注释:’
    * 代码是直接复制您在 Spyder IDE 中输入的代码。
    * 包版本

    总而言之,我复制了相同的代码来做一个预测,但在拟合模型 fit.model(X,y) 时遇到了这个错误。

    为什么?

    谢谢你,
    悉尼的Anthony
    注意事项
    * 我将相同的代码复制到了我的 Spyder IDE 中。

    • Jason Brownlee 2021年3月14日 上午5:24 #

      这看起来像是一个警告而不是错误,我猜你可以忽略它。

  3. Anthony The Koala 2021年3月13日 下午5:00 #

    尊敬的Jason博士,
    当我复制相同的代码并尝试执行 model.fit(X,y) 时,我得到的错误是

    谢谢你,
    悉尼的Anthony

    • Anthony The Koala 2021年3月13日 下午5:30 #

      尊敬的Jason博士,
      这是在不移动水平滚动条的情况下出现的错误

      [16:58:45] 警告:C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: XGBoost 1.3.0 起,目标 'binary:logistic' 的默认评估指标已从 'error' 更改为 'logloss'。如果您想恢复旧行为,请明确设置 eval_metric。

      谢谢你
      悉尼的Anthony

  4. Anthony The Koala 2021年3月14日 下午2:21 #

    尊敬的Jason博士,
    谢谢你的回复。
    我无法根据警告中的建议“关闭”警告消息。

    这是使用 XGBoost 的随机森林分类器的代码片段。

    这是输出

    两点
    (1) 要消除警告消息,请在实例化随机森林分类器时将两个参数设置为“use_label_encoder=False,eval_metric=’logloss’”

    (2) 在进行预测时,将列表转换为数组。否则计算机将产生错误消息

    为了纠正这个问题,将列表转换为数组

    结论
    要预测输出,拟合 XGBoost 使用的值的输入需要将列表“row”转换为数组。

    谢谢你,
    悉尼的Anthony

    • Jason Brownlee 2021年3月15日 上午5:53 #

      也许是库版本的问题或故障?
      也许你可以在 stackoverflow 或 xgboost 的 github issues tab 上搜索/发帖?

      • Anthony The Koala 2021年3月15日 上午6:10 #

        尊敬的Jason博士,
        只需要做两件事:
        (1) 在模型实例化时,为了停止警告,添加两个参数
        use_label_encoder=False,和 metric = ‘logloss’

        model = XGBRFClassifier(n_estimators=100, subsample=0.9, colsample_bynode=0.28,use_label_encoder=False,eval_metric=’logloss’)

        (2) 用于预测 yhat 的输入数据 ‘row’ 必须是数组,而不是列表。
        row = [[-8.52381793,5.24451077,-12.14967704,-2.92949242,0.99314133,0.67326595,-0.38657932,1.27955683,-0.60712621,3.20807316,0.60504151,-1.38706415,8.92444588,-7.43027595,-2.33653219,1.10358169,0.21547782,1.05057966,0.6975331,0.26076035]]
        # 将列表 row 转换为数组
        from numpy import asarray
        row = asarray(row)
        print(“predict – watch the output”)
        yhat = model.predict(row)

        谢谢你,
        悉尼的Anthony

  5. Cong Zhang 2021年3月18日 下午6:11 #

    对于 XGBRF,我仍然有些疑问。XGBRF 使用随机森林作为框架,并以 XGBoost 算法作为基础学习器来构建模型。可以这样理解吗?

    • Jason Brownlee 2021年3月19日 上午6:17 #

      不完全是。“xgboost”模型可以配置为“做”随机森林。

  6. Angelos Chatzimparmpas 2021年3月25日 上午12:13 #

    你好 Jason,

    感谢这篇优秀的教程。

    - 您知道 XGBoost 中的随机森林是否比 ExtraTrees(https://scikit-learn.cn/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html)在计算时间上更快吗?

    - 是否可以从这个组合实现中提取/导出规则(就像分别使用 XGBoost 和随机森林一样)?

    感谢您的回复!

    /Angelos

    • Jason Brownlee 2021年3月25日 上午4:45 #

      不确定,我猜是。

      抱歉,我不知道如何从树的集成中提取规则。

      • Angelos Chatzimparmpas 2021年3月25日 下午7:40 #

        再次问好,

        感谢您之前的回复。两个后续问题

        - 您认为使用贝叶斯优化(BO)来搜索您在此处提出的方法中的超参数是否有意义?

        - 如果我单独使用 BO 来调整 XGBoost 算法,相同的参数是否也适用于 XGBoost 的随机森林,或者这需要一个完全不同的超参数优化过程?

        /Angelos

        • Jason Brownlee 2021年3月26日 上午6:23 #

          当然,试试看。

          最好直接在数据上调整模型,而不是使用代理。

  7. Akshay 2021年6月17日 下午6:11 #

    嗨,在使用 sklearn RandomForestClassifier 和 XGBoost XGBRFClassifier 时是否可能获得不同的分数?还是我做错了什么?

  8. Muhammad Zakir Khan 2021年11月3日 上午3:43 #

    嗨 Jason,你能用 KFold 交叉验证而不是 train test 来计算 Precision 和 Recall 值吗?

    • Adrian Tam
      Adrian Tam 2021年11月7日 上午7:21 #

      这应该很简单。只需计算 K 折中每个折的精确率和召回率,然后取平均值。取决于您使用的库,K 折交叉验证函数可能已经自动为您完成了平均。

  9. Thomas B. 2024年1月19日 上午10:17 #

    嗨,Jason,

    有没有办法提取测试数据的每一行的单独树预测?这对于分析预测分布而不是仅仅依赖点估计会很有用。

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。