XGboost原理及实战
原理
1 xgb是什么
XGBoost 算法是boost 集成算法中的一种,Boosting 算法的思想是将许多弱分类器集成在一起形成一个强分类器。XGBoost 是一种提升树模型,是将许多树模型集成在一起,形成强分类器。XGBoost 中使用的弱分类器为CART (classification and regression tree)回归树。
xgboost并没有提出一种新的机器学习算法,而是基于现有的GBDT/lambdaMART等tree boosting算法在系统及算法层面(主要是系统层面)进行了改进;
- 系统层面改进点包括:
- 带权重的分位点分割算法(weighted quantile sketch)
- 稀疏特征的处理(sparsity-aware splitting)
- 缓存(cache-aware access)
- out-of-core computation
- 特征并行
- 基于rabit的分布式训练等
这些改进使得xgboost无论是在单机训练还是分布式训练上的耗时都比pGBRT/scikit-learn/spark MLLib/R gbm等有至少几倍的提升;
- 算法层面的改进主要包括:
1. L1/L2正则化
2. 目标函数二阶导的应用等;
1.1 CART 回归树
CART 回归树是一种二叉树,而可用于分类也可用于回归,其每一个节点只对是否进行判断,通过自上而下的分裂不断对样本集合的特征进行分裂。XGBoost 是通过不断添加CART ,不断使特征进行分裂完成CART 若分类器的集成。每一颗新的树的学习任务是去拟合原有树的拟合残差,使得生成的树的预测结果与真实值更加接近,可以认为XGBoost 的计算结果为多颗二叉树的计算结果加和。
1.2 应用
1.3 目标函数
可推导为:
2 xgb数学推导
2.1 回归树
每个样本根据节点值走到叶子节点。
节点集合与样本间测映射关系为Ij={i|q(xi)=j}
即q(Xi)=j。j表示第几个叶子节点
那就可以给Wq(xi)=Wj获取样本的值
所以,最终叶子结点的值的公式表达为:T(θjXi)=Wq(xi)
注意,不能表达结构,只能表达叶子节点的值
2.2 加法模型
由T个基学习器累加起来,基学习器即回归树
i是第i个样本,Xi是特征
这里的T是树的棵数
2.3 前向分步算法
加法模型和前向分步算法在adaboost里介绍了
采用前向分布法逐步优化每一个基学习器
前向分布算法是采用贪心策略,逐棵树逐棵树的优化
假设当前需要优化的是第t棵树,表达为
2.4 目标函数
定义好模型后,写目标函数。把问题转化为求目标函数最优解问题。求出基学习器里的参数。
将N个损失函数累加起来,再加上正则项Ω,Ω是树的复杂度
优化目标就是arg最小
前t-1棵树已经使定值,第t棵树需要确定的就是叶子节点的值W。
m是叶子节点的个数
2.5 正则项处理
Ω(ft)=γT+1/2λ∑j=1 Twj^2
T:叶子结点个数
γ,λ:超参数,可以控制惩罚的力度
∑j=1 Twj^2:叶子节点的值平方再求和
- 树越深就越容易出现过拟合,即节点数越多,所以要进行惩罚,惩罚的力度由γ控制
- 如果节点值w比较大的话,就代表这棵回归树再所有树的占比比较大。比如5棵回归树,80%的值由一棵树贡献,那过拟合的风险是比较高的。所以要进行惩罚,惩罚的力度由λ控制
- 那么优化目标就为
前t-1棵树的正则项是常数,在优化过程中没用,可以去掉
- 代入Ω(ft),得到
当前要优化的正则项部分,只跟当前优化的这棵树的w,T有关
2.6 损失函数的处理
回顾回归树的工作流程:
5个样本,2个特征,真实值y
数据进来后,每一个样本都会被划分到属于它自己的叶子节点,得到预测值
假定损失是平方误差损失
损失和L1+L2+…+L5
-
将求损失最小值转化为求每个叶子节点的损失的最小值
比如L节点1=L3+L5
求最小值,一元二次 -
因此,obj可以从按样本方式遍历转化为按照叶子节点方式遍历
和后面的正则项合并,得到
(这里写错了,中括号应该包括到最后) -
泰勒二阶展开:
损失函数没法提前给定,找到方法可以无视损失函数继续推导
泰勒二阶展开公式
-
做优化,去掉常量部分,用gi和hi表示损失函数的一阶梯度和二阶梯度:
代入obj,合并,得到
gi,hi是常量,样本拿到就可以算出来, -
目标函数就变为
-
最优wj与最优obj:
代入obj,得到最小值
- 所以,拿到样本,先计算gi,hi,再计算G,H。就可以算出每个叶子节点的值Wj,最小损失也可以计算出来。
<