认识提升树

这个boosting 跟 Adaboost 不同. Adaboost 是通过上一轮的误差率来动态给定一下轮样本不同的权重来学习不同的模型.

现在的方式, 更多是基于残差 的方式来训练. 一个比较现实的栗子是, 我训练了一个模型 m1, 但发现, 效果不怎么好, 得到的残差比较大. 但是呢, 我又不想将 m1 废弃掉. 如何才能改进呢?

这是一个非常现实的问题. 解决的方案可以是, 基于m1 的基础上再做训练...就这样, 通过一个个的模型进行训练, 下一个模型来弥补上一个模型的"不足"

就以决策树而言, 提升树的模型可以写为:

\(f_M(x) = \sum \limits _{m}^M T(x, \Theta_m)\)

M 表示树的棵树

T( ) 表示决策树, \(\Theta\) 是 "\Theta"

它的基本思想是, 通过已知前一棵树的情况下, 来决定下一棵树的形状

\(f_m(x) = f_{m-1}(x) + T(x, \Theta_m)\)

而参数的求解:

\(\hat \Theta = arg \ min _{\Theta_m} \sum \limits _{i=1}^N L(y_i, f_{m-1}(x) + T(x_i; \Theta_m))\)

以回归问题为栗子,当损失函数用误差的平方来衡量时:

\(L(y, f(x)) = (y-f(x))^2\)

将树带入即:

\(L(y_i, f_{m-1}(x) + T(x_i; \Theta_m))\)

\(=[y_i - f_{m-1}(x) -T(x_i; \Theta_m)]^2\)

记: \(y_i - f_{m-1}(x)\) 为 before, 则可写为:

$=[before-T(x_i; \Theta_m)]^2 $

搞了一通操作, 其实就只想引入两句话:

  • 新树的生成, 其训练数据, 是上次预测结果与数据值之间的残差
  • 这个残差,会随着树的增加而逐渐减少

基于残差的训练

age work_time salary 预测收入 残差
20 2 10 9 1
22 3 13 11 2
25 6 15 10 5
24 2 13 模型1预测 11 2
28 3 18 12 6
23 2 12 12 0
25 5 16 18 -2

现在将 模型1 预测的 残差, 作为 "salary" 再进行训练得到 模型2

age work_time salary 预测收入 残差
20 2 1 1 0
22 3 2 3 -1
25 6 5 4 1
24 2 2 模型2预测 3 -1
28 3 6 5 1
23 2 0 1 2
25 5 -2 1 -3

此时的这个 残差 是模型1 和 模型2 都尚未解决的部分

继续将 模型2 预测的 残差, 作为 "salary" 再训练得到 模型3

age work_time salary 预测收入 残差
20 2 0 0 0
22 3 -1 -0.5 -0.5
25 6 1 0.5 0.5
24 2 -1 模型3预测 0 -1
28 3 1 2 -1
23 2 2 0 -1
25 5 -3 -2 -1

此时的残差, 是 模型1, 模型2, 模型3 都尚未解决的部分.

.....

最终预测 = 模型1预测 + 模型2预测 + 模型3预测 + .....

为啥能相加: 因为是基于残差

模型1预测 模型2预测 模型3预测 最终预测
9 1 0 10
11 3 -0.5 13.5
10 4 0.5 14.5
11 3 0 14
12 5 2 19
12 1 0 13
8 1 -2 17

注意, 这种基于残差的训练方式, 下一次的模型是基于上一次的残差来训练的.即样本特征是没有变的, 变的残差, 和基于残差训练的模型数量

注意 Adaboost 是改变样本的权重哦, 注意跟 随机森林是的结果是一个个独立的, 然后voting. 而这里是要各个模型的预测求和为最终结果

这种 "累加" , 有个我亲身的栗子

让我想我小的时候, 那时候需要一个叫 "打米机" 这样一台机器, 输入谷粒, 输出大米.

输出分为两拨, 一波是不含杂糠,光溜溜的大米, 一波是含杂糠的大米.

为了干掉这些杂糠

又重新把它们放入机器中,这样多次反复后,

基本都变成了光溜溜的大米.

这个过程也叫做, Gradient Boosted. 想必这些思想, 大家都有所了解, 但其实忽略了一个最大的问题, 这些模型要如何来训练呢

XGBoost 引入

XGBoost 感觉是当下算非常流行的算法了吧. 主要原因, 还是它的效果好呗. 这种算法呢, 可以并行, 训练效率高, 实际效果好, 可控参数多, 可以进行灵活调整, 是让我等调参侠, 发挥真正实力的时候了.

  • 如何构造目标函数
  • 目标函数难以优化,如何近似
  • 如何将树的结构,引入目标函数 (树的参数化)
  • 难优化,是否使用贪心算法

目标函数应该是最难的, 比如之前的 LR目标函数, SVM, 逻辑回归, KNN..等. 个人感觉难的点在于如何自然语言转为数学语言

而优化相对刻板一些, 比如求解梯度为0向量, 对偶化, 包括这里会用的 近似用, 泰勒级数展开 等.

树这结构, 要如何参数化, 真的是搞不定, 我到现在都没太能理解 "树" 这种结构. 而最后优化的时候, 向之前, SVM用到了 KKT条件, LR 用到梯度下降法, 但这里该如何去整呢, 贪心算法嘛, 这些都是值得思考的问题.

这里只是先对这种基于残差的训练做一个引入, 下篇才正式开始整 XGBOOST 的详细推导过程.

XGBoost 引入 - 提升树的更多相关文章

  1. 前向分步算法 && AdaBoost算法 && 提升树(GBDT)算法 && XGBoost算法

    1. 提升方法 提升(boosting)方法是一种常用的统计学方法,在分类问题中,它通过逐轮不断改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能 0x1: 提升方法的基本 ...

  2. 梯度提升树GBDT算法

    转自https://zhuanlan.zhihu.com/p/29802325 本文对Boosting家族中一个重要的算法梯度提升树(Gradient Boosting Decison Tree, 简 ...

  3. GBDT(梯度提升树)scikit-klearn中的参数说明及简汇

    1.GBDT(梯度提升树)概述: GBDT是集成学习Boosting家族的成员,区别于Adaboosting.adaboosting是利用前一次迭代弱学习器的误差率来更新训练集的权重,在对更新权重后的 ...

  4. scikit-learn 梯度提升树(GBDT)调参小结

    在梯度提升树(GBDT)原理小结中,我们对GBDT的原理做了总结,本文我们就从scikit-learn里GBDT的类库使用方法作一个总结,主要会关注调参中的一些要点. 1. scikit-learn ...

  5. 梯度提升树(GBDT)原理小结

    在集成学习之Adaboost算法原理小结中,我们对Boosting家族的Adaboost算法做了总结,本文就对Boosting家族中另一个重要的算法梯度提升树(Gradient Boosting De ...

  6. 笔记︱决策树族——梯度提升树(GBDT)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本笔记来源于CDA DSC,L2-R语言课程所 ...

  7. 梯度提升树(GBDT)原理小结(转载)

    在集成学习值Adaboost算法原理和代码小结(转载)中,我们对Boosting家族的Adaboost算法做了总结,本文就对Boosting家族中另一个重要的算法梯度提升树(Gradient Boos ...

  8. GBDT(梯度提升树) 原理小结

    在之前博客中,我们对Boosting家族的Adaboost算法做了总结,本文就对Boosting家族中另一个重要的算法梯度提升树(Gradient Boosting Decison Tree, 以下简 ...

  9. 梯度提升树GBDT总结

    提升树的学习优化过程中,损失函数平方损失和指数损失时候,每一步优化相对简单,但对于一般损失函数优化的问题,Freidman提出了Gradient Boosting算法,其利用了损失函数的负梯度在当前模 ...

随机推荐

  1. python27期day07:基础数据类型补充、循环删除的坑、二次编码、作业题。

    1.求最大位数bit_length: a = 10 #8421 1010print(a.bit_length())结果:42.capitalize首字母变大写: s = "alex" ...

  2. JAVA并发-Executor

    结构 类继承图: 上面的各个接口/类的关系和作用: Executor 执行器接口,也是最顶层的抽象核心接口, 分离了任务和任务的执行. ExecutorService 在Executor的基础上提供了 ...

  3. arm指令集图片

  4. hekaiming专坑

    先挖个 图像去雾之何凯明暗通道先验去雾算法原理及c++代码实现 ICCV 2017:FAIR Mask R-CNN ICCV 2017:FAIR 密集物体检测的 Focal Loss one-stag ...

  5. Linux性能优化实战学习笔记:第十五讲

    一.内存映射 内存管理也是操作系统最核心的功能之一,内存主要用来存储系统和应用程序的指令.数据.缓存等 1.我们通说的内存指的是物理内存还是虚拟内存? 我们通常说的内存容量,其实这指的是物理内存,物理 ...

  6. cocos: RenderTexture 合并精灵图片

    var render = new cc.RenderTexture(730, 450); //创建渲染纹理对象,并数字确定宽度 render.begin(); var sp1 = cc.Sprite. ...

  7. vue.js三种安装方式

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...

  8. Java 获取所有子类信息

    我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息.使用方法如下: Reflect ...

  9. aicoder实习svn内部培训教程

    1 svn介绍 都已经用了git,为什么还要介绍svn呢?为了让aicoder.com的学员能够掌握多种的源代码管理工具的使用方法,更快的融入到项目开发中,特整理此文档. 1.1 项目管理中的版本控制 ...

  10. SpringBoot 分环境变量配置

    方式一:通过不同环境的配置文件 1.1 springboot目录下配置不同环境的配置文件 1.2 在application.properties中配置环境 1.3运行springboot的run方法就 ...