XGBoost原理、推导、模型参数总结

日期: 2025-03-01 03:04:46 |浏览: 96|编号: 76925

友情提醒:信息内容由网友发布,本站并不对内容真实性负责,请自鉴内容真实性。

XGBoost原理、推导、模型参数总结

是一种集大成的机器学习算法,可用于回归,分类和排序等各种问题,在机器学习大赛及工业领域被广泛应用。成功案例包括:网页文本分类、顾客行为预测、情感挖掘、广告点击率预测、恶意软件分类、物品分类、风险评估、大规模在线课程退学率预测。

是初学者最值得深度理解的模型之一,它将决策树、、GBDT 等知识点串联起来,强烈建议大家都手撸一波。本文我将从渊源及优点、模型原理及优化推导、模型参数解析、调参实例,可视化等方面介绍。

渊源及优势

在数据建模中,经常采用方法,该方法将成百上千个分类准确率较低的树模型组合起来,成为一个准确率很高的预测模型。这个模型会不断地迭代,每次迭代就生成一颗新的树。但在数据集较复杂的时候,可能需要几千次迭代运算,这将造成巨大的计算瓶颈。

针对这个问题,华盛顿大学的陈天奇博士开发的( )基于C++通过多线程实现了回归树的并行构建,并在原有 算法基础上加以改进,从而极大地提升了模型训练速度和预测精度。

主要优势如下:

1、GBDT在优化时只用到一阶导数信息,同时用到了一阶和二阶导数,还支持自定义损失函数,前提是损失函数可一阶和二阶求导;

2、加入了正则项,用于控制模型的复杂度,防止过拟合;

3、借鉴了随机森林的做法,支持列抽样(随机选择特征),不仅能降低过拟合,还能减少计算;

4、寻找最佳分割点时,实现了一种近似法,还考虑了稀疏数据集、缺失值的处理,大大提升算法的效率;

5、支持并行;

6、近似直方图算法,用于高效地生成候选的分割点;

7、在算法实现时做了很多优化,大大提升了算法的效率,内存空间不够时,利用了分块、预取、压缩、多线程协作的思想。

模型原理及优化推导

其实也是GBDT的一种,还是加性模型和前向优化算法。

加法模型就是说强分类器由一系列弱分类器线性相加而成。一般组合形式如下:

其中,就是一个个的弱分类器,是弱分类器学习到的最优参数,就是弱学习在强分类器中所占比重,P是所有和的组合。这些弱分类器线性相加组成强分类器。

前向分步就是说在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。也就是可以写成这样的形式:

的模型是什么样子的呢?

与决策树不同的是,每棵回归树包含了在每个叶子上的一个连续分值,我们使用来表示第i个叶子上的分值。对于一个给定样本实例,我们会使用树上的决策规则(由q给定)来将它分类到叶子上,并通过将相应叶子上的分值(由w给定)做求和,计算最终的预测值。

的学习

为了在该模型中学到这些函数集合,我们会对下面的正则化目标函数做最小化:

其中: 是损失函数,常见的有 2 种:

平方损失函数:

逻辑回归损失函数:

: 正则化项,用于惩罚复杂模型,避免模型过分拟合训练数据。常用的正则有L1正则与L2正则:

L1正则(lasso):

L2正则:

下一步就是对目标函数进行学习,每一次保留原来的模型不变,加入一个新的函数到我们的模型中。

其中,为第i个实例在第t次迭代时的预测,我们需要添加树 ,然后最小化下面的目标函数:

假设损失函数使用的是平方损失 ,则上式进一步写为:

现在,我们采用泰勒展开来定义一个近似的目标函数:

其中:

分别是loss 上的一阶梯度和二阶梯度。

忘记基础知识的同学顺便重温一下泰勒公式吧

泰勒公式(’s )是一个用函数在某点的信息描述其附近取值的公式。其初衷是用多项式来近似表示函数在某点周围的情况。

函数在处的基本形式如下

还有另外一种常见的写法,,将在处进行泰勒展开,得:

现在,我们去掉常量,然后重新认识一下我们新的目标函数:

定义是叶子 j 的实例集合。将正则项带入,展开目标函数:

看起来有点复杂,令:,,上式简化为:

上式中是相互独立的,是平方项。对于一个确定的结构,我们可以计算最优的权重:

将带入上式,计算得到的loss最优解:

可以作为一个得分函数( )来衡量一棵树结构的质量。

我们有了一个方法来衡量一棵树有多好,现在来看优化的第二个问题:如何选择哪个特征和特征值进行分裂,使最终我们的损失函数最小?

特征选择和切分点选择指标定义为:

具体如何分裂?

每一步选能使分裂后增益最大的分裂点进行分裂。而分裂点的选取之前是枚举所有分割点,这称为完全贪婪算法(exact ),在所有特征上,枚举所有可能的划分。

当数据量十分庞大时,Exact 算法就会很慢,因此引入了近似的算法,和Exact 很类似,这里就不再展开讲了。

原理推导(精简版)

下面是原理推导的精简版,方便同学们复习使用。

@模型参数解析

的实现有原生版本,同时也有-learn版本,两者在使用上有一些微差异,这里给出. 参数解释。使用key-value字典的方式存储参数:

#部分重要参数
params = {
    'booster''gbtree',
    'objective''multi:softmax',  # 多分类的问题
    'num_class': 10,               # 类别数,与 multisoftmax 并用
    'gamma': 0.1,                  # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。
    'max_depth': 12,               # 构建树的深度,越大越容易过拟合
    'lambda': 2,                   # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
    'subsample': 0.7,              # 随机采样训练样本
    'colsample_bytree': 0.7,       # 生成树时进行的列采样
    'min_child_weight': 3,
    'silent': 1,                   # 设置成1则没有运行信息输出,最好是设置为0.
    'eta': 0.007,                  # 如同学习率
    'seed': 1000,
    'nthread': 4,                  # cpu 线程数
}

完整参数解析

篇幅原因,调参实例及可视化且听下回分解。

如有收获,还请不吝给个在看、收藏、转发

参考


我是东哥,最近正在原创「pandas100个骚操作」系列话题,欢迎订阅。订阅后,文章更新可第一时间推送至订阅号,每篇都不错过。

最后给大家分享《100本Python电子书》,包括Python编程技巧、数据分析、爬虫、Web开发、机器学习、深度学习。

现在免费分享出来,有需要的读者可以下载学习,在下面的公众号GitHuboy里回复关键字Python,就行。

推荐阅读

牛逼至极!用这个神器看代码太舒服了

B站,起飞!

再见,百度搜索!

客户流失预测及营销方案(Python)

开大了,Python 最强编辑器详细使用指南!

卧槽,B 站上线斯坦福最新「机器学习系统」全集,假期学起来!

爱点赞的人,运气都不会太差

提醒:请联系我时一定说明是从旅游网上看到的!