XGBoost 是梯度提升决策树的一种实现,旨在提高速度和性能,在竞争性机器学习中占据主导地位。
在这篇文章中,您将了解如何在 Python 中安装并创建您的第一个 XGBoost 模型。
阅读本文后,您将了解
- 如何在您的系统上安装 XGBoost 以在 Python 中使用。
- 如何准备数据并训练您的第一个 XGBoost 模型。
- 如何使用您的 XGBoost 模型进行预测。
通过我的新书《XGBoost With Python》启动您的项目,其中包括所有示例的分步教程和 Python 源代码文件。
让我们开始吧。
- 2017 年 1 月更新:已更新以反映 scikit-learn API 0.18.1 版本中的更改。
- 2017 年 3 月更新:添加了缺失的导入,使导入更清晰。
- 2018 年 3 月更新:添加了下载数据集的备用链接。

如何在 Python 中使用 scikit-learn 开发您的第一个 XGBoost 模型
图片由 Justin Henry 提供,保留部分权利。
教程概述
本教程分为以下 6 个部分
- 安装 XGBoost 以在 Python 中使用。
- 问题定义和数据集下载。
- 加载和准备数据。
- 训练 XGBoost 模型。
- 进行预测和评估模型。
- 将所有内容整合在一起并运行示例。
在 Python 中使用 XGBoost 需要帮助吗?
参加我的免费 7 天电子邮件课程,探索 xgboost(含示例代码)。
立即点击注册,还将免费获得本课程的 PDF 电子书版本。
1. 在 Python 中安装 XGBoost
假设您有一个可用的 SciPy 环境,XGBoost 可以使用 pip 轻松安装。
例如
1 |
sudo pip install xgboost |
要更新您的 XGBoost 安装,您可以输入
1 |
sudo pip install --upgrade xgboost |
如果您无法使用 pip 或者想要运行 GitHub 上的最新代码,另一种安装 XGBoost 的方法是克隆 XGBoost 项目并进行手动构建和安装。
例如,要在 Mac OS X 上(已通过 macports 或 homebrew 安装 GCC)构建不带多线程的 XGBoost,您可以输入
1 2 3 4 5 6 |
git clone --recursive https://github.com/dmlc/xgboost cd xgboost cp make/minimum.mk ./config.mk make -j4 cd python-package sudo python setup.py install |
您可以在 XGBoost 安装指南上了解更多关于如何为不同平台安装 XGBoost 的信息。有关安装 Python 版 XGBoost 的最新说明,请参阅 XGBoost Python 包。
作为参考,您可以查阅 XGBoost Python API 参考。
2. 问题描述:预测糖尿病发作
在本教程中,我们将使用皮马印第安人糖尿病发作数据集。
该数据集包含 8 个输入变量,描述了患者的医疗详细信息,以及一个输出变量,用于指示患者是否将在 5 年内发作糖尿病。
您可以在 UCI 机器学习存储库网站上了解更多关于该数据集的信息。
对于第一个 XGBoost 模型来说,这是一个很好的数据集,因为所有输入变量都是数字的,并且问题是一个简单的二元分类问题。它不一定是 XGBoost 算法的好问题,因为它是一个相对较小的数据集和一个容易建模的问题。
下载此数据集并将其放置在您的当前工作目录中,文件名为 “pima-indians-diabetes.csv”(更新:从这里下载)。
3. 加载和准备数据
在本节中,我们将从文件中加载数据并准备它以用于训练和评估 XGBoost 模型。
我们将首先导入本教程中打算使用的类和函数。
1 2 3 4 |
从 numpy 导入 loadtxt from xgboost import XGBClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score |
接下来,我们可以使用 NumPy 函数 loadtxt() 将 CSV 文件作为 NumPy 数组加载。
1 2 |
# 加载数据 dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",") |
我们必须将数据集的列(属性或特征)分成输入模式 (X) 和输出模式 (Y)。我们可以通过在 NumPy 数组格式中指定列索引来轻松完成此操作。
1 2 3 |
# 将数据拆分为 X 和 y X = dataset[:,0:8] Y = dataset[:,8] |
最后,我们必须将 X 和 Y 数据分成训练集和测试集。训练集将用于准备 XGBoost 模型,测试集将用于进行新预测,从中我们可以评估模型的性能。
为此,我们将使用 scikit-learn 库中的 train_test_split() 函数。我们还为随机数生成器指定一个种子,以便每次执行此示例时都能获得相同的数据分割。
1 2 3 4 |
# 将数据拆分为训练集和测试集 seed = 7 test_size = 0.33 X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed) |
我们现在准备好训练我们的模型。
4. 训练 XGBoost 模型
XGBoost 提供了一个包装类,允许模型在 scikit-learn 框架中像分类器或回归器一样处理。
这意味着我们可以将完整的 scikit-learn 库与 XGBoost 模型一起使用。
用于分类的 XGBoost 模型称为 XGBClassifier。我们可以创建并将其拟合到我们的训练数据集。模型使用 scikit-learn API 和 model.fit() 函数进行拟合。
训练模型的参数可以在构造函数中传递给模型。这里,我们使用合理的默认值。
1 2 3 |
# 拟合模型,无训练数据 model = XGBClassifier() model.fit(X_train, y_train) |
您可以通过打印模型来查看训练模型中使用的参数,例如
1 |
print(model) |
您可以在 XGBoost Python scikit-learn API 中了解更多关于 XGBClassifier 和 XGBRegressor 类的默认值。
您可以在 XGBoost 参数页面上了解更多关于每个参数的含义以及如何配置它们。
我们现在准备好使用训练好的模型进行预测。
5. 使用 XGBoost 模型进行预测
我们可以使用拟合模型在测试数据集上进行预测。
为了进行预测,我们使用 scikit-learn 函数 model.predict()。
默认情况下,XGBoost 的预测是概率。由于这是一个二元分类问题,每个预测都是输入模式属于第一类的概率。我们可以通过将它们四舍五入到 0 或 1 来轻松地将它们转换为二元类别值。
1 2 3 |
# 对测试数据进行预测 y_pred = model.predict(X_test) predictions = [round(value) for value in y_pred] |
现在我们已经使用拟合模型对新数据进行预测,我们可以通过将它们与预期值进行比较来评估预测的性能。为此,我们将使用 scikit-learn 中内置的 accuracy_score() 函数。
1 2 3 |
# 评估预测 accuracy = accuracy_score(y_test, predictions) print("Accuracy: %.2f%%" % (accuracy * 100.0)) |
6. 将所有内容整合在一起
我们可以将所有这些部分整合在一起,下面是完整的代码清单。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# Pima 印第安人数据集的第一个 XGBoost 模型 从 numpy 导入 loadtxt from xgboost import XGBClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加载数据 dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",") # 将数据拆分为 X 和 y X = dataset[:,0:8] Y = dataset[:,8] # 将数据拆分为训练集和测试集 seed = 7 test_size = 0.33 X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed) # 拟合模型,无训练数据 model = XGBClassifier() model.fit(X_train, y_train) # 对测试数据进行预测 y_pred = model.predict(X_test) predictions = [round(value) for value in y_pred] # 评估预测 accuracy = accuracy_score(y_test, predictions) print("Accuracy: %.2f%%" % (accuracy * 100.0)) |
注意:由于算法或评估过程的随机性,或者数值精度的差异,您的结果可能会有所不同。考虑多次运行示例并比较平均结果。
运行此示例将产生以下输出。
1 |
准确率:77.95% |
这在这个问题上是一个很好的准确率分数,这是我们所期望的,考虑到模型的能力和问题的适度复杂性。
总结
在这篇文章中,您了解了如何在 Python 中开发您的第一个 XGBoost 模型。
具体来说,你学到了:
- 如何在您的系统上安装 XGBoost 以便在 Python 中使用。
- 如何准备数据并在标准机器学习数据集上训练您的第一个 XGBoost 模型。
- 如何使用 scikit-learn 进行预测并评估训练好的 XGBoost 模型的性能。
您对 XGBoost 或本帖子有任何疑问吗?请在评论中提出您的问题,我将尽力回答。
嗨,Jason,
首先感谢您所有精彩的帖子。我从中受益匪浅。
我有一个关于分隔输入特征 X 和响应变量 Y 的代码的问题。您似乎将最后一列也包含在特征中,这不应该发生。
X = dataset[:,0:8]
正确的应该是 X = dataset[:, 0:7],以匹配患者医疗详细信息的 8 个输入变量。
您的迷你课程手册中也出现了这个错误。
不客气,启昌。
也许您使用的 Python 或 Numpy 版本不同,导致结果也不同。
我可以确认帖子中的代码是正确的
共有 9 列,前 8 列存储在 X 中,第 9 列存储在 Y 中。上述代码片段会生成
这有帮助吗?
在 Python 2.7.11 和 numpy 1.11.1 上测试。
嗨,Jason,
非常感谢您的快速回复。是我的错误,我最近也在学习 R 语言,所以对 0:8 有些困惑。在 R 语言中,0:8 的最后一个数字是包含在内的,而在 Python 中则是排除的。我应该检查一下 shape。
再次感谢。
没问题,启昌。
嗨
我运行代码后得到这个错误
model = xgboost.XGBClassifier()
AttributeError: 'module' object has no attribute 'XGBClassifier'
你知道为什么吗?
谢谢
您需要导入 xgboost。
嗨,杰森。感谢您这个阐述清晰的教程。但我似乎遇到了同样的问题,尽管我已经导入了 xgboost。
您的代码中可能存在拼写错误,请确保您完全复制了代码。
你正在做的是——
import xgboost
这样做,代码应该就能正常运行——
from xgboost import XGBClassifer
感谢 Jason 的清晰指导。
在实践中提高准确性的常用方法是什么?我们应该做一些特征工程,还是换一个不同的模型?
我通过在线课程学习了机器学习的基础知识,但在课程中学到的知识与 Kaggle 上的比赛等实际问题之间仍然存在差距。您能分享一些见解吗?
我建议先尝试一些特征工程。
尝试一些新的问题表述方式。
然后稍后尝试算法调优和集成方法。
我在以下帖子中列出了一些可以尝试的事情,它讨论了深度学习,但这些技术对于大多数方法来说都是通用的。
https://machinelearning.org.cn/improve-deep-learning-performance/
希望这些能作为一个开始有所帮助。
谢谢你,这非常有帮助。
我昨晚为我的数据编写了一个模型,它的表现非常好。
今天我尝试重新运行它,它在导入 xgboost 时给我一个错误。
我输入了 “import xgboost”
我收到:“ImportError: No module named xgboost”
很抱歉听到这个消息,杰西卡。
我怀疑您的环境是否发生了变化。
也许尝试从命令行运行所有内容。
确认您使用的是相同的用户。
确认 xgboost 仍在系统上安装(pip show 或类似命令…)
你好,感谢您精彩的解释!!
我有一个疑问。我们能否获取进入模型的显著变量列表?我们如何读取“feature_importances_”?
另外,如何微调 xgboost 模型?
再次感谢!
很好的问题,特鲁普蒂,
这里有一个关于 xgboost 特征重要性的教程
https://machinelearning.org.cn/feature-importance-and-feature-selection-with-xgboost-in-python/
这里有一个关于调整 xgboost 的教程
https://machinelearning.org.cn/tune-number-size-decision-trees-xgboost-python/
我还有很多,请尝试搜索功能。
非常感谢!我会试试这个。
为此,我们必须安装 joblib 对吗?
你可能需要。
嘿,Jason
你能告诉我 XGBoost 是否有任何参数吗
我有很多关于如何调整 xgboost 的帖子,你可以从这里开始。
https://machinelearning.org.cn/start-here/#xgboost
你好。感谢您的解释!
你能告诉我我是否能看到进入模型的变量列表吗?另外,我们如何进一步微调模型呢?
一旦我们有了 xgboost 模型……我们如何将其投入生产?在逻辑回归中,我们会得到一个可以自动化以实时生产的方程,那么在 xgboost 中我们能得到什么呢?
我建议将模型保存到文件以供生产使用。这里有一个例子
https://machinelearning.org.cn/save-gradient-boosting-models-xgboost-python/
嗨,Jason,我遇到了和这里一些读者一样的问题
AttributeError: 'module' object has no attribute 'XGBClassifier'
为了确保我没有拼写错误,我创建了一个完整的代码副本,但仍然得到相同的问题。
(我的代码中确实有 import xgboost)。
我正在使用 xgboost 0.6a2 和 anaconda2-4.2.0。只是想知道您是否遇到过类似问题。
你好 Jason,我运行了这里的示例代码,返回一个错误:
文件 “./test.py”,第 21 行
model = xgboost.XGBClassifier()
^
SyntaxError: invalid syntax
你能告诉我我做错了什么吗?我成功导入了包。
我正在使用 python 3.5 和 xgboost 0.6。
也许是复制粘贴错误?检查您复制代码中是否有额外的空格。
我正在使用 predict_proba 来通过 xgboost 模型创建预测概率。我能否将这些概率保存在构建模型的同一训练数据中,以便我可以进一步创建报告以向管理层展示记分卡的验证情况。
抱歉,我不太明白。
训练数据集上的预测概率会存在偏差。您可能需要报告留出数据集的概率。
嗨,这是一个非常好的 xgboost 介绍。请为 train_test_split 函数添加一个导入。
已修复,感谢您的提醒。
嗨,Jason,
我找不到关于 predict_proba() 输出的概率如何计算的清晰解释。
例如,在随机森林中,我理解它反映了所有树中相关叶子中属于该类别的样本比例的平均值。
然而,在 XGBoost 中,我无法从文档或代码中理解其计算方法。它不应该为每棵树赋予不同的权重吗?
好问题,凯伦,我手头不太清楚。
您可以查阅一些原始的随机梯度提升论文,甚至联系 xgboost 的作者。
嗨,Jason,感谢您如此清晰的解释,您能否帮助我了解在 xgboost 中调用 fit 函数时如何打印训练准确度?
很高兴它有帮助。
您可以在新的测试上评估拟合模型。您是这个意思吗?
请看这篇文章
https://machinelearning.org.cn/evaluate-performance-machine-learning-algorithms-python-using-resampling/
你好,
感谢您的帖子。它真的很有帮助。但是你能告诉我为什么我运行这段代码时会收到“ImportError: cannot import name XGBClassifier”?我已经成功安装了 XG Boost,但我仍然有这个错误。请帮帮我。
也许你没有安装 sklearn?
如何将 Xgboost 分类器和深度学习结合起来并创建集成(投票分类器)……您能详细说明一下集成技术吗
也许是投票或堆叠。
在您的逐步解释中,您写道:“from xgboost import XGBClassifier”,然后您使用:“model = xgboost.XGBClassifier()”。这将导致错误。
但在完整的代码中,您写对了。
谢谢 joao。已修复!
您好 Jason 博士,感谢您的快速精彩教程。它非常基础且非常有益。
有一个问题,我如何在 XGBoost 中使用 GPU 进行训练和预测?我正在处理大型数据集。提前非常感谢。
抱歉,我手头上没有,抱歉。
嘿!这个表现很好,但我怎么知道选择了哪些特征
?
抱歉,我问了一个错误的问题……
非常感谢
不客气。
天哪,这二十多行代码几乎是所有监督学习任务的基本配方,而 XGBoost 就像默认算法一样。我希望有一种方法可以“双重”收藏这个页面。做得好!
谢谢 Eric!
嗨,Jason,
XGBClassifier的默认目标是binary:logisitc。对于binary:logistic,其目标函数是logloss的总和吗?如果是,为什么XGBoost使用“error”(准确率分数)作为默认评估指标而不是“logloss”?
https://github.com/dmlc/xgboost/blob/master/doc/parameter.md#learning-task-parameters
Kono
请您给我一个例子,说明如何使用训练数据开发模型并对测试数据执行测试?
我的意思是,我该如何做到以下几点:
1. 使用训练数据开发模型并使用测试数据进行预测;
2. 使用组合数据集(训练和测试数据集)并应用交叉验证。
这篇文章应该能帮助您开发一个最终模型
https://machinelearning.org.cn/train-final-machine-learning-model/
嗨,Jason
如何调整这个模型中的参数?
这个黑盒似乎能做所有事情,但我们不知道其中的细节
您可以使用超参数来改变模型的训练方式。
谢谢,但什么是超参数?xgboost中的一个包吗?
有示例代码吗?
超参数是配置算法的方式,在这里了解更多
https://machinelearning.org.cn/difference-between-a-parameter-and-a-hyperparameter/
谢谢!
嗨 Jason
感谢非常好的教程。如果您能给我一些建议,我将不胜感激。
我有一些振动数据(结构化格式)。我正在使用TensorFlow的深度学习Keras。但我读到“具体来说,梯度提升用于结构化数据可用问题,而深度学习用于图像分类等感知问题。”
前者从业者几乎总是使用
出色的XGBoost库,它支持两种最流行的语言
数据科学:Python和R”
我非常困惑,想听听您的专家意见,我是否需要切换并使用梯度提升?我对此用于回归目的很感兴趣。
期待您的回复。
纳西尔
是的,您听到了很好的建议!
您好,先生,
我正在尝试使用这个
from xgboost import XGBClassifier
但它给了我一个错误,说无法导入名称“XGBClassifier”
但是当我导入xgboost时它却可以工作。
您能告诉我我的错误为什么它不工作吗?
也许API已经改变了?
糖尿病数据集的链接返回404错误。知道它去哪儿了吗?
我会尽快修复。
我收到一个错误`XGBoostError: sklearn需要安装才能使用此模块`,但我_确实_在活动环境中安装了sklearn(在所有其他环境中。我想是)。
或许您可以通过检查其版本来确认sklearn已安装?
这篇文章可以帮助您
https://machinelearning.org.cn/setup-python-environment-machine-learning-deep-learning-anaconda/
我是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并获得了所有分数,但这是否是获取预测分数的方式,还是有其他方法?
看起来您正在尝试处理文本数据,或许可以从这里开始
https://machinelearning.org.cn/start-here/#nlp
谢谢杰森,这个博客真的很有帮助。
我注意到您引用的数据集不再可用。您能推荐另一个二分类数据集吗?谢谢 –
您可以从这里下载
https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv
一旦我建立了模型,如何获取决策规则集(特征的切分点)?
好问题,通常考虑到模型中可能有成百上千棵树,这不可行。
感谢您的工作。我在尝试执行以下操作时遇到了错误:
model = XGBClassifier(objective=’multi:softprob’)
model.fit(X_train, Y_train)
错误是:b’参数num_class的值0应该大于等于1’
如果我不指定objective=’multi:softprob’,它就能正常工作。只是想知道您是否有使用XGBClassifier(objective=’multi:softprob’)的经验?
谢谢
抱歉,我没有见过这个错误。
也许可以发布到 stackoverflow?
嗨!
我目前正在一个重要项目上试验XGBoost,并在StackOverflow上发布了一个问题。我刚读完这篇文章,现在更清楚了,但是您没有使用xgboost.train方法。这是否包含在XGBRegressor包装器中?我确实使用了xgboost.train,它给了我一个错误,而xgboost.fit没有产生这个错误。您能帮忙看看吗?
https://stackoverflow.com/questions/50426680/xgboost-gives-keyerror-best-msg
提前感谢!
诚挚的问候
您能用一两句话给我总结一下您的问题吗?
你好,
我正在使用XGBRegressor包装器来预测产品的销售额,有50种产品,我想知道线性回归中的系数,以查看哪种产品销售对因变量销售额的影响程度。比如说 Y = B1X1 + B2X2 + ….. BnXn + C,我想从树回归器(XGBRegressor)中获取B1,B2,….Bn的值。
xgboost模型与线性回归不同。没有系数列表,只有大量的树。
谢谢,但是有没有办法可以确定其他产品销售额对我的因变量(销售额)的影响百分比呢?
变量
是的,但这可能是一个统计方法的问题,而不是预测建模的问题。
Jason,感谢这篇精彩的文章(和网站)
我有一个文本分类问题,通常使用逻辑回归来解决。所以我习惯于转换特征以适应模型,但我通常不需要对文本标签做任何事情。标签是文本类别(例如labels = [‘cancel’, ‘change’, ‘contact support’, 等)。我现在收到错误
dtrain = xgb.DMatrix(X_train_dtm, label=y_train)
TypeError: 必须是实数,而不是字符串
y_train是文本数据。我该如何开始解决这个问题?有什么提示吗?我需要对标签进行某种转换吗?
您必须将标签编码为整数。您可以使用标签编码器来完成此操作。
我在这里解释了更多
https://machinelearning.org.cn/faq/single-faq/how-to-handle-categorical-data-with-string-values
你好,
好文章
只想说,对于分类问题,最好使用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,
当我将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的模型吗?如果不是,为什么?
更多数据通常更好。
这些差异可能不是真实的,例如统计噪声。
model.predict(X_test)给出类别预测。
model.predict_proba(X_test)给出分数预测。
所以我想如果我们执行model.predict(X_test),我们就不需要对结果进行四舍五入。我说的对吗?
谢谢!
是的,API近年来变化很大。
Jason,
我是机器学习新手,但对回归有一定了解。所以从这个模型的输出中我了解到这些变量(X)在预测Y方面有77.95%的准确率。我的问题是如何应用这些数据?我能创建一个函数,输入这些变量(X),来预测某人患糖尿病Y的概率吗?
埃里克
是的,您可以将模型作为软件应用程序的一部分,该应用程序接受输入并使用输出。
嗨 Jason
感谢您的教程,我用默认参数在xgboost和sklearn的GradientBoostingClassifier上运行了我的训练/测试数据,它们得到了相同的结果,但xgboost在训练和测试方面比GB慢(大约30%的差异)。
这似乎很奇怪?Xgboost是不是应该比sklearn的GBM快得多?
我的笔记本电脑是i7-5600u,它应该有4个线程。
谢谢!
也许这不是一个公平的比较,例如,模型配置不同?
你好,
我正在尝试将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 ()
我很抱歉,不确定,或许可以尝试发布到stackoverflow?
你好,杰森
我想知道这两种代码有什么区别?以及您建议我使用哪一种?
# 加载数据
# 将数据拆分为 (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)
也许可以在您的问题上都尝试一下,然后使用在您的数据集上表现最好的那个?
如何在逻辑回归中使用Xgboost。
我不知道,抱歉。
我听说我们可以使用xgboost来提取最重要的特征,并用这些特征拟合逻辑回归。例如,如果我们有一个包含1000个特征的数据集,我们可以使用xgboost提取前10个重要特征,以提高另一个模型的准确性。例如逻辑回归、SVM等,就像我们使用RFE一样。
您可以使用xgboost提供特征重要性分数,然后使用这些分数选择最重要的特征,然后根据这些特征拟合模型。
也许从这里开始
https://machinelearning.org.cn/feature-importance-and-feature-selection-with-xgboost-in-python/
非常感谢!!!解释得太好了!!
不客气,我很高兴它有所帮助。
首先,非常感谢您提供了如此优质的内容。实际上,我一直在尝试实现多类别文本分类,为此,我尝试使用Word2Vec模型生成词嵌入,您有什么其他生成词嵌入的建议吗?
我的另一个问题是,如何处理同时包含文本(非类别)和数值的数据?您有这类问题的示例吗?
提前感谢。
我对文本分类的最佳建议在这里
https://machinelearning.org.cn/best-practices-document-classification-deep-learning/
对于文本和数字数据,您可以使用多输入模型,这篇文章将向您展示如何操作
https://machinelearning.org.cn/keras-functional-api-deep-learning/
你好,我正在处理一个形状为(7026,63)的数据集,我尝试在其上运行xgboost、gradientboosting和adaboost分类器,但它返回的准确率很低。我尝试调整了一下参数,但ada仍然给了我60%,xgboost给了我45%,而gradient boosting给了我0.023。如果您能解释一下为什么它工作不佳,我将非常感激。
我这里有一些关于如何配置xgboost的建议,可能会有所帮助
https://machinelearning.org.cn/start-here/#xgboost
嗨!感谢这篇有用的文章。当我对y_pred进行四舍五入时,在这行代码中遇到了一个奇怪的问题:
predictions = [round(value) for value in y_pred]
它显然是一个二维数组,python给我一个错误,说
错误“TypeError: numpy.ndarray类型没有定义__round__方法”
您有没有遇到过这个错误或知道为什么会发生这种情况?
听到这个消息我很难过。
或许可以尝试直接使用预测结果,而不进行四舍五入?
嗨,Jason,感谢您这篇精彩的文章!
有没有办法实现增量/批处理学习?
用Xgboost吗?抱歉,我一下子不确定。
嗨,Jason,
当我在xgboost模型上运行预测时,我得到一个错误:
ValueError: feature_names mismatch: [‘f0’, ‘f1’,….] [‘Application’, ‘Amount’….]
输入数据中预期有f20, f12,…..
训练数据中没有以下字段:Application, Amount,………..
对于单个记录,预测正在发生。对于 Test_Data,我收到了上述错误(训练数据和测试数据不是通过 train_test_split 生成的,两者是独立的数据集)。
也许可以从 CSV 文件中删除标题?或者在没有列标题的情况下加载数据?
那么,假设我们的研究人员回去从这个人群中获取了新的数据,现在想让你将这些新数据输入到你的模型中,以预测当前人群患糖尿病的风险。你会以同样的方式(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))
抱歉我理解不足,很多教程都停留在准确性测试,没有涵盖“接下来做什么”。
谢谢
不,对新数据进行预测涉及在所有可用的带标签的训练数据上拟合模型,然后使用该模型对没有标签的新数据进行预测。
更多细节在此
https://machinelearning.org.cn/train-final-machine-learning-model/
这有帮助吗?
嗨 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) 定义了训练和测试样本大小。
现在不再需要四舍五入,我相信 API 会直接正确预测类别。例如:
我不这么认为,这个例子运行良好。现在在最新版本上运行我得到
或许仔细检查你是否拥有所有代码和最新版本的库
https://machinelearning.org.cn/faq/single-faq/why-does-the-code-in-the-tutorial-not-work-for-me
我使用 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: 元组索引超出范围
是因为我只使用了一个属性吗?如何解决?
提前感谢
这很奇怪。
不,XGBoost 可以很好地使用一个特征作为输入。
也许确认你的数据加载正确,并且你有一个列和 n 行。
嗨,Jason,
1). 如何将本文中构建的模型应用于生产?
2)(.在构建模型之后,您能否指明部署机器学习模型的方向或文章?
谢谢,
索菲亚
必须开发一个最终模型
https://machinelearning.org.cn/train-final-machine-learning-model/
然后你可以部署你的模型,也许这个会有帮助
https://machinelearning.org.cn/faq/single-faq/how-do-i-deploy-my-python-file-as-an-application
您能举一个使用 XGBRegressor 及其参数的例子吗?
是的,请看这个教程
https://machinelearning.org.cn/spot-check-machine-learning-algorithms-in-python/
嘿,谢谢你的教程。
我尝试了学习变量,并且更改 XGBClassifier 的参数并没有提高准确性,但是,我将 test_size 减小到 0.14(我尝试了不同的值),准确性达到了 84%。我使用 Python 3.6.8 和 0.9 XGBoost 库。
你认为这是因为算法的改进而有所不同,还是建议的大小导致结果过拟合?
测试集可能太小了。
也许可以尝试 k 折交叉验证来评估模型性能?
你好,
我正在尝试使用我的数据运行这段代码,但是我的内核一直崩溃… 我不知道为什么,我没有收到任何错误。只有一个弹出窗口:“您的内核已崩溃。” 有什么建议吗?
听到这个消息我很难过。
也许你的开发环境有问题?这可能会有帮助
https://machinelearning.org.cn/setup-python-environment-machine-learning-deep-learning-anaconda/
🎩🩵🍷🖖
如何在时间序列预测中应用 XGBoost?
首先将滞后观测转换为输入特征
https://machinelearning.org.cn/convert-time-series-supervised-learning-problem-python/
感谢您的教程
顺便问一下,标签必须是数字吗?
因为我的标签是字符串,总是出错
字符串标签必须进行标签/整数编码。
谢谢你的信息 🙂
不客气。
如果我想用 XGB 标记单行怎么办?
我用一个数据集(来自 Kaggle 的心血管疾病数据)训练了我的 XGB 模型,该数据集有 13 个特征 +1 个目标(0/1)。
我有一个包含 13 个值的数组,我想对其进行预测(1 行 x 13 列)
array_to_predict = [[…],[…]……]
print(model.predict(array_to_predict))
如何初始化数组才能正确预测?
对预测概率使用 argmax。
也许看看这个
https://machinelearning.org.cn/make-predictions-scikit-learn/
嗨,Jason,
是否可以使用支持向量机作为 XGBoost 分类器中的基本学习器?我尝试了“gbtree”和“gblinear”,令人惊讶的是,“gblinear”在我的乳腺癌分类数据集的几个指标上击败了“gbtree”。这可能吗,因为“gblinear”只能建立线性关系,而“gbtrees”也可以考虑非线性关系?
不行。
嗨,Jason,
我想预测百分比,所以我的目标值在 [0,1] 范围内。问题是 reg:linear 给出的输出超出了范围。我在 stackoverflow 上看到,有人建议使用带有 XGBRegressor() 类的 reg:logistic。我尝试了 reg:logistic,结果非常有希望!但我没有有效的理由这样做。你认为应用 reg:logistic 可以吗,还是没有意义?
非常感谢!
也许可以尝试一下,也可以尝试校准预测概率。
嗨 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
很抱歉听到这个消息,也许这些建议会有些帮助
https://machinelearning.org.cn/faq/single-faq/can-you-read-review-or-debug-my-code
感谢您的清晰解释。我是机器学习的新手。
我用 XGBRegressor 创建并训练了一个模型。我想获取每个特征的最佳偏差和残差,并将其用作我应用程序前端的线性回归。这可能吗?如果可能,我该如何实现?
再次感谢您的帮助。
不客气。
抱歉,我不明白您说的“每个特征的最佳偏差和残差”是什么意思,您能详细说明一下吗?
你好,
我非常喜欢你解释一切的方式,但我无法下载数据集。链接打开了数据集,但我该如何下载呢?
谢谢。
或许可以右键点击链接并选择“另存为”。
如果我使用 XGBoost 回归器,我能得到直线的方程吗?
不,XGBoost 不能(轻易地)简化为方程。它是一个由大量加权决策树组成的集合。
如果我想使用 xgboost 进行预测,并且我有 6 个特征作为输入,那么获取该预测结果的用户输入命令是什么?
model.predict( )
括号里能放什么?
我将特征值放入列表 [0,0,44,18,201,5430]
model.predict( [0,0,44,18,201,5430])
但我得到错误?
请提供解决方案
一行数据,例如
你可以在这里了解更多
https://machinelearning.org.cn/make-predictions-scikit-learn/
你好,先生,
我在安装 XGBoost 时遇到了问题。我收到一个错误“sudo 未被识别为内部或外部命令”。您能帮我纠正这个错误吗?
如果你在 Windows 上,也许可以去掉“sudo”。
你可能应该完全放弃 sudo,因为 sudo pip 可能存在安全风险。
感谢您的反馈和建议,Greg!
你好 Jason!感谢您的*简单*解释。
我正在使用 XGboost 训练一个多类数据集,但我得到的整体准确率非常低(70%),然而,当使用 SVM+TFIDF 时,我得到了更好的准确率 79%。这是因为我的高向量维度(使用三元组)吗?还是参数调整?XGBoost 不是应该表现得更好甚至与 SVM 相同吗?而不是更差
不客气!
也许 xgboost 不太适合你的问题?
或许需要一些数据预处理?
也许需要进行一些模型调优?
我做了大量的预处理,但我的问题仍然在于我的类别之间存在重叠词。您能推荐一个可能有帮助的算法吗?
很难知道哪种算法最适合给定的数据集,相反,你必须使用系统实验来发现哪种效果最好。
嗨 Jason,谢谢这篇有用的文章。
我一直在努力寻找合适的算法/库来为学习排名问题实现解决方案,其中响应变量具有较大的值 1..200000,需要对其进行排名/训练。
我在网上搜索了很多,找到了 RankSVM、LamdaRank、XGBRanker 等选项,但发现它们实际上不起作用——要么导致错误,要么难以实现(即无法直接适应我的问题)。
作为 DMLC 实现的一部分,我遇到了 XGBRankerMixIn 类。这可以适应我的解决方案吗?或者您能为我的问题推荐合适的参考文献/实现吗?
不客气。
抱歉,我没有使用过它。我无法给你好的即兴建议。希望我将来能写关于这个主题的文章。
你找到解决你问题的参考文献/实现了吗?
如果你有一些参考文献,请告诉我,我也有同样的问题
好的 Jason。感谢您的快速回复。
不客气。
嗨!感谢您的文章。
我一直按照您在文章中的做法进行。然而,在 Google Colab 中,代码变成
from xgboost import XGBClassifier
xgb1 = XGBClassifier()
xgb1.fit(X_train,y_train)
Colab 卡在 xgb1.fit(X_train,y_train) 上。是训练需要很长时间还是有错误?我没有收到任何错误,它只是在执行。
或许尝试在你的机器上运行代码。
嗨,Jason,
我对“subsample”参数有疑问。
我使用默认值(除了“subsample”被设置为 0.9)运行了分类器。准确率超过 79%。
然而,在多次重新运行同一个分类器后,准确率在 77% 到 79% 之间波动,这是因为根据 subsample 值随机选择观测值来构建提升树。如果我错了,请纠正我。
当我们将 subsample 值保持小于 1 时,是否有选项可以控制 XGBoost 分类器或为其提供种子值?我们在 Train_Test_Split 中就是这样做的。
谢谢
是的,没错,请看这个
https://machinelearning.org.cn/different-results-each-time-in-machine-learning/
谢谢 Jason!
你的博客对我帮助很大。阅读评论区里的这些问题同样有助于获得更深入的理解。
再次感谢 🙂
不客气!
嗨,Jason,
我在 Google Colab 上运行代码。我已经安装了 xgboost 并导入了分类器。
model = XGBClassifier()
model.fit(x_train, y_train)
当我运行此代码时,我得到 XGBClassifier() 作为输出。我没有得到任何值。你能帮我一下吗?
预期如此。你将 `model` 创建为一个 XGBClassifier 对象,然后用你的数据训练该模型。该对象的内部状态现在已更新。你需要使用它进行预测才能生成有用的结果。
嗨,Jason,
感谢这个对像我这样的初学者非常有帮助的教程。
我有一个 csv 文件,其中包含 1000 行观测数据,约有 200 个变量。最后一列是一个二元结果(0/1),表示是否发生了感兴趣的事件。
接下来的 200 行包含了我希望预测结果是否会发生的观测数据。这些 200 行的结果列中缺少数据。
换句话说,我的文件已经分为训练集(第 1-1000 行)和测试集(第 1001-1200 行)。如何在 XGBoost 中指定这种安排并获取最后 200 行的预测结果?我还需要获取每个最后 200 行的结果概率,而不仅仅是四舍五入的值。
谢谢你。
嗨 Tony……非常欢迎!你遇到任何问题或者有什么需要我们帮助解决的问题吗?
感谢您的信息,如果我想预测第 20 列,我应该如何更改目标预测?我有 20 列,我想根据其他列预测最后一列?
嗨 Shah……以下内容可能会让你感兴趣
https://machinelearning.org.cn/xgboost-for-time-series-forecasting/
https://machinelearning.org.cn/xgboost-for-regression/
谢谢,这正是我所需要的
非常欢迎你,deva!我们感谢你的反馈!