如何在 Python 中开发您的第一个 XGBoost 模型

XGBoost 是梯度提升决策树的一种实现,旨在提高速度和性能,在竞争性机器学习中占据主导地位。

在这篇文章中,您将了解如何在 Python 中安装并创建您的第一个 XGBoost 模型。

阅读本文后,您将了解

  • 如何在您的系统上安装 XGBoost 以在 Python 中使用。
  • 如何准备数据并训练您的第一个 XGBoost 模型。
  • 如何使用您的 XGBoost 模型进行预测。

通过我的新书《XGBoost With Python启动您的项目,其中包括所有示例的分步教程Python 源代码文件。

让我们开始吧。

  • 2017 年 1 月更新:已更新以反映 scikit-learn API 0.18.1 版本中的更改。
  • 2017 年 3 月更新:添加了缺失的导入,使导入更清晰。
  • 2018 年 3 月更新:添加了下载数据集的备用链接。
How to Develop Your First XGBoost Model in Python with scikit-learn

如何在 Python 中使用 scikit-learn 开发您的第一个 XGBoost 模型
图片由 Justin Henry 提供,保留部分权利。

教程概述

本教程分为以下 6 个部分

  1. 安装 XGBoost 以在 Python 中使用。
  2. 问题定义和数据集下载。
  3. 加载和准备数据。
  4. 训练 XGBoost 模型。
  5. 进行预测和评估模型。
  6. 将所有内容整合在一起并运行示例。

在 Python 中使用 XGBoost 需要帮助吗?

参加我的免费 7 天电子邮件课程,探索 xgboost(含示例代码)。

立即点击注册,还将免费获得本课程的 PDF 电子书版本。

1. 在 Python 中安装 XGBoost

假设您有一个可用的 SciPy 环境,XGBoost 可以使用 pip 轻松安装。

例如

要更新您的 XGBoost 安装,您可以输入

如果您无法使用 pip 或者想要运行 GitHub 上的最新代码,另一种安装 XGBoost 的方法是克隆 XGBoost 项目并进行手动构建和安装。

例如,要在 Mac OS X 上(已通过 macports 或 homebrew 安装 GCC)构建不带多线程的 XGBoost,您可以输入

您可以在 XGBoost 安装指南上了解更多关于如何为不同平台安装 XGBoost 的信息。有关安装 Python 版 XGBoost 的最新说明,请参阅 XGBoost Python 包

作为参考,您可以查阅 XGBoost Python API 参考

2. 问题描述:预测糖尿病发作

在本教程中,我们将使用皮马印第安人糖尿病发作数据集。

该数据集包含 8 个输入变量,描述了患者的医疗详细信息,以及一个输出变量,用于指示患者是否将在 5 年内发作糖尿病。

您可以在 UCI 机器学习存储库网站上了解更多关于该数据集的信息。

对于第一个 XGBoost 模型来说,这是一个很好的数据集,因为所有输入变量都是数字的,并且问题是一个简单的二元分类问题。它不一定是 XGBoost 算法的好问题,因为它是一个相对较小的数据集和一个容易建模的问题。

下载此数据集并将其放置在您的当前工作目录中,文件名为 “pima-indians-diabetes.csv”(更新:从这里下载)。

3. 加载和准备数据

在本节中,我们将从文件中加载数据并准备它以用于训练和评估 XGBoost 模型。

我们将首先导入本教程中打算使用的类和函数。

接下来,我们可以使用 NumPy 函数 loadtxt() 将 CSV 文件作为 NumPy 数组加载。

我们必须将数据集的列(属性或特征)分成输入模式 (X) 和输出模式 (Y)。我们可以通过在 NumPy 数组格式中指定列索引来轻松完成此操作。

最后,我们必须将 X 和 Y 数据分成训练集和测试集。训练集将用于准备 XGBoost 模型,测试集将用于进行新预测,从中我们可以评估模型的性能。

为此,我们将使用 scikit-learn 库中的 train_test_split() 函数。我们还为随机数生成器指定一个种子,以便每次执行此示例时都能获得相同的数据分割。

我们现在准备好训练我们的模型。

4. 训练 XGBoost 模型

XGBoost 提供了一个包装类,允许模型在 scikit-learn 框架中像分类器或回归器一样处理。

这意味着我们可以将完整的 scikit-learn 库与 XGBoost 模型一起使用。

用于分类的 XGBoost 模型称为 XGBClassifier。我们可以创建并将其拟合到我们的训练数据集。模型使用 scikit-learn API 和 model.fit() 函数进行拟合。

训练模型的参数可以在构造函数中传递给模型。这里,我们使用合理的默认值。

您可以通过打印模型来查看训练模型中使用的参数,例如

您可以在 XGBoost Python scikit-learn API 中了解更多关于 XGBClassifierXGBRegressor 类的默认值。

您可以在 XGBoost 参数页面上了解更多关于每个参数的含义以及如何配置它们。

我们现在准备好使用训练好的模型进行预测。

5. 使用 XGBoost 模型进行预测

我们可以使用拟合模型在测试数据集上进行预测。

为了进行预测,我们使用 scikit-learn 函数 model.predict()

默认情况下,XGBoost 的预测是概率。由于这是一个二元分类问题,每个预测都是输入模式属于第一类的概率。我们可以通过将它们四舍五入到 0 或 1 来轻松地将它们转换为二元类别值。

现在我们已经使用拟合模型对新数据进行预测,我们可以通过将它们与预期值进行比较来评估预测的性能。为此,我们将使用 scikit-learn 中内置的 accuracy_score() 函数。

6. 将所有内容整合在一起

我们可以将所有这些部分整合在一起,下面是完整的代码清单。

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

运行此示例将产生以下输出。

这在这个问题上是一个很好的准确率分数,这是我们所期望的,考虑到模型的能力和问题的适度复杂性。

总结

在这篇文章中,您了解了如何在 Python 中开发您的第一个 XGBoost 模型。

具体来说,你学到了:

  • 如何在您的系统上安装 XGBoost 以便在 Python 中使用。
  • 如何准备数据并在标准机器学习数据集上训练您的第一个 XGBoost 模型。
  • 如何使用 scikit-learn 进行预测并评估训练好的 XGBoost 模型的性能。

您对 XGBoost 或本帖子有任何疑问吗?请在评论中提出您的问题,我将尽力回答。

发现赢得竞赛的算法!

XGBoost With Python

在几分钟内开发您自己的 XGBoost 模型

...只需几行 Python 代码

在我的新电子书中探索如何实现
使用 Python 实现 XGBoost

它涵盖了自学教程,例如:
算法基础缩放超参数等等……

将 XGBoost 的强大功能带入您自己的项目

跳过学术理论。只看结果。

查看内容

对《如何在 Python 中开发您的第一个 XGBoost 模型》的 173 条回复

  1. 冯启昌 2016 年 8 月 26 日 晚上 8:21 #

    嗨,Jason,

    首先感谢您所有精彩的帖子。我从中受益匪浅。

    我有一个关于分隔输入特征 X 和响应变量 Y 的代码的问题。您似乎将最后一列也包含在特征中,这不应该发生。

    X = dataset[:,0:8]

    正确的应该是 X = dataset[:, 0:7],以匹配患者医疗详细信息的 8 个输入变量。

    您的迷你课程手册中也出现了这个错误。

    • Jason Brownlee 2016 年 8 月 27 日 上午 11:32 #

      不客气,启昌。

      也许您使用的 Python 或 Numpy 版本不同,导致结果也不同。

      我可以确认帖子中的代码是正确的

      共有 9 列,前 8 列存储在 X 中,第 9 列存储在 Y 中。上述代码片段会生成

      这有帮助吗?

      在 Python 2.7.11 和 numpy 1.11.1 上测试。

      • 启昌 2016 年 8 月 28 日 上午 10:27 #

        嗨,Jason,

        非常感谢您的快速回复。是我的错误,我最近也在学习 R 语言,所以对 0:8 有些困惑。在 R 语言中,0:8 的最后一个数字是包含在内的,而在 Python 中则是排除的。我应该检查一下 shape。

        再次感谢。

  2. Joao Pires 2016 年 9 月 21 日 上午 6:42 #


    我运行代码后得到这个错误
    model = xgboost.XGBClassifier()
    AttributeError: 'module' object has no attribute 'XGBClassifier'

    你知道为什么吗?

    谢谢

    • Jason Brownlee 2016 年 9 月 21 日 上午 8:30 #

      您需要导入 xgboost。

      • 太郎 2018 年 12 月 3 日 晚上 8:53 #

        嗨,杰森。感谢您这个阐述清晰的教程。但我似乎遇到了同样的问题,尽管我已经导入了 xgboost。

        • Jason Brownlee 2018 年 12 月 4 日 上午 6:01 #

          您的代码中可能存在拼写错误,请确保您完全复制了代码。

        • Shubham 2020 年 10 月 16 日 上午 8:09 #

          你正在做的是——

          import xgboost

          这样做,代码应该就能正常运行——

          from xgboost import XGBClassifer

  3. SG Huang 2016 年 9 月 29 日 晚上 7:40 #

    感谢 Jason 的清晰指导。

    在实践中提高准确性的常用方法是什么?我们应该做一些特征工程,还是换一个不同的模型?

    我通过在线课程学习了机器学习的基础知识,但在课程中学到的知识与 Kaggle 上的比赛等实际问题之间仍然存在差距。您能分享一些见解吗?

    • Jason Brownlee 2016 年 9 月 30 日 上午 7:51 #

      我建议先尝试一些特征工程。

      尝试一些新的问题表述方式。

      然后稍后尝试算法调优和集成方法。

      我在以下帖子中列出了一些可以尝试的事情,它讨论了深度学习,但这些技术对于大多数方法来说都是通用的。
      https://machinelearning.org.cn/improve-deep-learning-performance/

      希望这些能作为一个开始有所帮助。

  4. Jessica 2016 年 11 月 11 日 上午 4:39 #

    谢谢你,这非常有帮助。

    我昨晚为我的数据编写了一个模型,它的表现非常好。
    今天我尝试重新运行它,它在导入 xgboost 时给我一个错误。

    我输入了 “import xgboost”
    我收到:“ImportError: No module named xgboost”

    • Jason Brownlee 2016 年 11 月 11 日 上午 10:06 #

      很抱歉听到这个消息,杰西卡。

      我怀疑您的环境是否发生了变化。

      也许尝试从命令行运行所有内容。
      确认您使用的是相同的用户。
      确认 xgboost 仍在系统上安装(pip show 或类似命令…)

  5. Trupti 2016 年 11 月 21 日 下午 5:26 #

    你好,感谢您精彩的解释!!
    我有一个疑问。我们能否获取进入模型的显著变量列表?我们如何读取“feature_importances_”?
    另外,如何微调 xgboost 模型?
    再次感谢!

  6. Trupti 2016 年 11 月 21 日 晚上 7:55 #

    你好。感谢您的解释!
    你能告诉我我是否能看到进入模型的变量列表吗?另外,我们如何进一步微调模型呢?
    一旦我们有了 xgboost 模型……我们如何将其投入生产?在逻辑回归中,我们会得到一个可以自动化以实时生产的方程,那么在 xgboost 中我们能得到什么呢?

  7. Peter Tan 2016 年 12 月 8 日 上午 8:26 #

    嗨,Jason,我遇到了和这里一些读者一样的问题

    AttributeError: 'module' object has no attribute 'XGBClassifier'

    为了确保我没有拼写错误,我创建了一个完整的代码副本,但仍然得到相同的问题。

    (我的代码中确实有 import xgboost)。

    我正在使用 xgboost 0.6a2 和 anaconda2-4.2.0。只是想知道您是否遇到过类似问题。

  8. 赫克托 2016 年 12 月 30 日 下午 1:29 #

    你好 Jason,我运行了这里的示例代码,返回一个错误:

    文件 “./test.py”,第 21 行
    model = xgboost.XGBClassifier()
    ^
    SyntaxError: invalid syntax

    你能告诉我我做错了什么吗?我成功导入了包。

    我正在使用 python 3.5 和 xgboost 0.6。

    • Jason Brownlee 2016 年 12 月 31 日 上午 7:02 #

      也许是复制粘贴错误?检查您复制代码中是否有额外的空格。

  9. Trupti 2017 年 1 月 7 日 下午 5:31 #

    我正在使用 predict_proba 来通过 xgboost 模型创建预测概率。我能否将这些概率保存在构建模型的同一训练数据中,以便我可以进一步创建报告以向管理层展示记分卡的验证情况。

    • Jason Brownlee 2017 年 1 月 8 日 上午 5:20 #

      抱歉,我不太明白。

      训练数据集上的预测概率会存在偏差。您可能需要报告留出数据集的概率。

  10. Niranjan 2017 年 3 月 14 日 上午 3:23 #

    嗨,这是一个非常好的 xgboost 介绍。请为 train_test_split 函数添加一个导入。

  11. 凯伦 2017 年 3 月 27 日 上午 12:15 #

    嗨,Jason,
    我找不到关于 predict_proba() 输出的概率如何计算的清晰解释。

    例如,在随机森林中,我理解它反映了所有树中相关叶子中属于该类别的样本比例的平均值。

    然而,在 XGBoost 中,我无法从文档或代码中理解其计算方法。它不应该为每棵树赋予不同的权重吗?

    • Jason Brownlee 2017 年 3 月 27 日 上午 7:56 #

      好问题,凯伦,我手头不太清楚。

      您可以查阅一些原始的随机梯度提升论文,甚至联系 xgboost 的作者。

  12. 尼兰詹 2017 年 4 月 20 日 晚上 8:31 #

    嗨,Jason,感谢您如此清晰的解释,您能否帮助我了解在 xgboost 中调用 fit 函数时如何打印训练准确度?

  13. Sumi 2017 年 5 月 25 日 下午 3:52 #

    你好,

    感谢您的帖子。它真的很有帮助。但是你能告诉我为什么我运行这段代码时会收到“ImportError: cannot import name XGBClassifier”?我已经成功安装了 XG Boost,但我仍然有这个错误。请帮帮我。

  14. vishwas 2017 年 5 月 25 日 晚上 10:20 #

    如何将 Xgboost 分类器和深度学习结合起来并创建集成(投票分类器)……您能详细说明一下集成技术吗

  15. joao 2017 年 6 月 10 日 下午 6:29 #

    在您的逐步解释中,您写道:“from xgboost import XGBClassifier”,然后您使用:“model = xgboost.XGBClassifier()”。这将导致错误。
    但在完整的代码中,您写对了。

  16. Mahmoud 2017 年 7 月 18 日 下午 6:56 #

    您好 Jason 博士,感谢您的快速精彩教程。它非常基础且非常有益。
    有一个问题,我如何在 XGBoost 中使用 GPU 进行训练和预测?我正在处理大型数据集。提前非常感谢。

  17. Bhupendra singh 2017 年 10 月 6 日 上午 5:54 #

    嘿!这个表现很好,但我怎么知道选择了哪些特征
    ?

  18. Bhupendra singh 2017 年 10 月 6 日 上午 5:55 #

    抱歉,我问了一个错误的问题……

  19. xuyuewei 2017 年 10 月 25 日 晚上 7:39 #

    非常感谢

  20. Eric Wu 2017 年 11 月 11 日 上午 4:56 #

    天哪,这二十多行代码几乎是所有监督学习任务的基本配方,而 XGBoost 就像默认算法一样。我希望有一种方法可以“双重”收藏这个页面。做得好!

  21. kono 2017 年 11 月 14 日 上午 8:52 #

    嗨,Jason,

    XGBClassifier的默认目标是binary:logisitc。对于binary:logistic,其目标函数是logloss的总和吗?如果是,为什么XGBoost使用“error”(准确率分数)作为默认评估指标而不是“logloss”?

    https://github.com/dmlc/xgboost/blob/master/doc/parameter.md#learning-task-parameters

    Kono

  22. mit 2017年12月12日 下午6:41 #

    请您给我一个例子,说明如何使用训练数据开发模型并对测试数据执行测试?

    我的意思是,我该如何做到以下几点:

    1. 使用训练数据开发模型并使用测试数据进行预测;
    2. 使用组合数据集(训练和测试数据集)并应用交叉验证。

  23. Frankli 2017年12月13日 下午2:01 #

    嗨,Jason

    如何调整这个模型中的参数?

    这个黑盒似乎能做所有事情,但我们不知道其中的细节

    • Jason Brownlee 2017年12月13日 下午4:14 #

      您可以使用超参数来改变模型的训练方式。

  24. frankli 2017年12月13日 下午5:31 #

    谢谢,但什么是超参数?xgboost中的一个包吗?
    有示例代码吗?

  25. Nasir 2018年1月13日 上午8:25 #

    嗨 Jason

    感谢非常好的教程。如果您能给我一些建议,我将不胜感激。
    我有一些振动数据(结构化格式)。我正在使用TensorFlow的深度学习Keras。但我读到“具体来说,梯度提升用于结构化数据可用问题,而深度学习用于图像分类等感知问题。”

    前者从业者几乎总是使用
    出色的XGBoost库,它支持两种最流行的语言
    数据科学:Python和R”

    我非常困惑,想听听您的专家意见,我是否需要切换并使用梯度提升?我对此用于回归目的很感兴趣。

    期待您的回复。

    纳西尔

  26. Pratip 2018年1月30日 下午7:51 #

    您好,先生,

    我正在尝试使用这个
    from xgboost import XGBClassifier

    但它给了我一个错误,说无法导入名称“XGBClassifier”

    但是当我导入xgboost时它却可以工作。
    您能告诉我我的错误为什么它不工作吗?

  27. Matthew 2018年3月10日 上午12:01 #

    糖尿病数据集的链接返回404错误。知道它去哪儿了吗?

  28. Gary 2018年3月19日 上午8:31 #

    我收到一个错误`XGBoostError: sklearn需要安装才能使用此模块`,但我_确实_在活动环境中安装了sklearn(在所有其他环境中。我想是)。

  29. Deep 2018年3月25日 下午9:31 #

    我是ML概念的新手,您的例子非常有用且易于理解。

    我根据我的数据重新创建了相同的示例。

    我的代码如下

    model = XGBClassifier()
    model.fit(X_test,Y_test)

    Q = vectorizer.transform([“I want to play online game”]).toarray()
    pred_data = model.predict(Q)

    我得到了正确的预测,但如何正确获取预测分数呢?
    我甚至使用了xgboost的predict_proba并获得了所有分数,但这是否是获取预测分数的方式,还是有其他方法?

  30. File 2018年4月8日 下午6:55 #

    谢谢杰森,这个博客真的很有帮助。
    我注意到您引用的数据集不再可用。您能推荐另一个二分类数据集吗?谢谢 –

  31. IrriAnalytics 2018年5月3日 下午7:16 #

    一旦我建立了模型,如何获取决策规则集(特征的切分点)?

    • Jason Brownlee 2018年5月4日 上午7:41 #

      好问题,通常考虑到模型中可能有成百上千棵树,这不可行。

  32. charliew 2018年5月9日 上午3:12 #

    感谢您的工作。我在尝试执行以下操作时遇到了错误:

    model = XGBClassifier(objective=’multi:softprob’)
    model.fit(X_train, Y_train)

    错误是:b’参数num_class的值0应该大于等于1’

    如果我不指定objective=’multi:softprob’,它就能正常工作。只是想知道您是否有使用XGBClassifier(objective=’multi:softprob’)的经验?

    谢谢

    • Jason Brownlee 2018年5月9日 上午6:26 #

      抱歉,我没有见过这个错误。

      也许可以发布到 stackoverflow?

  33. Kate 2018年5月20日 下午9:52 #

    嗨!
    我目前正在一个重要项目上试验XGBoost,并在StackOverflow上发布了一个问题。我刚读完这篇文章,现在更清楚了,但是您没有使用xgboost.train方法。这是否包含在XGBRegressor包装器中?我确实使用了xgboost.train,它给了我一个错误,而xgboost.fit没有产生这个错误。您能帮忙看看吗?
    https://stackoverflow.com/questions/50426680/xgboost-gives-keyerror-best-msg

    提前感谢!
    诚挚的问候

    • Jason Brownlee 2018年5月21日 上午6:30 #

      您能用一两句话给我总结一下您的问题吗?

  34. Michael 2018年6月7日 下午3:36 #

    你好,

    我正在使用XGBRegressor包装器来预测产品的销售额,有50种产品,我想知道线性回归中的系数,以查看哪种产品销售对因变量销售额的影响程度。比如说 Y = B1X1 + B2X2 + ….. BnXn + C,我想从树回归器(XGBRegressor)中获取B1,B2,….Bn的值。

    • Jason Brownlee 2018年6月8日 上午6:05 #

      xgboost模型与线性回归不同。没有系数列表,只有大量的树。

      • Michael 2018年6月8日 下午11:38 #

        谢谢,但是有没有办法可以确定其他产品销售额对我的因变量(销售额)的影响百分比呢?
        变量

        • Jason Brownlee 2018年6月9日 上午6:54 #

          是的,但这可能是一个统计方法的问题,而不是预测建模的问题。

  35. Todd 2018年6月8日 上午6:38 #

    Jason,感谢这篇精彩的文章(和网站)
    我有一个文本分类问题,通常使用逻辑回归来解决。所以我习惯于转换特征以适应模型,但我通常不需要对文本标签做任何事情。标签是文本类别(例如labels = [‘cancel’, ‘change’, ‘contact support’, 等)。我现在收到错误

    dtrain = xgb.DMatrix(X_train_dtm, label=y_train)

    TypeError: 必须是实数,而不是字符串

    y_train是文本数据。我该如何开始解决这个问题?有什么提示吗?我需要对标签进行某种转换吗?

  36. Leote Cherradi 2018年9月18日 上午12:13 #

    你好,

    好文章
    只想说,对于分类问题,最好使用F1分数、精确率和召回率以及混淆矩阵。

    以下是一些可以添加到末尾的Python代码

    predictions = model.predict(X_test)
    Y_Testshaped = y_test.values

    cm = confusion_matrix(Y_Testshaped, predictions)
    print(‘F1 : ‘ + str(f1_score(Y_Testshaped, predictions,average=None)) )
    print(‘Precision : ‘ + str(precision_score(Y_Testshaped, predictions,average=None)) )
    print(‘Recall : ‘ + str(recall_score(Y_Testshaped, predictions,average=None)) )

    fig, ax = plot_confusion_matrix(conf_mat=cm)
    plt.show()

    • Jason Brownlee 2018年9月18日 上午6:17 #

      这取决于您项目的目标。

      选择最能帮助您向利益相关者展示模型性能的度量标准。

  37. Anshita 2018年10月3日 下午9:48 #

    嗨,Jason,

    当我将test-size设置为0.2时,模型准确率会提高。它显示accuracy_score = 81.17%。当我将test-size设置为0.15时,accuracy_score = 81.90%。如果我将test-size设置为0.1,则accuracy_score = 80.52%。那么,选择test-size = 0.15是否更好,因为它提高了accuracy_score?我通常看到test-size为0.2或0.3或介于两者之间。那么,为了得到一个好的模型,我应该选择给出更高模型accuracy_score的模型吗?如果不是,为什么?

    • Jason Brownlee 2018年10月4日 上午6:16 #

      更多数据通常更好。

      这些差异可能不是真实的,例如统计噪声。

  38. Hoang 2018年12月3日 下午8:42 #

    model.predict(X_test)给出类别预测。
    model.predict_proba(X_test)给出分数预测。

    所以我想如果我们执行model.predict(X_test),我们就不需要对结果进行四舍五入。我说的对吗?
    谢谢!

  39. Eric Ewald 2018年12月7日 上午4:46 #

    Jason,

    我是机器学习新手,但对回归有一定了解。所以从这个模型的输出中我了解到这些变量(X)在预测Y方面有77.95%的准确率。我的问题是如何应用这些数据?我能创建一个函数,输入这些变量(X),来预测某人患糖尿病Y的概率吗?

    埃里克

    • Jason Brownlee 2018年12月7日 上午5:27 #

      是的,您可以将模型作为软件应用程序的一部分,该应用程序接受输入并使用输出。

  40. Chao 2019年1月27日 上午3:28 #

    嗨 Jason

    感谢您的教程,我用默认参数在xgboost和sklearn的GradientBoostingClassifier上运行了我的训练/测试数据,它们得到了相同的结果,但xgboost在训练和测试方面比GB慢(大约30%的差异)。

    这似乎很奇怪?Xgboost是不是应该比sklearn的GBM快得多?

    我的笔记本电脑是i7-5600u,它应该有4个线程。

    谢谢!

    • Jason Brownlee 2019年1月27日 上午7:41 #

      也许这不是一个公平的比较,例如,模型配置不同?

  41. Salman 2019年3月16日 下午7:05 #

    你好,
    我正在尝试将X和y转换为xgb.DMatrix以加快计算速度。我的X的维度是(1020, 421),我的y是(1020,1)。
    我收到一个错误,不知道问题出在哪里。
    如果您能提供帮助,我将不胜感激。

    # 创建xgDMatrix优化数据集

    dabsorb = xgb.DMatrix(absorb)
    y = np.reshape(y,(-1, 1))
    dy = xgb.DMatrix(y)

    # 将XGBoost拟合到训练集
    from xgboost import XGBClassifier
    classifier = XGBClassifier ()
    classifier.fit(dabsorb,dy)

    我收到此错误
    File “C:\Users\AU529763\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\utils\validation.py”, line 797, in column_or_1d
    raise ValueError(“bad input shape {0}”.format(shape))

    ValueError: bad input shape ()

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

      我很抱歉,不确定,或许可以尝试发布到stackoverflow?

  42. Nirmine 2019年3月26日 上午5:58 #

    你好,杰森

    我想知道这两种代码有什么区别?以及您建议我使用哪一种?

    # 加载数据
    # 将数据拆分为 (X_train, X_test, y_train, y_test)
    from xgboost import XGBClassifier
    model = XGBClassifier(learnin_rate=0.2, max_depth= 8,…)
    eval_set = [(X_test, y_test)]
    model.fit(X_train, y_train, eval_metric=”auc”, early_stopping_rounds=50, eval_set=eval_set, verbose=True)
    y_pred = model.predict(X_test)

    代码2

    # 加载数据
    # 将数据拆分为 (X_train, X_test, y_train, y_test)
    import xgboost as xgb
    dtrain = xgb.DMatrix(X_train,y_train)
    dtest = xgb.DMatrix(X_test,y_test)
    eval_set = [(X_test, y_test)]
    param = {‘learnin_rate’:0.2,’max_depth’: 8, ‘eval_metric’:’auc’, ‘boost’:’gbtree’, ‘objective’: ‘binary:logistic’, … }
    num_round = 300
    bst = xgb.train(param, dtrain, num_round)

    • Jason Brownlee 2019年3月26日 上午8:13 #

      也许可以在您的问题上都尝试一下,然后使用在您的数据集上表现最好的那个?

  43. Eug 2019年5月23日 上午7:24 #

    如何在逻辑回归中使用Xgboost。

    • Jason Brownlee 2019年5月23日 下午2:30 #

      我不知道,抱歉。

      • Eug 2019年5月23日 下午11:16 #

        我听说我们可以使用xgboost来提取最重要的特征,并用这些特征拟合逻辑回归。例如,如果我们有一个包含1000个特征的数据集,我们可以使用xgboost提取前10个重要特征,以提高另一个模型的准确性。例如逻辑回归、SVM等,就像我们使用RFE一样。

  44. Luana Letícia 2019年5月28日 下午12:29 #

    非常感谢!!!解释得太好了!!

  45. rajkamal 2019年5月31日 下午3:35 #

    首先,非常感谢您提供了如此优质的内容。实际上,我一直在尝试实现多类别文本分类,为此,我尝试使用Word2Vec模型生成词嵌入,您有什么其他生成词嵌入的建议吗?

    我的另一个问题是,如何处理同时包含文本(非类别)和数值的数据?您有这类问题的示例吗?

    提前感谢。

  46. Nada 2019年6月2日 下午5:29 #

    你好,我正在处理一个形状为(7026,63)的数据集,我尝试在其上运行xgboost、gradientboosting和adaboost分类器,但它返回的准确率很低。我尝试调整了一下参数,但ada仍然给了我60%,xgboost给了我45%,而gradient boosting给了我0.023。如果您能解释一下为什么它工作不佳,我将非常感激。

  47. Maryam 2019年7月24日 上午4:44 #

    嗨!感谢这篇有用的文章。当我对y_pred进行四舍五入时,在这行代码中遇到了一个奇怪的问题:
    predictions = [round(value) for value in y_pred]

    它显然是一个二维数组,python给我一个错误,说
    错误“TypeError: numpy.ndarray类型没有定义__round__方法”

    您有没有遇到过这个错误或知道为什么会发生这种情况?

    • Jason Brownlee 2019年7月24日 上午8:15 #

      听到这个消息我很难过。

      或许可以尝试直接使用预测结果,而不进行四舍五入?

  48. Merik 2019年8月24日 下午2:16 #

    嗨,Jason,感谢您这篇精彩的文章!

    有没有办法实现增量/批处理学习?

  49. Prem 2019年8月28日 下午4:08 #

    嗨,Jason,
    当我在xgboost模型上运行预测时,我得到一个错误:

    ValueError: feature_names mismatch: [‘f0’, ‘f1’,….] [‘Application’, ‘Amount’….]

    输入数据中预期有f20, f12,…..

    训练数据中没有以下字段:Application, Amount,………..

    • Prem 2019年8月28日下午4:30 #

      对于单个记录,预测正在发生。对于 Test_Data,我收到了上述错误(训练数据和测试数据不是通过 train_test_split 生成的,两者是独立的数据集)。

    • Jason Brownlee 2019年8月29日上午6:00 #

      也许可以从 CSV 文件中删除标题?或者在没有列标题的情况下加载数据?

  50. roger 2019年9月20日上午6:36 #

    那么,假设我们的研究人员回去从这个人群中获取了新的数据,现在想让你将这些新数据输入到你的模型中,以预测当前人群患糖尿病的风险。你会以同样的方式(z_train 和 z_test)分割新数据并将其输入到你的模型中进行重新拟合吗?

    """
    model.fit(X_train, y_train)
    z_pred = model.predict(z_test)
    accuracy = accuracy_score(z_test, predictions)
    print(“Accuracy: %.2f%%” % (accuracy * 100.0))
    """

    或者你会直接将整个数据集输入并对照 y_test 进行判断吗?

    """
    z_pred = model.predict(new_data)
    accuracy = accuracy_score(y_test, predictions)
    print(“Accuracy: %.2f%%” % (accuracy * 100.0))

    抱歉我理解不足,很多教程都停留在准确性测试,没有涵盖“接下来做什么”。

    谢谢

  51. Lucas 2019年9月24日上午5:24 #

    嗨 Jason,我正在尝试使用你的模型和我的数据集构建一个简单的 XGBoost 二进制分类器。我正在使用的数据集大约有 18000 个输入,30 个特征,以及 1 个类别标签。使用你的代码时,在尝试编译 predictions = [round(value) for value in y_pred] 时,我收到错误:type bytes doesn’t define __round__ method。

    另一个问题是,当我运行模型时,我总是收到错误:“您似乎正在使用旧版的多标签数据表示。不再支持序列的序列;请改用二进制数组或稀疏矩阵——MultiLabelBinarizer 转换器可以转换为这种格式。”

    这与我定义训练和测试样本的特征和目标的方式有关吗?我将其定义为 features = df.drop(‘class’, axis=1) 和 targets = df[‘target_class’],然后我用 X_train, X_test, y_train, y_test = train_test_split(features, targets, test_size=0.33, random_state=7) 定义了训练和测试样本大小。

  52. Jack 2019年10月14日下午5:04 #

    我使用 XGBoost 只有一个特征(属性),然后出现了这个错误

    IndexError Traceback (最近一次调用)
    in
    1 # 在训练数据上拟合模型
    2 model = XGBClassifier()
    —-> 3 model.fit(X_train, y_train,sample_weight=’None’)
    4 print(model)

    ~\Anaconda2\envs\mypython3\lib\site-packages\xgboost\sklearn.py in fit(self, X, y, sample_weight, eval_set, eval_metric, early_stopping_rounds, verbose, xgb_model, sample_weight_eval_set, callbacks)
    717 evals = ()
    718
    –> 719 self._features_count = X.shape[1]
    720
    721 if sample_weight is not None

    IndexError: 元组索引超出范围

    是因为我只使用了一个属性吗?如何解决?

    提前感谢

    • Jason Brownlee 2019年10月15日上午6:07 #

      这很奇怪。

      不,XGBoost 可以很好地使用一个特征作为输入。

      也许确认你的数据加载正确,并且你有一个列和 n 行。

  53. Sophia Yue 2019年11月7日上午8:50 #

    嗨,Jason,
    1). 如何将本文中构建的模型应用于生产?
    2)(.在构建模型之后,您能否指明部署机器学习模型的方向或文章?

    谢谢,
    索菲亚

  54. Pragya Sharma 2019年11月8日下午8:39 #

    您能举一个使用 XGBRegressor 及其参数的例子吗?

  55. Michał Bargiel 2019年11月12日上午3:53 #

    嘿,谢谢你的教程。

    我尝试了学习变量,并且更改 XGBClassifier 的参数并没有提高准确性,但是,我将 test_size 减小到 0.14(我尝试了不同的值),准确性达到了 84%。我使用 Python 3.6.8 和 0.9 XGBoost 库。

    你认为这是因为算法的改进而有所不同,还是建议的大小导致结果过拟合?

    • Jason Brownlee 2019年11月12日上午6:44 #

      测试集可能太小了。

      也许可以尝试 k 折交叉验证来评估模型性能?

  56. Pieter Willaert 2019年12月15日上午4:11 #

    你好,

    我正在尝试使用我的数据运行这段代码,但是我的内核一直崩溃… 我不知道为什么,我没有收到任何错误。只有一个弹出窗口:“您的内核已崩溃。” 有什么建议吗?

  57. young.chan 2020年1月10日下午3:48 #

    如何在时间序列预测中应用 XGBoost?

  58. Reza 2020年1月20日上午2:32 #

    感谢您的教程
    顺便问一下,标签必须是数字吗?
    因为我的标签是字符串,总是出错

  59. Reza 2020年1月24日下午5:49 #

    谢谢你的信息 🙂

  60. fede 2020年2月19日上午6:49 #

    如果我想用 XGB 标记单行怎么办?
    我用一个数据集(来自 Kaggle 的心血管疾病数据)训练了我的 XGB 模型,该数据集有 13 个特征 +1 个目标(0/1)。
    我有一个包含 13 个值的数组,我想对其进行预测(1 行 x 13 列)

    array_to_predict = [[…],[…]……]

    print(model.predict(array_to_predict))

    如何初始化数组才能正确预测?

  61. Steven 2020年5月6日上午2:39 #

    嗨,Jason,

    是否可以使用支持向量机作为 XGBoost 分类器中的基本学习器?我尝试了“gbtree”和“gblinear”,令人惊讶的是,“gblinear”在我的乳腺癌分类数据集的几个指标上击败了“gbtree”。这可能吗,因为“gblinear”只能建立线性关系,而“gbtrees”也可以考虑非线性关系?

  62. Ezgi 2020年6月20日上午2:53 #

    嗨,Jason,

    我想预测百分比,所以我的目标值在 [0,1] 范围内。问题是 reg:linear 给出的输出超出了范围。我在 stackoverflow 上看到,有人建议使用带有 XGBRegressor() 类的 reg:logistic。我尝试了 reg:logistic,结果非常有希望!但我没有有效的理由这样做。你认为应用 reg:logistic 可以吗,还是没有意义?
    非常感谢!

    • Jason Brownlee 2020年6月20日上午6:17 #

      也许可以尝试一下,也可以尝试校准预测概率。

  63. Laís 2020年6月27日上午6:38 #

    嗨 Jason,我正在尝试使用 XGBClassifier 但它不起作用。
    我正在使用一个名为 Paysim 的欺诈检测数据集(可在 Kaggle 上获取)
    这是我代码的一部分

    class Classificacao
    def __init__(self, classif, model_name)
    self.name = model_name
    self.classifier = classif

    def norm_under(self, normalizar, under)
    if normalizar & under
    steps = [(‘Norma’, StandardScaler()), (‘over’, SMOTE(sampling_strategy=0.1)),
    (‘under’, RandomUnderSampler(sampling_strategy=0.5)), (‘Class’, self.classifier)]
    elif normalizar
    steps = [(‘Norma’, StandardScaler()), (‘over’, SMOTE(sampling_strategy=0.1)), (‘Class’, self.classifier)]
    elif under
    steps = [(‘over’, SMOTE(sampling_strategy=0.1)), (‘under’, RandomUnderSampler(sampling_strategy=0.5)), (‘Class’, self.classifier)]
    else
    steps = [(‘over’, SMOTE(sampling_strategy=0.1)), (‘Class’, self.classifier)]
    return steps

    def holdout(self, normalizar=False, under=False)
    global X_train, y_train, X_test, y_test

    steps = self.norm_under(normalizar, under)
    管道 = Pipeline(steps=steps)
    pipeline.fit(X_train, y_train)
    pred = pipeline.predict(X_test)
    print(‘Acuracia do {}: {}’ .format(self.name, accuracy_score(y_test, pred)))
    print(‘Média da curva ROC_AUC do {}: {}’ .format(self.name, mean(roc_auc_score(y_test, pred))))
    print(‘F1 score do {}: {}’ .format(self.name, f1_score(y_test, pred, average=’macro’)))
    return pred

    def crossvalidation(self, normalizar=False, under=False)
    global X_train, y_train, X_test, y_test

    steps = self.norm_under(normalizar, under)
    管道 = Pipeline(steps=steps)
    kfold = StratifiedKFold(n_splits=10, random_state=42)
    scorers = {‘accuracy_score’: make_scorer(accuracy_score),
    ‘roc_auc_score’: make_scorer(roc_auc_score),
    ‘f1_score’: make_scorer(f1_score, average=’macro’)
    }
    resultado = cross_validate(pipeline, X_train, y_train, scoring=scorers, cv=kfold)
    for name in resultado.keys()
    media_scorers = np.average(resultado[name])
    print(‘{} do {}: {}’ .format(name, self.name, media_scorers))

    当我这样做时:xxg =
    Classificacao(xgb.XGBClassifier(objective=’binary:logistic’, n_estimator=10, seed=123), ‘XGB’)
    xg.holdout(False, False)

    或者这样:Classificacao(xgb.XGBClassifier(objective=’binary:logistic’, n_estimator=10, seed=123), ‘XGB’)
    xg.crossvalidation(False, False)

    我收到此错误消息

    KeyError 回溯(最近的调用在最后)
    /usr/local/lib/python3.6/dist-packages/sklearn/metrics/_scorer.py in _cached_call(cache, estimator, method, *args, **kwargs)
    54 try
    —> 55 return cache[method]
    56 except KeyError

    KeyError: ‘predict’

    处理上述异常时,发生了另一个异常

    ValueError 回溯 (最近一次调用)
    19 frames
    /usr/local/lib/python3.6/dist-packages/xgboost/core.py in _validate_features(self, data)
    1688
    1689 raise ValueError(msg.format(self.feature_names,
    -> 1690 data.feature_names))
    1691
    1692 def get_split_value_histogram(self, feature, fmap=”, bins=None, as_pandas=True)

    ValueError: feature_names mismatch: [‘f0’, ‘f1’, ‘f2’, ‘f3’, ‘f4’, ‘f5’, ‘f6’] [‘step’, ‘amount’, ‘oldbalanceOrg’, ‘newbalanceOrig’, ‘oldbalanceDest’, ‘newbalanceDest’, ‘TRANSFER’]
    expected f1, f6, f3, f2, f0, f4, f5 in input data
    training data did not have the following fields: oldbalanceDest, amount, oldbalanceOrg, step, TRANSFER, newbalanceOrig, newbalanceDest

  64. Sowmya 2020年7月10日下午9:56 #

    感谢您的清晰解释。我是机器学习的新手。
    我用 XGBRegressor 创建并训练了一个模型。我想获取每个特征的最佳偏差和残差,并将其用作我应用程序前端的线性回归。这可能吗?如果可能,我该如何实现?
    再次感谢您的帮助。

    • Jason Brownlee 2020年7月11日上午6:12 #

      不客气。

      抱歉,我不明白您说的“每个特征的最佳偏差和残差”是什么意思,您能详细说明一下吗?

  65. Ishita 2020年7月17日下午8:01 #

    你好,
    我非常喜欢你解释一切的方式,但我无法下载数据集。链接打开了数据集,但我该如何下载呢?

    • Jason Brownlee 2020年7月18日上午6:01 #

      谢谢。

      或许可以右键点击链接并选择“另存为”。

  66. Gokul 2020年10月4日下午3:37 #

    如果我使用 XGBoost 回归器,我能得到直线的方程吗?

    • Jason Brownlee 2020年10月5日上午6:49 #

      不,XGBoost 不能(轻易地)简化为方程。它是一个由大量加权决策树组成的集合。

  67. Ankit 2021年1月1日上午2:10 #

    如果我想使用 xgboost 进行预测,并且我有 6 个特征作为输入,那么获取该预测结果的用户输入命令是什么?

    model.predict( )

    括号里能放什么?

    我将特征值放入列表 [0,0,44,18,201,5430]

    model.predict( [0,0,44,18,201,5430])

    但我得到错误?

    请提供解决方案

  68. Priya 2021年2月1日下午8:10 #

    你好,先生,
    我在安装 XGBoost 时遇到了问题。我收到一个错误“sudo 未被识别为内部或外部命令”。您能帮我纠正这个错误吗?

    • Jason Brownlee 2021年2月2日上午5:43 #

      如果你在 Windows 上,也许可以去掉“sudo”。

      • Greg 2022年1月25日上午12:11 #

        你可能应该完全放弃 sudo,因为 sudo pip 可能存在安全风险。

        • James Carmichael 2022年1月25日上午10:38 #

          感谢您的反馈和建议,Greg!

  69. Jessy 2021年2月3日上午6:03 #

    你好 Jason!感谢您的*简单*解释。

    我正在使用 XGboost 训练一个多类数据集,但我得到的整体准确率非常低(70%),然而,当使用 SVM+TFIDF 时,我得到了更好的准确率 79%。这是因为我的高向量维度(使用三元组)吗?还是参数调整?XGBoost 不是应该表现得更好甚至与 SVM 相同吗?而不是更差

    • Jason Brownlee 2021年2月3日上午6:28 #

      不客气!

      也许 xgboost 不太适合你的问题?
      或许需要一些数据预处理?
      也许需要进行一些模型调优?

      • Jessy 2021年2月3日上午7:03 #

        我做了大量的预处理,但我的问题仍然在于我的类别之间存在重叠词。您能推荐一个可能有帮助的算法吗?

        • Jason Brownlee 2021年2月3日上午7:32 #

          很难知道哪种算法最适合给定的数据集,相反,你必须使用系统实验来发现哪种效果最好。

  70. Sriram 2021年2月28日上午3:48 #

    嗨 Jason,谢谢这篇有用的文章。

    我一直在努力寻找合适的算法/库来为学习排名问题实现解决方案,其中响应变量具有较大的值 1..200000,需要对其进行排名/训练。

    我在网上搜索了很多,找到了 RankSVM、LamdaRank、XGBRanker 等选项,但发现它们实际上不起作用——要么导致错误,要么难以实现(即无法直接适应我的问题)。

    作为 DMLC 实现的一部分,我遇到了 XGBRankerMixIn 类。这可以适应我的解决方案吗?或者您能为我的问题推荐合适的参考文献/实现吗?

    • Jason Brownlee 2021年2月28日上午4:36 #

      不客气。

      抱歉,我没有使用过它。我无法给你好的即兴建议。希望我将来能写关于这个主题的文章。

    • Dinani 2021年4月22日下午5:11 #

      你找到解决你问题的参考文献/实现了吗?
      如果你有一些参考文献,请告诉我,我也有同样的问题

  71. Sriram 2021年2月28日上午5:05 #

    好的 Jason。感谢您的快速回复。

  72. Ritwic 2021年4月16日上午3:38 #

    嗨!感谢您的文章。

    我一直按照您在文章中的做法进行。然而,在 Google Colab 中,代码变成

    from xgboost import XGBClassifier
    xgb1 = XGBClassifier()
    xgb1.fit(X_train,y_train)

    Colab 卡在 xgb1.fit(X_train,y_train) 上。是训练需要很长时间还是有错误?我没有收到任何错误,它只是在执行。

  73. Akshar 2021年7月8日下午7:13 #

    嗨,Jason,

    我对“subsample”参数有疑问。

    我使用默认值(除了“subsample”被设置为 0.9)运行了分类器。准确率超过 79%。

    然而,在多次重新运行同一个分类器后,准确率在 77% 到 79% 之间波动,这是因为根据 subsample 值随机选择观测值来构建提升树。如果我错了,请纠正我。

    当我们将 subsample 值保持小于 1 时,是否有选项可以控制 XGBoost 分类器或为其提供种子值?我们在 Train_Test_Split 中就是这样做的。

    谢谢

  74. Aneeta 2022年4月7日下午6:23 #

    嗨,Jason,
    我在 Google Colab 上运行代码。我已经安装了 xgboost 并导入了分类器。
    model = XGBClassifier()
    model.fit(x_train, y_train)
    当我运行此代码时,我得到 XGBClassifier() 作为输出。我没有得到任何值。你能帮我一下吗?

    • Adrian Tam
      Adrian Tam 2022年4月8日上午5:29 #

      预期如此。你将 `model` 创建为一个 XGBClassifier 对象,然后用你的数据训练该模型。该对象的内部状态现在已更新。你需要使用它进行预测才能生成有用的结果。

  75. Tony K 2022年6月8日上午6:35 #

    嗨,Jason,

    感谢这个对像我这样的初学者非常有帮助的教程。

    我有一个 csv 文件,其中包含 1000 行观测数据,约有 200 个变量。最后一列是一个二元结果(0/1),表示是否发生了感兴趣的事件。

    接下来的 200 行包含了我希望预测结果是否会发生的观测数据。这些 200 行的结果列中缺少数据。

    换句话说,我的文件已经分为训练集(第 1-1000 行)和测试集(第 1001-1200 行)。如何在 XGBoost 中指定这种安排并获取最后 200 行的预测结果?我还需要获取每个最后 200 行的结果概率,而不仅仅是四舍五入的值。

    谢谢你。

    • James Carmichael 2022年6月9日上午9:19 #

      嗨 Tony……非常欢迎!你遇到任何问题或者有什么需要我们帮助解决的问题吗?

  76. Shah 2022年7月1日下午11:09 #

    感谢您的信息,如果我想预测第 20 列,我应该如何更改目标预测?我有 20 列,我想根据其他列预测最后一列?

  77. deva 2022年12月17日下午10:32 #

    谢谢,这正是我所需要的

    • James Carmichael 2022年12月18日上午10:15 #

      非常欢迎你,deva!我们感谢你的反馈!

发表回复

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