xgboost小结
来源:互联网 发布:看摄像头监控软件 编辑:程序博客网 时间:2024/05/16 07:59
XGBoost源于boosting tree,全称“Extreme Gradient Boosting”。算法原理参考推荐XGBoost的slides和论文,尤其是slides,非常形象易懂,很精彩。本文是对XGBoost核心公式推导与关键点的思考总结。
核心公式推导
- 第
t 轮目标函数Obj(t)=∑i=1nl(yi,ŷ t−1i+ft(xi))+Ω(ft)+constant - 泰勒展开公式
f(x+Δx)⋍f(x)+f′(x)Δx+12f″(x)Δx2 - 目标函数的泰勒展开
gi=∂ŷ (t−1)l(yi,ŷ (t−1)) hi=∂2ŷ (t−1)l(yi,ŷ (t−1))
- 去掉常数项
Obj(t)⋍∑i=1n(gift(xi)+12hif2t(xi))+Ω(ft) - 定义树,
w 表示叶子得分,q 函数把样本分配到叶子结点ft(x)=wq(x),w∈RT,q:Rd→1,2,⋯,T - 正则项,定义树的复杂度。这里惩罚
wj 的原因?个人理解:正则项的目的是为了防止过拟合,增强模型的泛化能力。boosting tree的预测结果是众多子树预测累加得到的,对wj 限制是为了让每颗树都变得‘平庸’,假如某颗树某个叶子得分异常高,它会严重压缩其他树的空间,并对最终预测结果起重要影响,如果碰巧这颗树又不小心过拟合了,进而造成该类预测过拟合。Ω(ft)=γT+12λ∑j=1Tw2j 叶子结点的实例集合
Ij={i|q(i)=j} 化简至叶子单位
Obj(t)⋍∑i=1n(gift(xi)+12hif2t(xi))+Ω(ft)=∑i=1n(giwq(xi)+12hiw2q(xi))+γT+12λ∑j=1Tw2j=∑j=1T⎛⎝⎜⎜(∑i∈Ijgi)wj+12(∑i∈Ijhi+λ)w2j⎞⎠⎟⎟+γT
求导,获得最优解(二阶方程最优解
−b2a ,−b24a )w∗j=−Gjλ+Hj Obj(t)=−12∑j=1TG2jHj+λ 贪心求解,定义增益公式,获得最佳分裂点,分裂得到左叶子和右叶子
Gain=12(G2LHL+λ+G2RHR+λ−(GL+GR)2HL+HR+λ)−γ
总结
- Shrinkage and Column Subsampling
Shrinkage降低了单颗树的影响,为future trees留下了更多生长空间,进而提升模型(这个在gbdt里也是有的)
Column Subsampling,就是特征采样,这个在随机森林里用到。根据用户反馈,特征采样比样本采样更能防止过拟合。 - 处理缺失值
个人理解,其实就是不处理,设置了一个default direction,把缺失值丢到了这个方向里,在叶子计算得分时忽略这些缺失值。 - Column Block for Parallel Learning
就是以特征值为key,对样本进行了一次索引,并对特征值进行排序,存入内存中,称为‘block’。在树训练过程中,最耗时的是寻找最佳分裂结点,这个过程需要对数据排序,有了‘block’,这个过程的耗时就会大大减少,这是并行化的基础,可以看出xgboost是在特征粒度上实现并行的。 - 泰勒展开
传统GBDT在优化时用到一阶导数信息,利用梯度下降获得该轮残差,然后用回归树拟合残差
xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。推导出了回归树的最优解,XGBoost所使用的回归树与GBDT是不同的。 - 正则项
xgboost在代价函数里加入了正则项,用于控制模型的复杂度。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个重要特性 - 减枝
注意Gain 公式,该值是可能为负的,这时需要在simplicity和predictivness之间进行tradeoff。可进行预减枝和后剪枝。预减枝:遇到负值就停止生长,但是这次分裂(split)可能会有意义将来的splits。后减枝:先生长至最大深度,然后递归地减去所有增益为负的叶子
python实现
关键点是结点分裂增益与叶子结点权重计算,保持boosting和决策树框架,实现代码地址lxmly/machine-learning
阅读全文
1 0
- xgboost小结
- xgboost使用小结
- xgboost
- xgboost
- xgboost
- xgboost
- xgboost
- xgboost
- xgboost
- XGBoost
- xgboost
- xgboost
- xgboost
- XGBoost
- xgboost
- linux下python导入xgboost出现的问题小结
- XGBoost:大杀器xgboost指南
- xgboost.XGBClassifier, xgboost.train()
- Mybatis 总结
- 大华摄像头获取yuv数据
- 计算算法的时间复杂度和空间复杂度
- 深度学习入门(二) 线性回归、逻辑回归、正则化过程、神经网络简介
- 梦网云通讯查询余额API接口get_balance说明POST请求示例
- xgboost小结
- 最速降曲线问题
- 字符串和unicode互相转换
- jedis
- 继承(三)
- ssh转发--本地端口映射
- spark2.1源码调试
- c++学习笔记之 STL 泛型设计
- Java基本数据类型简介