使用 Python 中的 XGBoost 进行分类

2025 年 6 月 13 日 | 阅读 8 分钟

使用 XGBoost (eXtreme Gradient Boosting) 非常简单,可以轻松完成分类、回归和排序等监督任务。该框架依赖于梯度提升,这有助于解释为什么该模型被认为可靠且一致。

由于其可扩展性设计,XGBoost 能够很好地处理大量数据,并且可以无缝集成到知名Python 机器学习框架中。

为什么使用 XGBoost?

XGBoost 因其强大的特性和高效的性能而被选用于分类任务。主要优势包括:

高性能

XGBoost 既快速又高效,能够处理大型数据集和需要实时机器学习的任务。

内置正则化

该方法包含 L1 (Lasso) 和 L2 (Ridge) 正则化,有助于使模型在新数据上更好地泛化。

无需手动即可处理缺失信息

XGBoost 在训练期间会自动进行数据插补,无需复杂的预处理。

XGBoost 如何工作?

1. 初始预测

最初,XGBoost 使用简单的初始预测,例如回归目标值的平均值或分类的均匀概率。

2. 误差计算

最后,模型计算残差(实际值-预测值)。这些残差表明初始预测未能达到的情况。

3. 第一个树的构建

我们构建一个决策树来学习这些残差。该树的目的是通过最小化这些残差的最佳特征分割来改进预测误差。

4. 误差修正树

与之前的树不同,XGBoost 顺序插入额外的树。对于每棵新树,我们对其进行训练,以预测到目前为止的树的组合预测的残差(误差)。然后它会逐渐提高整体准确性。

5. 损失函数优化

在每一步,XGBoost 都在最小化一个定义的损失函数,该函数在某种程度上量化了我们的预测与实际值之间的差距。这意味着我们可以逐棵地向模型添加树,并且知道它将随着每一棵连续的树而不断改进。

6. 停止条件

训练将继续进行,直到达到停止条件之一,即达到了最大树数量限制、发现损失函数改进最小,或者达到了所需的准确度。

XGBoost 中的分类

使用 XGBoost 进行分类是一种常见做法。该任务是使用输入信息识别记录所属的类别。XGBoost 提供了 XGBClassifier 类,专为高效处理分类任务而设计。

XGBClassifier 的语法

XGBClassifier 类中的许多超参数都可以进行修改以提高其性能。

让我们看看创建 XGBoost 分类器的基本代码:

语法说明

objective='multi:softprob'

在对多个类别进行分类时,您可以(可选地)设置目标函数。它为要检查的每个案例提供每个类别的概率。默认情况下,目标设置为“binary:logistic”,因为它非常适合二元分类问题。

num_class=num_classes

(多类问题需要) 显示目标变量有多少个不同的类别。在执行多类分类时需要设置此参数。

max_depth=max_depth

(可选) 决定每棵决策树的最大深度。如果我们增加此值,模型可以学习更复杂的模式,但也可能导致数据过拟合。

learning_rate=learning_rate

一个可选选项,用于调整每次提升迭代中权重的变化。较小的值可以降低过拟合的风险,但需要更多的树才能达到相同的结果。

subsample=subsample

您可以(可选地)指定用于构建每棵树的训练数据比例。它有助于避免模型意外地包含随机影响而对所有数据进行建模。

colsample_bytree=colsample

(可选) 指定用于构建每棵树的列的数量,通过随机选择它们。它还有助于防止过拟合。

n_estimators=num_estimators

这是必需的步骤,您在此处选择提升周期数。它决定了模型学习的难易程度(或难易程度)以及其训练过程可能需要多长时间。

XGBoost 是如何做到如此“eXtreme”的?

XGBoost 通过将正则化项直接添加到目标函数中来改进传统的梯度提升。通过此修改,模型不易过拟合,并且比以前的梯度提升版本具有更好的性能和更高的准确性。

防止过拟合

XGBoost 中有许多自动方法可以降低过拟合的几率。模型工作方式的一个主要方面是学习率,它决定了每棵预测树对最终结果的贡献程度。使用较小的学习率,模型就不那么激进,对噪声的抵抗力也更强。L1 和 L2 正则化器在学习过程中被添加,以防止模型过拟合。

XGBoost 通过从一个级别扩展到下一个级别来构建树,而不是深入到树的底部。每次,它都会分析各种分割,并仅保留那些能提高目标值的分割。修剪不需要的分支可以使树更简单、更快,并适用于更广泛的结果。

树结构

其他决策树以深度优先的顺序构建,或直到达到终止规则,而 XGBoost 则逐级创建每棵新树。在所有级别,它都会考虑所有方面并测试所有选项,以选择导致最小目标函数的分割。

由于逐级增长,XGBoost 可以有效地处理复杂特征交互。它确保一个特征仅被分割几次,因此重要特征会在树构建过程的早期被使用。

管理缺失信息

该算法在学习过程中能够处理缺失数据。Missy 使用一种算法,该算法在分割评估期间将缺失数据与其他数据分开。每次在树构建过程中发生分割时,都会为具有缺失值的样本分配一个基于信息的默认方向。

因此,当只提供部分输入信息时,模型也不会崩溃。在预测时缺少任何特征值时,模型会通过使用它在训练时被配置为默认使用的分支来进行预测。

缓存感知访问

为了在训练时更快地工作,XGBoost 使用缓存优化策略。由于 XGBoost 缓存的内存比主内存快得多,因此该算法会设计数据布局,以将 CPU 需要的数据分组在一起。

XGBoost 通过组织数据以便计算机可以轻松地从内存中访问它来节省时间。硬件级别的有效操作在处理内存成为主要问题的超大型数据集时最为有价值。

贪婪近似算法

当数据量非常大时,在每个节点上检查所有选项会消耗大量时间和精力。作为此问题的解决方案,XGBoost 使用了贪婪近似算法。它不比较所有可能的分割,而是查看加权分位数来找到分割数据的最佳位置。

通过这种方法,所需的计算量大大减少,并且结果仍然非常准确。XGBoost 高效地处理大型数据集并保持快速,因此它成为实际机器学习工作的首选。

XGBoost 的优点

高准确性

得益于其对多个决策树的使用,XGBoost 可以获得比单个模型更好的结果。由于提升可以减少偏差和方差,因此通常有助于模型在预测任务中取得更好的结果。

可扩展性

XGBoost 在处理数据时兼具速度和效率。使用并行和分布式技术使其易于与大型数据集一起使用,并提高了其可扩展性。

灵活性

它可以处理许多机器学习任务,例如回归、各种分类和排序。

特征重要性信息

尽管它比基本方法更复杂,XGBoost 仍然提供特征重要性分数。它们在找出数据中最重要的数据方面发挥作用,从而使模型能够被解释和决策。

XGBoost 的缺点

模型复杂度

如果您想理解和设置模型,XGBoost 可能比使用线性模型或基本决策树更难。为了使系统正常工作,需要具有许多超参数的正确值。

过拟合风险

尽管 XGBoost 旨在防止过拟合,但当模型过深或训练时间过长时,仍然可能发生过拟合。验证和调优非常重要。

应用程序占用大量内存。

XGBoost 使用树结构,在处理大型或复杂数据进行建模时可能占用大量内存。

对某些类型的数据效果不佳

对于维度很高或信息很少的数据集,它可能不如其他更集中的数据类型效果好。

Code Example

我们有鸢尾花(Iris)数据集,这是一个经典的机器学习数据集,包含 150 个鸢尾花样本。每个样本的四个特征是萼片长度、萼片宽度、花瓣长度和花瓣宽度。将样本分为三个物种之一:setosa、versicolor 或 virginica。

接下来,您将看到如何使用 XGBoost 库对同一个数据集进行分类。

说明

此代码将向您展示我们如何使用 XGBoost 分类器对鸢尾花物种进行分类。首先,它导入 xgboost 模块,并从 sklearn 加载数据函数以及分割和评估性能函数。加载 Iris 数据集,并从中提取特征 X 和标签 y。通过将 20% 的数据用于测试目的来形成训练集和测试集。

使用默认参数初始化 XGBClassifier,并在训练数据上进行训练。我们训练模型,对测试集进行预测,并计算模型准确性。最后,使用每个类别的 F1 分数、精确率、召回率和支持度及其花名打印分类报告。

结果表明,该模型在预测方面具有 100% 的准确性,并且正确处理了所有测试样本。此外,每个类别的准确率、召回率和 F1 分数均为 1.00,这表明模型在预测方面没有任何错误。通过这些完美的得分,我们可以看到 XGBoost 分类器在鸢尾花数据集上的表现非常出色,正确地识别了每个类别。

结论

总而言之,XGBoost 是一个非常优秀的机器学习库,尤其适用于分类。然而,由于其强大的性能和内置的正则化技术,它非常适合大量的应用。使用 XGBoost,我们在预测鸢尾花物种方面获得了完美的准确性。模型的精确度和库产生可靠结果的能力表明了其在解决现实世界分类问题方面的巨大潜力。