XGBoost 是梯度提升集成算法的强大且流行的实现。
配置 XGBoost 模型的一个重要方面是选择在模型训练过程中最小化的损失函数。
正如我们在深度学习神经网络中根据问题类型选择合适的损失函数一样,损失函数也必须与预测建模问题的类型相匹配。
在本教程中,您将了解如何为 XGBoost 集成模型配置损失函数。
完成本教程后,您将了解:
- 在 XGBoost 集成训练时指定损失函数是一个关键步骤,这一点非常类似于神经网络。
- 如何为二分类和多分类任务配置 XGBoost 损失函数。
- 如何为回归预测建模任务配置 XGBoost 损失函数。
让我们开始吧。

XGBoost 损失函数简明介绍
照片由 Kevin Rheese 提供,部分权利保留。
教程概述
本教程分为三个部分;它们是:
- XGBoost 和损失函数
- XGBoost 的分类损失
- XGBoost 的回归损失
XGBoost 和损失函数
Extreme Gradient Boosting,简称 XGBoost,是梯度提升算法的一个高效开源实现。因此,XGBoost 是一个算法、一个开源项目和一个 Python 库。
它最初由 Tianqi Chen 开发,并在 Chen 和 Carlos Guestrin 2016 年的论文“XGBoost: A Scalable Tree Boosting System”中进行了描述。
它旨在兼具计算效率(例如,执行速度快)和高效性,可能比其他开源实现更有效。
XGBoost 支持一系列不同的预测建模问题,其中最显著的是分类和回归。
XGBoost 通过最小化目标函数相对于数据集的损失来训练。因此,损失函数的选择是一个关键的超参数,并且与要解决的问题类型直接相关,这与深度学习神经网络非常相似。
该实现允许通过“objective”超参数指定目标函数,并且使用了适用于大多数情况的合理默认值。
尽管如此,初学者在使用 XGBoost 模型训练时,对于使用哪种损失函数仍然存在一些困惑。
在本教程中,我们将更详细地介绍如何配置 XGBoost 的损失函数。
在开始之前,我们先进行设置。
XGBoost 可以作为一个独立的库安装,并且可以使用 scikit-learn API 开发 XGBoost 模型。
第一步是安装 XGBoost 库(如果尚未安装)。这可以通过在大多数平台上使用 pip python 包管理器来实现;例如:
1 |
sudo pip install xgboost |
然后,您可以通过运行以下脚本来确认 XGBoost 库已正确安装并可以使用。
1 2 3 |
# 检查 xgboost 版本 import xgboost print(xgboost.__version__) |
运行脚本将打印您已安装的 XGBoost 库的版本。
您的版本应该相同或更高。否则,您必须升级您的 XGBoost 库版本。
1 |
1.1.1 |
您可能会遇到最新版本库的问题。这不是您的错。
有时,最新版本的库会施加额外的要求或可能不太稳定。
如果您在尝试运行上述脚本时遇到错误,我建议降级到 1.0.1 版(或更低)。这可以通过在 pip 命令中指定要安装的版本来实现,如下所示:
1 |
sudo pip install xgboost==1.0.1 |
如果您看到警告消息,您可以暂时忽略它。例如,下面是一个您可能会看到的可以忽略的警告消息的示例
1 |
FutureWarning: pandas.util.testing 已弃用。请使用 pandas.testing 中的公共 API 函数。 |
如果您需要特定于您的开发环境的说明,请参阅教程:
XGBoost 库有自己的自定义 API,尽管我们将通过 scikit-learn 包装器类使用方法:XGBRegressor 和 XGBClassifier。这将允许我们使用 scikit-learn 机器学习库的全套工具来准备数据和评估模型。
这两个模型的运行方式相同,并接受相同的参数,这些参数影响决策树的创建和添加到集成中的方式。
有关如何将 XGBoost API 与 scikit-learn 结合使用的更多信息,请参阅教程
接下来,让我们更详细地了解如何为 XGBoost 在分类问题上配置损失函数。
XGBoost 的分类损失
分类任务涉及在给定输入样本的情况下,为每个可能的类别预测一个标签或概率。
分类任务有两种主要类型,具有互斥的标签:二分类(有两个类别标签)和多分类(有三个或更多类别标签)。
- 二分类:具有两个类别标签的分类任务。
- 多分类:具有两个以上类别标签的分类任务。
有关不同类型分类任务的更多信息,请参阅教程
XGBoost 为这些问题类型提供了损失函数。
在机器学习中,通常的做法是训练一个模型来预测概率任务的类别成员概率,如果任务需要清晰的类别标签,则对预测的概率进行后处理(例如,使用argmax)。
这种方法用于训练深度学习神经网络进行分类,当使用 XGBoost 进行分类时也推荐使用。
用于预测二分类问题的概率的损失函数是“binary:logistic”,用于预测多分类问题的类别概率的损失函数是“multi:softprob”。
- “binary:logistic”:XGBoost 二分类损失函数。
- “multi:softprob”:XGBoost 多分类损失函数。
在配置 XGBClassifier 模型时,可以通过“objective”超参数指定这些字符串值。
例如,对于二分类
1 2 3 |
... # 定义二分类模型 model = XGBClassifier(objective='binary:logistic') |
而对于多分类
1 2 3 |
... # 定义多分类模型 model = XGBClassifier(objective='multi:softprob') |
重要的是,如果您不指定“objective”超参数,XGBClassifier 将根据训练期间提供的数据自动选择其中一种损失函数。
我们可以通过一个实例化的例子来具体说明。
下面的示例创建一个合成的二分类数据集,在数据集上拟合一个具有默认超参数的XGBClassifier,然后打印模型的目标函数配置。
1 2 3 4 5 6 7 8 9 10 11 |
# 二分类自动选择损失函数的示例 from sklearn.datasets import make_classification from xgboost import XGBClassifier # 定义数据集 X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1) # 定义模型 model = XGBClassifier() # 拟合模型 model.fit(X, y) # 总结模型损失函数 print(model.objective) |
运行该示例将在数据集上拟合模型并打印损失函数配置。
我们可以看到模型为二分类自动选择了一个损失函数。
1 |
binary:logistic |
或者,我们可以指定目标函数并拟合模型,确认损失函数已被使用。
1 2 3 4 5 6 7 8 9 10 11 |
# 为二分类手动指定损失函数的示例 from sklearn.datasets import make_classification from xgboost import XGBClassifier # 定义数据集 X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1) # 定义模型 model = XGBClassifier(objective='binary:logistic') # 拟合模型 model.fit(X, y) # 总结模型损失函数 print(model.objective) |
运行该示例将在数据集上拟合模型并打印损失函数配置。
我们可以看到模型用于为二分类指定损失函数。
1 |
binary:logistic |
我们用一个包含三个类别的数据集重复此示例。在这种情况下,三个类别。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 |
# 为多分类自动选择损失函数的示例 from sklearn.datasets import make_classification from xgboost import XGBClassifier # 定义数据集 X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1, n_classes=3) # 定义模型 model = XGBClassifier() # 拟合模型 model.fit(X, y) # 总结模型损失函数 print(model.objective) |
运行该示例将在数据集上拟合模型并打印损失函数配置。
我们可以看到模型为多分类自动选择了一个损失函数。
1 |
multi:softprob |
或者,我们可以手动指定损失函数并确认它被用于训练模型。
1 2 3 4 5 6 7 8 9 10 11 |
# 为多分类手动指定损失函数的示例 from sklearn.datasets import make_classification from xgboost import XGBClassifier # 定义数据集 X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1, n_classes=3) # 定义模型 model = XGBClassifier(objective="multi:softprob") # 拟合模型 model.fit(X, y) # 总结模型损失函数 print(model.objective) |
运行该示例将在数据集上拟合模型并打印损失函数配置。
我们可以看到模型用于为多分类指定损失函数。
1 |
multi:softprob |
最后,还有其他损失函数可用于分类,包括:二分类的“binary:logitraw”和“binary:hinge”,以及多分类的“multi:softmax”。
您可以在此处查看完整列表
接下来,让我们看一下 XGBoost 的回归损失函数。
XGBoost 的回归损失
回归是指在给定输入样本的情况下预测数值的预测建模问题。
虽然预测概率听起来像是一个回归问题(即概率是一个数值),但它通常不被认为是回归类型的预测建模问题。
XGBoost 在预测数值时使用的目标函数是“reg:squarederror”损失函数。
- “reg:squarederror”:回归预测建模问题的损失函数。
在配置 XGBRegressor 模型时,可以通过“objective”超参数指定此字符串值。
例如
1 2 3 |
... # 定义回归模型 model = XGBRegressor(objective='reg:squarederror') |
重要的是,如果您不指定“objective”超参数,XGBRegressor 将自动为您选择此目标函数。
我们可以通过一个实例化的例子来具体说明。
下面的示例创建一个合成的回归数据集,在数据集上拟合一个XGBRegressor,然后打印模型的对象函数配置。
1 2 3 4 5 6 7 8 9 10 11 |
# 回归自动选择损失函数的示例 from sklearn.datasets import make_regression from xgboost import XGBRegressor # 定义数据集 X, y = make_regression(n_samples=1000, n_features=20, n_informative=15, noise=0.1, random_state=7) # 定义模型 model = XGBRegressor() # 拟合模型 model.fit(X, y) # 总结模型损失函数 print(model.objective) |
运行该示例将在数据集上拟合模型并打印损失函数配置。
我们可以看到模型为回归自动选择了一个损失函数。
1 |
reg:squarederror |
或者,我们可以指定目标函数并拟合模型,确认损失函数已被使用。
1 2 3 4 5 6 7 8 9 10 11 |
# 回归手动指定损失函数的示例 from sklearn.datasets import make_regression from xgboost import XGBRegressor # 定义数据集 X, y = make_regression(n_samples=1000, n_features=20, n_informative=15, noise=0.1, random_state=7) # 定义模型 model = XGBRegressor(objective='reg:squarederror') # 拟合模型 model.fit(X, y) # 总结模型损失函数 print(model.objective) |
运行该示例将在数据集上拟合模型并打印损失函数配置。
我们可以看到模型用于为回归指定损失函数。
1 |
reg:squarederror |
最后,还有其他损失函数可用于回归,包括:“reg:squaredlogerror”、“reg:logistic”、“reg:pseudohubererror”、“reg:gamma”和“reg:tweedie”。
您可以在此处查看完整列表
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
教程
API
总结
在本教程中,您学习了如何为 XGBoost 集成模型配置损失函数。
具体来说,你学到了:
- 在 XGBoost 集成训练时指定损失函数是一个关键步骤,非常类似于神经网络。
- 如何为二分类和多分类任务配置 XGBoost 损失函数。
- 如何为回归预测建模任务配置 XGBoost 损失函数。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
尊敬的Jason博士,
最新的 xgboost 版本是 1.3.3
谢谢你
悉尼的Anthony
干得不错。
你好,Jason。
这是一篇非常棒且信息量丰富的博文。有几个问题/评论
1. 在下面的代码片段中,第一行是否应该写“binary:logistic”而不是“multi:logistic”?
“multi:logistic“:XGBoost 二分类损失函数。
“multi:softprob“:XGBoost 多分类损失函数。
2. 同样,在下面的代码片段中,第二行是否应该写“multi:softprob”而不是“binary:softprob”?
# 定义多分类模型
model = XGBClassifier(objective=’binary:softprob’)
谢谢!
Mahdi
谢谢。
已修复!
您好,您是否为二分类/多分类多标签任务使用了任何特定的函数?谢谢。