XGBoost 是梯度提升集成算法的强大且流行的实现,配置 XGBoost 模型的一个重要方面是选择在模型训练期间最小化的损失函数。

该损失函数必须匹配预测建模问题类型,以同样的方式,我们必须选择根据问题类型与深学习神经网络的适当的损耗的功能。

XGBoost 和损失函数

Extreme Gradient Boosting,简称 XGBoost,是梯度提升算法的高效开源实现。因此 XGBoost 是一个算法、一个开源项目和一个 Python 库。

xgboost实例分析(xgboost实例推导)(1)

它最初由 Tianqi Chen 开发,并由 Chen 和 Carlos Guestrin 在 2016 年题为“ XGBoost:A Scalable Tree Boosting System ”的论文中进行了描述。

它被设计为计算效率高(例如执行速度快)和高效,可能比其他开源实现更有效。

XGBoost 支持一系列不同的预测建模问题,最显着的是分类和回归。 通过最小化目标函数对数据集的损失进行训练。因此,损失函数的选择是一个关键的超参数,直接与要解决的问题类型相关,就像深度学习神经网络一样。

该实现允许通过 objective 超参数指定目标函数,并使用适用于大多数情况的合理默认值。

然而,对于在训练 XGBoost 模型时使用什么损失函数,初学者仍然存在一些困惑。

在开始之前,让我们进行配置

XGBoost 可以作为独立库安装,并且可以使用 scikit-learn API 开发 XGBoost 模型。

安装 XGBoost 库(如果尚未安装)。这可以在大多数平台上使用 pip python 包管理器来实现。

pip install xgboost

然后,您可以确认 XGBoost 库已正确安装并且可以通过运行以下脚本来使用。

import xgboostprint(xgboost.__version__)

运行该脚本将打印您已安装的 XGBoost 库的版本。

1.1.1

您可能在使用最新版本的库时遇到问题。不是你的的问题,因为有时库的最新版本会提出额外的要求,或者可能不太稳定。

如果您在尝试运行上述脚本时确实遇到错误,我建议您降级到 1.0.1(或更低版本)。这可以通过指定要安装到 pip 命令的版本来实现,如下所示:

pip install xgboost==1.0.1

如果您看到警告消息,现在可以放心地忽略它。例如,以下是您可能会看到并可以忽略的警告消息示例:

FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.

如果您需要针对您的开发环境的特定说明,请参阅教程:

XGBoost 安装指南

XGBoost 库有自己的自定义 API,尽管我们将通过 scikit-learn 包装类使用该方法:XGBRegressorXGBClassifier 。这将使我们能够使用 scikit-learn 机器学习库中的全套工具来准备数据和评估模型。

两个模型以相同的方式运行,并采用相同的参数来影响决策树的创建和添加到集成的方式。

分类的 XGBoost 损失函数

分类任务涉及在给定输入样本的情况下预测每个可能类别的标签或概率。

xgboost实例分析(xgboost实例推导)(2)

具有互斥标签的分类任务有两种主要类型:具有两个类标签的二元分类和具有两个以上类标签的多类分类。

  • 二元分类:具有两个类标签的分类任务。
  • 多类分类:具有两个以上类标签的分类任务。

有关不同类型分类任务的更多信息,请参阅教程:

机器学习中的 4 种分类任务,分别是:二元分类、多类分类、多标签分类、不平衡分类。

XGBoost 为这些问题类型中的每一种都提供了损失函数。

在机器学习中,典型的做法是训练模型来预测概率任务的类成员概率,以及任务是否需要清晰的类标签来对预测的概率进行后处理(例如使用argmax)。

这种方法在训练深度学习神经网络进行分类时使用,在使用 XGBoost 进行分类时也推荐使用。

用于预测二元分类问题概率的损失函数是 binary:logistic ,用于预测多类问题类别概率的损失函数是 multi:softprob

  • binary:logistic :用于二进制分类的 XGBoost 损失函数。
  • multi:softprob :用于多类分类的 XGBoost 损失函数。

在配置 XGBClassifier 模型时,可以通过“ objective ”超参数指定这些字符串值。

对于二元分类

# 二元分类模型model = XGBClassifier(objective='binary:logistic')

对于多类分类

# 多元分类模型model = XGBClassifier(objective='multi:softprob')

重要的是,如果您不指定 objective 超参数,XGBClassifier 将根据训练期间提供的数据自动选择这些损失函数之一。

我们可以通过一个有效的例子来具体说明这一点。

下面的示例创建一个合成二元分类数据集,使用默认超参数在数据集上拟合 XGBClassifier ,然后打印模型目标配置。

from sklearn.datasets import make_classificationfrom 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)

运行示例在数据集上拟合模型并打印损失函数配置。

我们可以看到模型自动选择一个损失函数进行二元分类。

binary:logistic

或者,我们可以指定目标并拟合模型,确认使用了损失函数。

from sklearn.datasets import make_classificationfrom 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)

运行示例在数据集上拟合模型并打印损失函数配置。

我们可以看到用于指定二元分类损失函数的模型。

binary:logistic

让我们在具有两个以上类的数据集上重复此示例。在这种情况下,三个类别。

下面列出了完整的示例。

from sklearn.datasets import make_classificationfrom 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)

运行示例在数据集上拟合模型并打印损失函数配置。

我们可以看到模型自动为多类分类选择了一个损失函数。

multi:softprob

或者,我们可以手动指定损失函数并确认它用于训练模型。

from sklearn.datasets import make_classificationfrom 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)

运行示例在数据集上拟合模型并打印损失函数配置。

我们可以看到用于为多类分类指定损失函数的模型。

multi:softprob

最后,还有其他损失函数可用于分类,包括:用于二元分类的 binary:logitrawbinary:hinge以及用于多类分类的 multi:softmax

您可以在此处查看完整列表:

Learning Task Parameters: objective

回归的 XGBoost 损失函数

回归是指在给定输入样本的情况下预测数值的预测建模问题。

xgboost实例分析(xgboost实例推导)(3)

虽然预测概率听起来像一个回归问题(即概率是一个数值),但它通常不被视为回归类型的预测建模问题。

预测数值时使用的 XGBoost 目标函数是 reg:squarederror 损失函数。

  • reg:squarederror :回归预测建模问题的损失函数。

在配置XGBRegressor模型时,可以通过“ objective ”超参数指定此字符串值。

例如:

model = XGBRegressor(objective='reg:squarederror')

重要的是,如果你没有指定 objective 超参数,XGBRegressor 会自动为你选择这个目标函数。

我们可以通过一个有效的例子来具体说明这一点。

下面的示例创建一个合成回归数据集,在数据集上拟合XGBRegressor,然后打印模型目标配置。

from sklearn.datasets import make_regressionfrom 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)

运行示例在数据集上拟合模型并打印损失函数配置。

我们可以看到模型自动选择一个损失函数进行回归。

reg:squarederror

或者,我们可以指定目标并拟合模型,确认使用了损失函数。

from sklearn.datasets import make_regressionfrom 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)

运行示例在数据集上拟合模型并打印损失函数配置。

我们可以看到模型使用指定的损失函数进行回归。

reg:squarederror

最后,还有其他损失函数可用于回归,包括:reg:squaredlogerrorreg:logisticreg:pseudohubererrorreg:gammareg:tweedie