文章目录

  • 前言
  • 损失函数
    • 基础概念——树是怎么做预测的
    • 带正则的损失函数
    • 损失函数的二阶方法
      • 泰勒展开
      • 最关键难懂的部分,需要变换一下损失函数形式
    • 决策树生成的贪婪算法
    • 决策树生成近似算法,近似树生成,分位数策略
    • 带权的分位方案 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∑K​fk​(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∑n​l(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+21​f′′(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​)+21​hi​∗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​)+21​hi​∗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​)+21​hi​∗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∈Ij​​hi​+λ∑i∈Ij​​gi​​
此时优化目标为:
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)=−21​j=1∑T​∑i∈Ij​​hi​+λ(∑i∈Ij​​gi​)2​+γT
此时,此值可用于评估树q(x)q(x)q(x)的质量,如下图所示:

决策树生成的贪婪算法

数值越小损失值越小,树的结构越好,模型也就越优越;
基于上面这点

【论文阅读】xgboost相关推荐

  1. XGBoost原论文阅读翻译

    虽然之前转过一篇XGBoost的不错的文章,但那篇在很多细节部分做了省略,所以还是翻出原论文来精读一遍,顺带翻译一波.其中斜体字为我的观点,不是原文中的内容. 愿论文:XGBoost: A Scala ...

  2. [论文阅读]阿里DIN深度兴趣网络之总体解读

    [论文阅读]阿里DIN深度兴趣网络之总体解读 文章目录 [论文阅读]阿里DIN深度兴趣网络之总体解读 0x00 摘要 0x01 论文概要 1.1 概括 1.2 文章信息 1.3 核心观点 1.4 名词 ...

  3. 论文阅读工具ReadPaper

    对于搞科研的同学们来说,看论文是要经历的第一关,尤其是要读好多篇论文的时候,更是着实令人头大. 这不,最近无意中发现了个在线论文阅读网站:readpaper.com,号称「论文阅读笔记神器,硕博科研学 ...

  4. 多目标跟踪:CVPR2019论文阅读

    多目标跟踪:CVPR2019论文阅读 Robust Multi-Modality Multi-Object Tracking 论文链接:https://arxiv.org/abs/1909.03850 ...

  5. 快速人体姿态估计:CVPR2019论文阅读

    快速人体姿态估计:CVPR2019论文阅读 Fast Human Pose Estimation 论文链接: http://openaccess.thecvf.com/content_CVPR_201 ...

  6. Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读

    Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读 Action4D: Online Action Recognition in the Crowd and Clutter 论文链接 ...

  7. 深度学习点云语义分割:CVPR2019论文阅读

    深度学习点云语义分割:CVPR2019论文阅读 Point Cloud Oversegmentation with Graph-Structured Deep Metric Learning 摘要 本 ...

  8. 3D目标检测论文阅读多角度解析

    3D目标检测论文阅读多角度解析 一.前言 CNN(convolutional neural network)在目标检测中大放异彩,R-CNN系列,YOLO,SSD各类优秀的方法层出不穷在2D图像的目标 ...

  9. 3D目标检测论文阅读摘要

    3D目标检测论文阅读摘要 2D Object Detection 的研究已经非常成熟了,代表作品有RPN系列的FasterRCNN,One Shot系列的YOLOv1-YOLOv3,这里推荐一个2D ...

  10. 目标检测——Faster R-CNN论文阅读

    论文阅读--Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks 文章目录 论文阅读--Faste ...

最新文章

  1. 报文如何截取时间_5种报文、8种邻居状态机详解OSPF工作原理
  2. arial字体可以商用吗_每次做PPT都不知该怎么选字体?6种万能字体搭配组合送你...
  3. Bete冲刺第五阶段
  4. Android自定义View研究(四) -- 在XML中定义View
  5. 对于线程安全的集合类(例如Vector)的任何操作是不是都能保证线程安全
  6. linux怎么修改sftp默认端口,转:linux 修改sftp服务默认提供者sshd的session timeout
  7. angular面试题及答案_关于最流行的Angular问题的StackOverflow上的48个答案
  8. hdu5279 YJC plays Minecraft 【分治NTT】
  9. zip版mysql5.6_mysql 5.6 压缩包版安装方法
  10. 月工资8000元无社保公积金,月工资6000元有社保公积金,怎么选?
  11. 什么是网站物理结构、逻辑结构
  12. c++小学期大作业攻略(二)整体思路+主界面
  13. python和go哪个就业前景好_Python和Java就业前景对比
  14. 2018-2019 C++期末复习资料
  15. html引用百度中图片不显示,百度图片不显示怎么办 百度图片不显示解决方法
  16. Centos7下安装MPlay和VLC
  17. 极限思想之阿基里斯和乌龟赛跑
  18. namespace什么意思
  19. golang 同一个包下不同文件之间函数调用问题
  20. html 渐变透明写法,css实现透明渐变特效的示例代码

热门文章

  1. 马哥Linux学习笔记之一——关于多磁盘的组织问题
  2. http://blog.sina.com.cn/s/blog_6a01140c0100wimi.html
  3. JSON-RPC轻量级远程调用协议介绍及使用
  4. 手机软件Toast无法显示提示信息
  5. 拉格朗日乘子法 那些年学过的高数
  6. 谁都会做:简单易行的祛斑法 - 生活至上,美容至尚!
  7. BERT4GCN:利用BERT中间层特征增强GCN进行基于方面的情感分类
  8. 如何在脱敏数据中使用BERT等预训练模型
  9. 【面经】各大AI研究院共35场NLP算法岗面经奉上
  10. 抖音日活用户破 6 亿,推荐系统是怎么做到的?