【论文阅读】xgboost
文章目录
- 前言
- 损失函数
- 基础概念——树是怎么做预测的
- 带正则的损失函数
- 损失函数的二阶方法
- 泰勒展开
- 最关键难懂的部分,需要变换一下损失函数形式
- 决策树生成的贪婪算法
- 决策树生成近似算法,近似树生成,分位数策略
- 带权的分位方案 Weighted Quantile Sketch
- 对缺失值的处理——稀疏感知算法
- 工程上的设计
- 块结构设计
- 缓存访问优化算法
- “核外”块计算
- 参考
前言
之前有用过xgboost,但是对于其原理并没有去深刻的挖掘和理解,想要明白xgboost还是需要看chentianqi的论文呀,之前的几点疑问记录如下:
1. 如何处理缺失值?
2. 近似树学习是什么?
3. 如何并行?分布式?
4. 工程上做了什么?
5. 跟gbdt的区别是什么?
通过阅读论文来解决以上几点的疑问;
损失函数
1、二阶泰勒展开损失函数
2、正则项,用于控制模型的复杂度
基础概念——树是怎么做预测的
首先:数据集,有nnn个数据,每个数据xix_ixi,有mmm个feature
D={(xi,yi)}D = \{(x_i, y_i)\} D={(xi,yi)}
(∣D∣=n,xi∈Rm)(|D| = n,x_i \in \mathbb R^m)(∣D∣=n,xi∈Rm)
使用KKK个函数(KKK个树)累加预测;
y^i=ϕ(xi)=∑k=1Kfk(xi),fk∈F\hat y_i = \phi(x_i) = \sum_{k=1}^Kf_k(x_i), f_k \in Fy^i=ϕ(xi)=k=1∑Kfk(xi),fk∈F
函数空间F={f(x)=wq(x)}F = \{f(x) = w_{q(x)}\} F={f(x)=wq(x)}
(q:Rm→T,w∈RT)(q : \mathbb R^m \rightarrow T ,w \in \mathbb R^T)(q:Rm→T,w∈RT)
如下图:
对于上面一个样本xix_ixi,累加两个树的(有几棵树就累加几棵树)结果得到最终的结果,每一个树的结果在当前树的其中的一个叶子结点上;
样本xix_ixi总会落到树的某一个叶子结点上;
对于qqq:
这里 qqq表示每棵树的结构,xix_ixi映射到相应的叶子索引(解释f(x)=wq(x)f(x) = w_{q(x)}f(x)=wq(x))。 T 是树中的叶子数。 每个 fkf_kfk 对应一个独立的树结构qqq 和叶子权重 www。
带正则的损失函数
L(ϕ)=∑il(y^i,yi)+∑kΩ(fk)L(\phi) = \sum_il(\hat y_i, y_i) + \sum_k \Omega ( f_k)L(ϕ)=i∑l(y^i,yi)+k∑Ω(fk)
where Ω(f)=λ∗T+12∗γ∣∣w∣∣\Omega(f) = \lambda * T + \frac{1}{2} * \gamma ||w|| Ω(f)=λ∗T+21∗γ∣∣w∣∣
T 是树中的叶子数。
第二项为正则项,没有第二项就是传统的梯度提升树;
lll即为损失函数;
损失函数的二阶方法
上面的损失函数无法直接进行优化,还需要变换一下形式才可以;
除了这个原因还有两个原因:
1、推导有利于更清楚优化的目标,可以根据推到结果,直接用于代码构建和计算,和系统设计
2、节点split的评估依据 !!
第iii的样本xix_ixi在第ttt次迭代的时候(在训练第ttt棵树的时候),在第ttt棵树的某个叶子结点上会有这个样本,值为y^i(t)\hat y_i^{(t)}y^i(t),真实的值为yiy_iyi,因为树为累加预测结果,所以预测结果与真实结果的差据就是:
l(yi,y^i(t−1)+ft(xi))l(y_i, \hat y_i^{(t-1)} + f_t(x_i))l(yi,y^i(t−1)+ft(xi))
加上正则项,所有的样本求损失(样本数为nnn):
L(t)=∑i=1nl(yi,y^i(t−1)+ft(xi))+Ω(fk)L^{(t)} = \sum_{i=1}^n l(y_i, \hat y_i^{(t-1)} + f_t(x_i)) + \Omega ( f_k)L(t)=i=1∑nl(yi,y^i(t−1)+ft(xi))+Ω(fk)
在迭代第t轮,第t棵树的时候,此时y^i(t−1)\hat y_i^{(t-1)}y^i(t−1)是已知的,前面已经算出来了;
泰勒展开
泰勒级数 定义
在数学上,对于一个在实数或复数aaa邻域上,以实数作为变量或以复数作为变量的函数,并且是无穷可微的函数f(x)f(x)f(x),它的泰勒级数是以下这种形式的幂级数:
f(x)=∑n=0∞f(n)(a)n!(x−a)nf(x) = \sum _{n=0}^{\infty }{\frac {f^{(n)}(a)}{n!}}(x-a)^{n} f(x)=n=0∑∞n!f(n)(a)(x−a)n
这里n!n!n!表示nnn的阶乘,而 而f(n)(a)f^{(n)}(a)f(n)(a)表示函数fff在点aaa处的nnn阶导数。如果a=0a=0a=0,也可以把这个级数称为麦克劳林级数。
参考地址: https://zh.wikipedia.org/wiki/%E6%B3%B0%E5%8B%92%E7%BA%A7%E6%95%B0
f(x+Δx)f(x+\Delta x)f(x+Δx) 在点xxx处泰勒展开,
f(x+Δx)=∑n=0∞f(n)(x)n!(x+Δx−x)n=f(x+Δx)=∑n=0∞f(n)(x)n!(Δx)nf(x+\Delta x) = \sum _{n=0}^{\infty}{\frac {f^{(n)}(x)}{n!}}(x+\Delta x-x)^{n} = \\ f(x+\Delta x) = \sum _{n=0}^{\infty}{\frac {f^{(n)}(x)}{n!}}(\Delta x)^{n}f(x+Δx)=n=0∑∞n!f(n)(x)(x+Δx−x)n=f(x+Δx)=n=0∑∞n!f(n)(x)(Δx)n
只保留二阶的话
f(x+Δx)≈f(x)+f′(x)∗Δx+12f′′(x)(Δx2)f(x+\Delta x) \approx f(x) + f'(x)* \Delta x + \frac{1}{2}f^{''}(x)(\Delta x^2)f(x+Δx)≈f(x)+f′(x)∗Δx+21f′′(x)(Δx2)
返回损失函数
l(yi,y^i(t−1)+ft(xi))l(y_i, \hat y_i^{(t-1)} + f_t(x_i)) l(yi,y^i(t−1)+ft(xi))
其中 yiy_iyi为常数, y^i(t−1)\hat y_i^{(t-1)}y^i(t−1) 为xxx,可以这样理解,y^i(t−1)\hat y_i^{(t-1)}y^i(t−1)是不断变化累加的,视为自变量,而当前迭代的 ft(xi)f_t(x_i)ft(xi)
为 Δx\Delta xΔx,带入得:
l(yi,y^i(t−1)+ft(xi))≈l(yi,y^i(t−1))+gi∗ft(xi)+12hi∗ft(xi)2l(y_i, \hat y_i^{(t-1)} + f_t(x_i)) \approx \\ l(y_i, \hat y_i^{(t-1)}) + g_i * f_t(x_i) + \frac{1}{2} h_i * f_t(x_i)^2 l(yi,y^i(t−1)+ft(xi))≈l(yi,y^i(t−1))+gi∗ft(xi)+21hi∗ft(xi)2
其中:
一阶导数gi=∂l(yi,y^i(t−1))∂y^i(t−1)2二阶导数hi=∂2l(yi,y^i(t−1))∂y^i(t−1)2一阶导数 g_i = \frac{\partial l(y_i, \hat y_i^{(t-1)}) }{\partial \hat y_i^{(t-1)} }^2 \\ 二阶导数 h_i = \frac{\partial ^ 2 l(y_i, \hat y_i^{(t-1)}) }{\partial \hat y_i^{(t-1)} }^2一阶导数gi=∂y^i(t−1)∂l(yi,y^i(t−1))2二阶导数hi=∂y^i(t−1)∂2l(yi,y^i(t−1))2
此时对于损失函数
L~(t)=∑i=1n[l(yi,y^i(t−1))+gi∗ft(xi)+12hi∗ft(xi)2]+Ω(fk)\tilde L^{(t)} = \sum_{i=1}^n [ l(y_i, \hat y_i^{(t-1)}) + \\ g_i * f_t(x_i) + \frac{1}{2} h_i * f_t(x_i)^2] + \Omega ( f_k)L~(t)=i=1∑n[l(yi,y^i(t−1))+gi∗ft(xi)+21hi∗ft(xi)2]+Ω(fk)
最关键难懂的部分,需要变换一下损失函数形式
从数据集上来计算损失=》从叶子结点上来计算损失函数
定义:
对于叶子结点jjj,假设有nnn个样本,有一些样本最终都到了这个jjj节点上,则这个集合为
Ij={i∣q(xi)=j}I_j = \{i|q(x_i) = j\}Ij={i∣q(xi)=j}
最开始提到
q(xi)q(x_i)q(xi)为实例到叶子结点index的一个影射;
则损失函数可以变换到叶子结点上来计算:
L~(t)=∑i=1n[l(yi,y^i(t−1))+gi∗ft(xi)+12hi∗ft(xi)2]+Ω(fk)=L~(t)=∑j=1T[(∑i∈Ij∗gi)∗wj+12(∑i∈Ijhi+λ)wj2]+γT\tilde L^{(t)} = \sum_{i=1}^n [ l(y_i, \hat y_i^{(t-1)}) + g_i * f_t(x_i) + \frac{1}{2} h_i * f_t(x_i)^2] + \Omega ( f_k) \\ = \tilde L^{(t)} = \sum_{j=1}^T [ (\sum_{i \in I_j} * g_i) * w_j + \frac{1}{2}(\sum_{i \in I_j} h_i + \lambda) w_j^2 ] + \gamma T L~(t)=i=1∑n[l(yi,y^i(t−1))+gi∗ft(xi)+21hi∗ft(xi)2]+Ω(fk)=L~(t)=j=1∑T[(i∈Ij∑∗gi)∗wj+21(i∈Ij∑hi+λ)wj2]+γT
通过推导,可以知道
1、树是如何训练和优化的,优化的方式和优化的点是什么;
2、对于工程而言,
- gi,hig_i, h_igi,hi来自于损失函数;
- 树的迭代和优化,只是依赖于gi,hig_i, h_igi,hi;
- 在代码的搭建上,可以更加的简洁,直接通过gi,hig_i, h_igi,hi去优化迭代树的生成;
比如,考虑平方损失函数
这时:
一阶导数gi=∂l(yi,y^i(t−1))∂y^i(t−1)2=2∗l(yi,y^i(t−1))二阶导数hi=∂2l(yi,y^i(t−1))∂y^i(t−1)2=2一阶导数 g_i = \frac{\partial l(y_i, \hat y_i^{(t-1)}) }{\partial \hat y_i^{(t-1)} }^2 = 2 * l(y_i, \hat y_i^{(t-1)})\\ 二阶导数 h_i = \frac{\partial ^ 2 l(y_i, \hat y_i^{(t-1)}) }{\partial \hat y_i^{(t-1)} }^2 = 2一阶导数gi=∂y^i(t−1)∂l(yi,y^i(t−1))2=2∗l(yi,y^i(t−1))二阶导数hi=∂y^i(t−1)∂2l(yi,y^i(t−1))2=2
此时的 二阶导数hih_ihi为常数2!计算起来就方便太多了;
对于一个确定的树的结构q(x)q(x)q(x),对wjw_jwj求一阶导数为0时,得最优wjw_jwj在叶子结点jjj 为:
wj∗=∑i∈Ijgi∑i∈Ijhi+λw_j^* = \frac {\sum_{i \in I_j} g_i}{ \sum_{i \in I_j} h_i + \lambda}wj∗=∑i∈Ijhi+λ∑i∈Ijgi
此时优化目标为:
L~(t)=−12∑j=1T(∑i∈Ijgi)2∑i∈Ijhi+λ+γT\tilde L^{(t)} = - \frac {1}{2} \sum_{j=1}^T \frac {(\sum_{i \in I_j} g_i)^2}{\sum_{i \in I_j} h_i + \lambda} + \gamma T L~(t)=−21j=1∑T∑i∈Ijhi+λ(∑i∈Ijgi)2+γT
此时,此值可用于评估树q(x)q(x)q(x)的质量,如下图所示:
决策树生成的贪婪算法
数值越小,损失值越小,树的结构越好,模型也就越优越;
基于上面这点
【论文阅读】xgboost相关推荐
- XGBoost原论文阅读翻译
虽然之前转过一篇XGBoost的不错的文章,但那篇在很多细节部分做了省略,所以还是翻出原论文来精读一遍,顺带翻译一波.其中斜体字为我的观点,不是原文中的内容. 愿论文:XGBoost: A Scala ...
- [论文阅读]阿里DIN深度兴趣网络之总体解读
[论文阅读]阿里DIN深度兴趣网络之总体解读 文章目录 [论文阅读]阿里DIN深度兴趣网络之总体解读 0x00 摘要 0x01 论文概要 1.1 概括 1.2 文章信息 1.3 核心观点 1.4 名词 ...
- 论文阅读工具ReadPaper
对于搞科研的同学们来说,看论文是要经历的第一关,尤其是要读好多篇论文的时候,更是着实令人头大. 这不,最近无意中发现了个在线论文阅读网站:readpaper.com,号称「论文阅读笔记神器,硕博科研学 ...
- 多目标跟踪:CVPR2019论文阅读
多目标跟踪:CVPR2019论文阅读 Robust Multi-Modality Multi-Object Tracking 论文链接:https://arxiv.org/abs/1909.03850 ...
- 快速人体姿态估计:CVPR2019论文阅读
快速人体姿态估计:CVPR2019论文阅读 Fast Human Pose Estimation 论文链接: http://openaccess.thecvf.com/content_CVPR_201 ...
- Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读
Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读 Action4D: Online Action Recognition in the Crowd and Clutter 论文链接 ...
- 深度学习点云语义分割:CVPR2019论文阅读
深度学习点云语义分割:CVPR2019论文阅读 Point Cloud Oversegmentation with Graph-Structured Deep Metric Learning 摘要 本 ...
- 3D目标检测论文阅读多角度解析
3D目标检测论文阅读多角度解析 一.前言 CNN(convolutional neural network)在目标检测中大放异彩,R-CNN系列,YOLO,SSD各类优秀的方法层出不穷在2D图像的目标 ...
- 3D目标检测论文阅读摘要
3D目标检测论文阅读摘要 2D Object Detection 的研究已经非常成熟了,代表作品有RPN系列的FasterRCNN,One Shot系列的YOLOv1-YOLOv3,这里推荐一个2D ...
- 目标检测——Faster R-CNN论文阅读
论文阅读--Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks 文章目录 论文阅读--Faste ...
最新文章
- 报文如何截取时间_5种报文、8种邻居状态机详解OSPF工作原理
- arial字体可以商用吗_每次做PPT都不知该怎么选字体?6种万能字体搭配组合送你...
- Bete冲刺第五阶段
- Android自定义View研究(四) -- 在XML中定义View
- 对于线程安全的集合类(例如Vector)的任何操作是不是都能保证线程安全
- linux怎么修改sftp默认端口,转:linux 修改sftp服务默认提供者sshd的session timeout
- angular面试题及答案_关于最流行的Angular问题的StackOverflow上的48个答案
- hdu5279 YJC plays Minecraft 【分治NTT】
- zip版mysql5.6_mysql 5.6 压缩包版安装方法
- 月工资8000元无社保公积金,月工资6000元有社保公积金,怎么选?
- 什么是网站物理结构、逻辑结构
- c++小学期大作业攻略(二)整体思路+主界面
- python和go哪个就业前景好_Python和Java就业前景对比
- 2018-2019 C++期末复习资料
- html引用百度中图片不显示,百度图片不显示怎么办 百度图片不显示解决方法
- Centos7下安装MPlay和VLC
- 极限思想之阿基里斯和乌龟赛跑
- namespace什么意思
- golang 同一个包下不同文件之间函数调用问题
- html 渐变透明写法,css实现透明渐变特效的示例代码
热门文章
- 马哥Linux学习笔记之一——关于多磁盘的组织问题
- http://blog.sina.com.cn/s/blog_6a01140c0100wimi.html
- JSON-RPC轻量级远程调用协议介绍及使用
- 手机软件Toast无法显示提示信息
- 拉格朗日乘子法 那些年学过的高数
- 谁都会做:简单易行的祛斑法 - 生活至上,美容至尚!
- BERT4GCN:利用BERT中间层特征增强GCN进行基于方面的情感分类
- 如何在脱敏数据中使用BERT等预训练模型
- 【面经】各大AI研究院共35场NLP算法岗面经奉上
- 抖音日活用户破 6 亿,推荐系统是怎么做到的?