XGBoost 原理
1. XGBoost 原理¶
XGBoost 是对梯度提升算法的改进:
- 求解损失函数极值时使用泰勒二阶展开
- 另外在损失函数中加入了正则化项
- XGB 自创一个树节点分裂指标。这个分裂指标就是从损失函数推导出来的。XGB 分裂树时考虑到了树的复杂度。
我们在前面已经知道,构建最优模型的一般方法是 最小化训练数据的损失函数 。
预测值和真实值经过某个函数计算出损失,并求解所有样本的平均损失,并且使得损失最小。
上面的式子称为 经验风险最小化 ,如果仅仅追求经验风险最小化,那么训练得到的模型复杂度较高,很容易出现过拟合。因此,为了降低模型的复杂度,常采用下式:
上面的式子称为**结构风险最小化**,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测 。
XGBoost的决策树生成是结构风险最小化的结果。
1.1 目标函数确定和树的复杂度介绍¶
XGBoost(Extreme Gradient Boosting)是对梯度提升树的改进,并且在损失函数中加入了正则化项。
目标函数的第一项表示整个强学习器的损失,第二部分表示强学习器中 K 个弱学习器的复杂度。
xgboost 每一个弱学习器的复杂度主要从两个方面来考量:
- γT 中的 T 表示一棵树的叶子结点数量,γ 是对该项的调节系数
- λ||w||2 中的 w 表示叶子结点输出值组成的向量,λ 是对该项的调节系数
1.2 XGBoost目标函数的推导¶
上公式中,第一部分是从强学习器的角度去衡量,第二项也是衡量整个强学习器的复杂·程度。
1.3 泰勒公式展开¶
我们直接对目标函数求解比较困难,通过泰勒展开将目标函数换一种近似的表示方式。接下来对 yi(t-1) 进行泰勒二阶展开,得到如下近似表示的公式:
其中,gi 和 hi 的分别为损失函数的一阶导、二阶导:
1.4 化简目标函数¶
我们观察目标函数,发现以下两项都是常数项,我们可以将其去掉。
为什么说是常数项呢?这是因为当前学习器之前的学习器都已经训练完了,可以直接通过样本得出结果。化简之后的结果为:
我们再将 Ω(ft) 展开,结果如下:
这个公式中只有 ft ,该公式可以理解为,当前这棵树如何构建能够降低损失。
1.5 问题再次转换¶
我们再次理解下这个公式表示的含义:
- gi 表示每个样本的一阶导,hi 表示每个样本的二阶导
- ft(xi) 表示样本的预测值
- T 表示叶子结点的数目
- ||w||2 由叶子结点值组成向量的模
现在,我们发现公式的各个部分考虑的角度不同,有的从样本角度来看,例如:ft(xi) ,有的从叶子结点的角度来看,例如:T、||w||2。我们下面就要将其转换为相同角度的问题,这样方便进一步合并项、化简公式。我们统一将其转换为从叶子角度的问题:
例如:10 个样本,落在 D 结点 3 个样本,落在 E 结点 2 个样本,落在 F 结点 2 个样本,落在 G 结点 3 个样本
D 结点计算: w1 * gi1 + w1 * gi2 + w1 * gi3 = (gi1 + gi2 + gi3) * w1
E 结点计算: w2 * gi4 + w2 * gi5 = (gi4 + gi5) * w2
F 结点计算: w3 * gi6 + w3 * gi6 = (gi6 + gi7) * w3
- G 节点计算:w4 * gi8 + w4 * gi9 + w4 * gi10 = (gi8 + gi9 + gi10) * w4
gi ft(xi) 表示样本的预测值,我们将其转换为如下形式:
- wj 表示第 j 个叶子结点的值
- gi 表示每个样本的一阶导
hift2(xi) 转换从叶子结点的问题,如下:
λ||w||2 由于本身就是从叶子角度来看,我们将其转换一种表示形式:
我们重新梳理下整理后的公式,如下:
上面的公式太复杂了,我们令:
Gi 表示样本的一阶导之和,Hi 表示样本的二阶导之和,当确定损失函数时,就可以通过计算得到结果。
现在我们的公式变为:
1.6 对叶子结点求导¶
此时,公式可以看作是关于叶子结点 w 的一元二次函数,我们可以对 w 求导并令其等于 0,可得到 w 的最优值,将其代入到公式中,即可再次化简上面的公式。
将 wj 代入到公式中,即可得到:
1.7 XGBoost的回归树构建方法¶
该公式也叫做打分函数 (scoring function),它可以从树的损失函数、树的复杂度两个角度来衡量一棵树的优劣。
这个公式,我们怎么用呢?
当我们构建树时,可以用来选择树的最佳划分点。
其过程如下:
- 对树中的每个叶子结点尝试进行分裂
- 计算分裂前 - 分裂后的分数:
- 如果分数 > 0,则分裂之后分树的结构损失更小,我们会考虑此次分裂
- 如果分数 < 0,说明分裂后的分数比分裂前的分数大,此时不建议分裂
- 当触发以下条件时停止分裂:
- 达到最大深度
- 叶子结点样本数量低于某个阈值
- 等等...
2. XGBoost API¶
2.1 通用参数¶
booster [缺省值=gbtree]
- gbtree:使用树模型
- gblinear:使用线性模型
- dart:使用树模型,主要多了 Dropout
silent [缺省值=0]
- 设置为 0 打印运行信息
- 设置为 1不打印运行信息
nthread [缺省值=设置为最大可能的线程数]
- 并行运行的线程数,输入的参数应该 <= 系统的CPU核心数
- 若是没有设置算法会检测将其设置为 CPU 的全部核心数
下面的两个参数不需要设置,使用默认的就好了
num_pbuffer [xgboost自动设置,不需要用户设置]
- 预测结果缓存大小,通常设置为训练实例的个数。该缓存用于保存最后 boosting 操作的预测结果
num_feature [xgboost自动设置,不需要用户设置]
- 在boosting中使用特征的维度,设置为特征的最大维度
2.2 Booster 参数¶
2.2.1 Parameters for Tree Booster¶
eta [缺省值=0.3,别名:learning_rate]
- 更新中减少的步长来防止过拟合
- 每次 boosting 之后,可以直接获得新的特征权值,这样可以使得 boosting 更加鲁棒
- 范围: [0,1]
gamma [缺省值=0,别名: min_split_loss](分裂最小loss)
- gamma 指定了节点分裂所需的最小损失函数下降值
- 这个参数的值和损失函数息息相关,所以是需要调整的
- 范围: [0, ∞]
max_depth** [缺省值=6] - 这个值为树的最大深度。 这个值也是用来避免过拟合的 - max_depth越大,模型会学到更具体更局部的样本 - 设置为 0 代表没有限制 - 范围: [0 ,∞]
min_child_weight [缺省值=1]
- 当它的值较大时,可以避免模型学习到局部的特殊样本
- 如果这个值过高,会导致欠拟合
- 范围: [0,∞]
subsample [缺省值=1]
- 这个参数控制对于每棵树,随机采样的比例
- 如果这个值设置得过大,它可能会导致过拟合
- 如果这个值设置得过小,它可能会导致欠拟合
- 典型值:0.5-1,0.5 代表平均采样,防止过拟合
- 范围: (0,1]
colsample_bytree [缺省值=1]
- 控制每棵随机特征采样的比例
- 范围: (0,1],典型值:0.5-1
colsample_bylevel [缺省值=1]
- 用来控制树每一次分裂时对特征的采样的比例
- 范围: (0,1]
alpha [缺省值=0,别名: reg_alpha]
- 权重的L1正则化项。(和Lasso regression类似)。 可以应用在很高维度的情况下,使得算法的速度更快
scale_pos_weight[缺省值=1]
- 在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛
- 通常可以将其设置为负样本的数目与正样本数目的比值
2.2.2 Parameters for Linear Booster¶
linear booster一般很少用到。
lambda [缺省值=0,别称: reg_lambda]
- L2 正则化惩罚系数,增加该值会使得模型更加保守
alpha [缺省值=0,别称: reg_alpha]
- L1正则化惩罚系数,增加该值会使得模型更加保守。
lambda_bias [缺省值=0,别称: reg_lambda_bias]
- 偏置上的 L2 正则化(没有在L1上加偏置,因为并不重要)
2.3 学习目标参数¶
objective [缺省值=reg:linear]
- reg:linear:线性回归
- **reg:logistic:**逻辑回归
- binary:logistic:二分类逻辑回归,输出为概率
- multi:softmax:使用softmax的多分类器,返回预测的类别(不是概率)。在这种情况下,你还需要多设一个参数:num_class(类别数目)
- multi:softprob:和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。
eval_metric [缺省值=通过目标函数选择] 验证集
可供选择的如下所示:
- rmse: 均方根误差
- mae: 平均绝对值误差
- logloss: 负对数似然函数值
- error:其值通过错误分类数目与全部分类数目比值得到。对于预测,预测值大于0.5被认为是正类,其它归为负类。
- error@t: 不同的划分阈值可以通过 ‘t’进行设置
- merror: 多分类错误率,计算公式为(wrong cases)/(all cases)
- mlogloss: 多分类log损失
- auc: 曲线下的面积
seed [缺省值=0]
- 随机数的种子,设置它可以复现随机数据的结果,也可以用于调整参数
XGBoost 原理相关推荐
- xgboost原理及应用
1.背景 关于xgboost的原理网络上的资源很少,大多数还停留在应用层面,本文通过学习陈天奇博士的PPT地址和xgboost导读和实战 地址,希望对xgboost原理进行深入理解. 2.xgboos ...
- XGBoost原理与实例分析
这几天一直在研究XGboost的基本原理与代码调参,其原理是在GBDT的基础上进行优化,但也有很多的不同之处:所以自己准备更新两篇博客分为XGBoost原理与实例和XGBoost实战与调参优化来巩固这 ...
- (二)提升树模型:Xgboost原理与实践
本篇博客是提升树模型博客的第二篇文章,第一篇介绍GBDT的博客可以参看这里.第三篇介绍Lightgbm博客可以参看这里. 本篇博客是基于kingsam_的博客整理而来,在此表示感谢.在这篇文章的基础上 ...
- xgboost原理分析以及实践
摘要 本文在写完GBDT的三篇文章后本来就想写的,但一直没有时间,终于刚好碰上需要,有空来写这篇关于xgboost原理以及一些实践的东西(这里实践不是指给出代码然后跑结果,而是我们来手动算一算整个xg ...
- XGBoost原理及目标函数推导详解
前言 XGBoost(eXtreme Gradient Boosting)全名叫极端梯度提升,XGBoost是集成学习方法的王牌,在Kaggle及工业界都有广泛的应用并取得了较好的成绩,本文较详细的介 ...
- XGBoost原理简介
一.简述 这里先简单介绍下RF(Random Forest).GBDT(Gradient Boosting Decision Tree)和XGBoost算法的原理. RF:从M个训练样本 ...
- XGBoost原理详解
XGBoost是boosting算法的其中一种.Boosting算法的思想是将许多弱分类器集成在一起形成一个强分类器.因为XGBoost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的 ...
- Xgboost原理介绍,通俗易懂
初看Xgboost,翻了多篇博客发现关于xgboost原理的描述实在难以忍受,缺乏逻辑性,写一篇供讨论. --以下是抛砖引玉. 观其大略,而后深入细节,一开始扎进公式反正我是觉得效率不高,还容易打消 ...
- xgboost 一般多少棵树_大白话人工智能算法-第32节集成学习之通俗理解XGBoost原理和过程...
本节讲解XGBoost的原理~ 目录 1.回顾: 1.1 有监督学习中的相关概念 1.2 回归树概念 1.3 树的优点 2.怎么训练模型: 2.1 案例引入 2.2 XGBoost目标函数求解 3.X ...
最新文章
- [九度][何海涛] 乐透之猜数游戏
- JavaScript实现使用 BACKTRACKING 方法查找集合的幂集算法
- CSS清浮动处理(Clear与BFC)
- 利用Date类计算生活时间
- mysql数据库中_截取数据_mysql数据库的字符串截取方法
- PHP导航猫网址导航系统源码V2.4.5
- python 解释器下载_PyPy Python
- Zookeeper可以干什么
- gamma矫正/gamma映射
- HashMap 扩容 加载因子
- 1. 微信开发-自动回复
- Date日期操作-年月日,时分秒获取
- C3P0的三种配置方式以及基本配置项详解
- 8.python之面相对象part.6(python面向对象之封装的概念)
- 【进阶5-1期】重新认识构造函数、原型和原型链
- csv文件操作、excel读写操作
- Android使用Glide加载Gif慢 获取gif时间
- 有限责任公司的概念与特征
- 国内外SNS比较分析
- 呆萌助手最新版源代码_全网首发开源
热门文章
- 近期美国监管机构密集出手 将如何影响加密市场?
- element ui dataTimePiker日期时间选择器控制选择范围及时间转换总结
- 7个方法,教你写出“有质感”的文案?
- 汇佳学校|肖紫兮:花滑冠军+学科全优,背后有何秘诀?
- 篇6:linux下GCC编译生成的可执行程序的步骤详解
- python中float到意义_float可以在Python中使用的值范围是多少?
- GRASP优化算法原理梳理和应用细节
- 2022-11 CSS:flex布局父子宽度问题-小程序scrollView-div横向滚动字体超出隐藏-居中
- python获得emf矢量图
- 遥望布达拉——DAY18 然乌-波密县龙亚村