万字总结XGBoost原理、核心参数以及调优思路(上篇)
在数据科学领域,XGBoost以其卓越的性能和灵活性,成为了众多机器学习算法中的佼佼者。作为一种梯度提升框架,XGBoost通过构建决策树的集合来最小化一个可微分的损失函数,广泛应用于分类、回归等任务。本文将万字总结XGBoost的深层原理、关键核心参数,以及实用的调优策略。从算法基础到模型部署,我们将深入探讨XGBoost的每一个环节,为读者提供全面的指导和深入的洞见。无论您是希望提升模型性能的数据科学家,还是对XGBoost感兴趣的学习者,本文都将是您理解和掌握这一强大工具的宝贵资源。让我们启程,深入探索XGBoost的奥秘。
文章目录
一、XGBoost的基础思想与实现
1 XGBoost VS GBDT
极限提升树XGBoost(Extreme Gradient Boosting,XGB,发音/æks-g-boost/)是基于梯度提升树GBDT全面升级的新一代提升算法,也是提升家族中最富盛名、最灵活、最被机器学习竞赛所青睐的算法。不同于其他算法,XGBoost是一个以提升树为核心的算法系统,它覆盖了至少3+建树流程、10+损失函数,可以实现各种类型的梯度提升树,灵活性无与伦比。同时,XGBoost天生被设计成支持巨量数据,因此可以自由接入GPU/分布式/数据库等系统、还创新了众多工程上对传统提升算法进行加速的新方法。可以说,XGBoost是21世纪中Boosting算法的又一个里程碑,它开创了后GBDT时代中Boosting算法的新辉煌。
作为Boosting算法,XGBoost中自然包含Boosting三要素:
- 损失函数:用以衡量模型预测结果与真实结果的差异。
- 弱评估器 :(一般为)决策树,不同的boosting算法使用不同的建树过程。
- 综合集成结果:即集成算法具体如何输出集成结果
并且XGBoost同样遵循Boosting算法建模的基本流程
但相比GBDT,XGBoost不再准求损失函数的最小值,而是追求目标函数的最小值(这也是XGBoost与GBDT的最大区别)
欢迎关注我的公众号~XGBoost关键优化
2 XGBoost回归的sklearnAPI
XGBoost自带sklearn接口(sklearn API),通过这个接口,可以使用跟sklearn代码一样的方式来实现xgboost,即可以通过fit和predict等接口来执行训练预测过程,也可以调用属性比如coef_等。
其中XGBRF的两个类是以XGBoost方式建树、但以bagging方式构建森林的类,通常只有在我们使用普通随机森林效果不佳、但又不希望使用Boosting的时候使用。除非发现必须使用Bagging算法而普通sklearn运行出来的随机森林效果又不好,才考虑使用。XGBoost与GBDT一样,在多分类问题中计算效率较差,所以一般用于回归问题中。
欢迎关注我的公众号~XGBoost sklearnAPI建模
3 XGBoost回归的原生代码实现(相比SklearnAPI运行速度可能更快)
XGBoost的原生代码与sklearn代码有很大的不同。首先,原生代码必须使用XGBoost自定义的数据结构DMatrix,这一数据结构能够保证xgboost算法运行更快,并且能够自然迁移到GPU上运行(在GPU上运行列表、数组、Dataframe都会报错),类似于列表、数组、Dataframe等结构都不能用于原生代码,因此使用原生代码的第一步就是要更换数据结构。
当设置好数据结构后,一般需要以字典形式设置参数。XGBoost也可以接受像sklearn一样,将所有参数都写在训练所用的类当中,然而由于xgboost的参数列表过长、参数类型过多,直接将所有参数混写在训练模型的类中会显得代码冗长且混乱,因此往往会使用字典单独呈现参数。准备好参数列表后,使用xgboost中自带的方法xgb.train(不带有评估的能力,不像sklearn中可以输出score的评估指标)或xgb.cv(交叉验证会直接返回评估指标)进行训练,训练完毕后,可以使用predict方法对结果进行预测。虽然xgboost原生代码库所使用的数据结构是DMatrix,但在预测时输出的数据结构却是普通的数组,因此可以直接使用sklearn中的评估指标,或者python编写的评估指标对模型进行评估。
方法xgb.train和xgb.cv的第一个参数params就是需要使用字典自定义的参数列表,第二个参数dtrain就是DMatrix结构的训练数据,第三个参数num_boost_round其实就等同于sklearn中的n_estimators,表示总共建立多少棵提升树,也就是建模过程中的迭代次数。
欢迎关注我的公众号~XGBoost 原生API建模
4 XGBoost分类代码实现
XGBoost默认会实现回归算法,因此在执行分类的时候,需要主动声明算法的类型。xgboost是通过当前算法所使用的损失函数来判断任务类型的,即是通过在params中填写的objective参数来判断任务类型。当不再执行回归任务时,模型的评估指标也会发生变化,因此xgboost分类所需要的参数会更多。objective参数中可以输入数十种不同的选项,常见的有:
-
回归任务
- reg:squarederror:平方损失,即1/2(y-y‘)^2其中1/2是为了计算简便(默认值)
- reg:squaredlogerror:平方对数损失,即1/2[𝑙𝑜𝑔(𝑦+1)−𝑙𝑜𝑔(𝑦+1)]2,其中1/2是为了计算简便(含义和平方损失高度相近,只不过是把非常巨大的平方损失转换为数字比较小的对数平方损失,一般不会修改回归任务的默认损失函数,除非发现默认损失函数存在严重问题,如特别不稳定等等)
-
分类任务
-
binary:logistic:二分类交叉熵损失,使用该损失时predict接口输出概率。(只有一列,一般是类别1的概率)。
-
binary:logitraw:二分类交叉熵损失,使用该损失时predict接口输出执行sigmoid变化之前的值。
-
multi:softmax:多分类交叉熵损失,使用该损失时predict接口输出具体的类别。
-
multi:softprob:多分类交叉熵,适用该损失时predict接口输出每个样本每个类别下的概率。
注意:上述不同的损失函数会影响predict的输出,但却不会影响交叉验证方法xgb.cv的输出(只要是回归一律输出RMSE,只要是分类一律输出交叉熵损失,要改评估指标的话需要单独填写)。当不填写任何内容时,参数objective的默认值为reg:squarederror。
-
欢迎关注我的公众号~XGBoost 原生API分类问题建模
二、XGBoost的参数
1 迭代过程
欢迎关注我的公众号~XGBoost 迭代过程相关参数
2 XGBoost的弱评估器
欢迎关注我的公众号~XGBoost 弱评估器相关参数
3 dart树和提前停止
欢迎关注我的公众号~XGBoost dart树和提前停止相关参数