CatBoost 与 XGBoost2025年6月17日 | 阅读13分钟 对于结构化数据问题的机器学习,有两种非常流行的梯度提升算法:CatBoost和XGBoost。它们在本质上是不同的,尽管它们的目标都是在提高准确性的同时获得相应的计算速度提升。 XGBoost 是一个用了好几年的机器学习主力军。它在内存处理方面的能力使其非常强大,再加上强大的并行处理能力和控制过拟合的L1和L2正则化。XGBoost非常灵活,它对变量的特征抽样、学习率和树的深度有很高的控制度。它本身不支持分类变量,因此需要进行一些修改,例如进行独热编码,这意味着对分类数据的预处理必须非常谨慎。
因此,我们将通过精度、速度和易用性来探讨两种最流行的梯度提升方法,以获得更全面的理解。梯度提升决策树(GBDT)是最有意义的机器学习模型之一。如果我们知道如何快速实现和优化梯度提升树,我们就可以处理各种问题并进行快速迭代。本内核将说明每种梯度提升方法的实现,通过贝叶斯优化执行超参数搜索,并最终以一个我们希望能够带来一些清晰度的比较结束。 梯度提升决策树(GBDT)梯度提升决策树是分类和回归问题的标准,也是可能是最受欢迎的模型。GBDT源自AdaBoost,AdaBoost通过将弱学习器组合在一起并使用由每个学习器的准确性加权的多数投票来解决二元分类问题。在这种情况下,具有单次拆分的决策树(称为决策桩)是弱学习器。 梯度提升树成为一个统计框架,其中弱学习器的添加减少了模型的损失,而提升本质上是一个数值优化问题。随着提升树越来越受欢迎,如何将弱学习器添加到模型中、如何构建学习器以及使用哪种损失函数等问题也得到了扩展。由于有许多资源可以更详细地解释提升算法,我们将继续探索最受欢迎的两种梯度提升决策树:XGBoost和CatBoost。本内核的主要目的是实现这些技术,评估性能,并看看未来我们可能如何选择其中一种。 输出 ![]() ![]() 数据探索数据清理。数据集不需要太多清理,但有几件事很重要需要检查:缺失数据、跨特征的数据类型一致性、列中的异常值或不一致性,以及最后,观察特征之间的关系,因为它们以后可能会对特征工程有用。幸运的是,没有缺失数据,所以我们的重点将放在主要目标上:比较不同的梯度提升树算法。为了更好地理解数据,我们查看了哪些特征根据目标类别具有最分散的分布,检查了目标标签的不平衡性,观察了独立变量相对于目标标签的分布,并寻找与彼此之间具有强线性或单调关系的特征。这可以通过相关性热力图来更好地查看潜在的共线性特征。 输出 ![]() 输出 ![]() 输出 ![]() 输出 ![]() 我们数据中的第一个问题之一是目标标签的不对称性。“否”与“是”的客户流失率之比约为 6:1。虽然如果我们的类别分隔得更好,这会是个小问题,但在配对图中,不平衡的影响最为明显,其中“是”标记在散点图中几乎被淹没了。当我们开始测试我们的模型时,查看混淆矩阵并了解我们的模型在少数类别中的表现将是审慎的。如果我们难以对“是”类别进行分类,我们可以使用SMOTE等技术来对其进行过采样。或者,我想使用Tomek Links来对多数类别进行欠采样,并希望能为我们的散点图提供一个更清晰的边界。 我们在配对图中包含了来自箱线图的各种变量。在配对图中绘制这些变量中最有趣的变量是那些属性,因为它们在箱线图中显示了我们目标标签之间最大的分布差异。幸运的是,这些数据有很多特征,这对我们的决策树来说是好事,尽管从对角线分布来看,似乎没有任何特征在我们类别之间有非常不同的分布。最后,为了识别共线性关系,我们绘制了特征之间的相关性。这些通常是 GBDT 的一个问题,但如果我们有很多高度相关的特征,我们可以尝试进行特征工程或只保留一个。 超参数调优Hyperopt 是一个用于超参数贝叶斯优化的 Python 库。与网格搜索和随机搜索等经典方法相比,它具有一些优势:首先,它具有更好的整体性能,并且找到最优超参数所需的时间更少;其次,它的 API 更灵活,因此更容易与各种机器学习模型集成,与 sklearn 的 gridsearch 相比,这可能使其在实践中更加普遍。 Hyperopt 将超参数调优视为一个优化问题。它使用目标函数 fit_model(parameters) 返回的损失来决定下一组要尝试的超参数。由于超参数搜索可能涉及大而高维的空间,因此 Hyperopt 中的贝叶斯优化比网格搜索和随机搜索有了显著改进,尤其是在广阔的搜索空间中。 Hyperopt 的组成部分Hyperopt 由几个关键组件构建而成
凭借其灵活高效的设计,Hyperopt 简化了超参数调优,因此已成为任何机器学习工作流程的重要工具。 XGBoost最流行的基于梯度的提升决策树方法之一称为 XGBoost。它于 2014 年首次发布,其出现对 Kaggle 和数据科学界产生了巨大影响。XGB 引入的梯度提升是通过拟合先前模型残差的新模型来完成的,同时使用梯度下降算法优化损失来累加所有这些模型。 XGBoost 参数有三种类型:学习任务参数、树提升参数和通用参数。我们将花费大部分时间在树提升参数上,因为通用参数和学习参数主要由我们建模的模型决定。让我们回顾一下 GBDT 算法的常见参数,以便更好地理解数据科学家可以用来适应模型中出现的问题的各种控制。 通用选项
树提升参数
输出 ![]() CatBoost尽管Catboost将有序提升算法作为梯度提升算法的改进版本提出,但它以创新的方式处理分类数据。将分类数据编码为数值会带来许多困难,因为一个分类特征如果具有 n 个类别的类别列,则需要 n 个虚拟变量列,这些列将被划分为 n 列独热编码的特征,这可能会导致我们的特征集爆炸。一种称为目标均值编码的技术是将我们的类别值设置为该类别目标变量的平均值。Catboost 使用一种目标编码的变体,它使用可用历史记录来确定目标编码,然后对我们的分类数据进行编码和处理的随机排列。由于实时模型无法知道其目标的真实平均值,Catboost 使用它可用的内容而不是平均值。当然,由于我们拥有所有数据,我们可以在训练时计算平均值。这会导致目标泄露,使我们模型的训练精度高于其生产精度。 Catboost 的其他功能包括绘制特征交互和对象(行)重要性。 CatBoost 参数CatBoost 参数有别名,因此检查不同来源的一致性很重要。这些参数分为八类,但对于优化,通常只强调其中一部分。
关键超参数
输出 ![]() 结果输出 ![]() 没有明确的赢家。似乎每种梯度提升算法在不同方面都表现得非常出色。XGBoost 凭借其出色的文档和多年的使用经验,仍然是一项出色的技术。我们有信心 XGB 没有过度拟合我们的训练集,因为它在训练集和测试集分数之间始终保持相对较小的差异,并显示出良好的准确性。我们特别有兴趣使用 CatBoost,因为它在处理分类数据方面具有所谓的进步。 CatBoost 的速度似乎比其他算法慢得多,并且在几项测试中停滞不前,但当我们从 50 减少 early_stopping_rounds 到 30 时,这种情况得到了缓解。我们希望进一步测试 CatBoost 和具有大量类别变量的数据,以便更好地了解它何时可能效果最佳。 下一主题机器学习的类型 |
我们请求您订阅我们的新闻通讯以获取最新更新。