认识提升树

这个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. 论文阅读笔记六十:Squeeze-and-Excitation Networks(SENet CVPR2017)

    论文原址:https://arxiv.org/abs/1709.01507 github:https://github.com/hujie-frank/SENet 摘要 卷积网络的关键构件是卷积操作, ...

  2. Linux学习笔记-第2天- 新的开始

    迟到且稀疏的笔记,希望自己今年会有所突破.加油

  3. 【转】Java 内部类总结

    Java内部类 一. 含义 在Java编程语言里,程序是由类(class)构建而成的.在一个类的内部也可以声明类,我们把这样的类叫做内部类. 二. 作用 实现了更好的封装,我们知道,普通类(非内部类) ...

  4. [LeetCode] 213. House Robber II 打家劫舍之二

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  5. java web开发入门六(spring mvc)基于intellig idea

    spring mvc ssm=spring mvc+spring +mybatis spring mvc工作流程 1A)客户端发出http请求,只要请求形式符合web.xml文件中配置的*.actio ...

  6. 实战django(一)--(你也能看懂的)注册与登录(带前端模板)

    先是具体目录:(主要是注意templates和static的位置),其中person文件夹是上一期实战的,不用理会,login是本节实战app 项目urls.py from django.contri ...

  7. Django+nginx+gunicore+supervisor+阿里云主机 部署博客项目

    1 准备阶段 1 新鲜的阿里云主机 2 购买一个喜欢的域名 3 创建python的虚拟环境 2 阿里云主机的选取 咱们就是为了实验,我买了最便宜的阿里云主机 3 阿里云主机创建一个超级用户 3.1 默 ...

  8. sublime text3安装ConvertToUTF8

    1.安装 Package Control 方式1:命令行安装 按ctrl+~快捷键,调出一个小文本款,然后粘贴以下代码: import urllib.request,os,hashlib; h = ' ...

  9. dataframe 基本操作

    package com.jason.example import org.apache.spark.sql.functions.broadcast class DFTest extends Spark ...

  10. linux webbench测试高并发方法

    linux webbench测试高并发方法由于ab小工具 测试高并发 会出错 具体原因http://newmiracle.cn/?p=594所以采用webbench这个来测试<pre> w ...