认识提升树

这个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. Netty入门程序(四)

    maven创建project,引入依赖: <dependency> <groupId>io.netty</groupId> <artifactId>ne ...

  2. LeetCode 154. Find Minimum in Rotated Sorted Array II寻找旋转排序数组中的最小值 II (C++)

    题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...

  3. Excel-基本操作

    一.EXCEL的数据类型 1.字符型 2.数值型 3.日期型数据和时间型数据 二.快捷键 ctrl+上下左右健 快速选择某区域  上下左右单元格 ctrl+shift+上下左右 快速选择某个取悦 三. ...

  4. Regular Forestation CodeForces - 1252F(树同构)

    Regular Forestation \[ Time Limit: 1000 ms\quad Memory Limit: 262144 kB \] 题意 给出一个节点为 \(n\) 的树,问删掉树上 ...

  5. 单交换机VLAN划分(基于Cisco模拟器)

    实验目的: (1)掌握交换机配置的几种模式及基本配置命令. (2)掌握VLAN的原理及基于交换机端口的VLAN划分方法. 实验设备: 交换机一台,主机四台,直通线四根 实验步骤: 1.给交换机划分VL ...

  6. Ubuntu放弃战斗, Linux桌面的悲哀 - 简书

    Ubuntu放弃战斗, Linux桌面的悲哀 - 简书 https://www.jianshu.com/p/86dd6e34ce91

  7. [LeetCode] 4. Median of Two Sorted Arrays 两个有序数组的中位数

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  8. SQLAIchemy(二)ORM 相关

    0. 前言 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术 简单的说,ORM是通过使用描述对象和数据库之 ...

  9. HTML连载28-标签的权重

    一.什么是优先级的权重 1.作用:当多个选择器混合在一起的时候,我们可以通过计算权重来判断谁的优先级最高. 2.权重的计算规则 公共代码: <body> <div id=" ...

  10. javascript判断变量是否为空的方法

    javascript判断字符串变量是否为空的方法代码如下<pre> if (typeof(ndesc)=="undefined" || ndesc=='' || nde ...