认识提升树

这个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. 洛谷 P2357 守墓人

    洛谷 P2357 守墓人 题目描述 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然.. ...

  2. luogu P2221 [HAOI2012]高速公路题解

    题面 很套路的拆式子然后线段树上维护区间和的题.一般都是把式子拆成区间内几个形如\(\sum i*a_i, \sum i^2 * a_i\)的式子相加减的形式. 考虑一次询问[l,r]的答案怎么算: ...

  3. python使用rdflib创建rdf,在jena fuseki上执行SPARQL查询

    建立并启动jena fuseki服务 参考:https://www.cnblogs.com/bincoding/p/11223372.html 使用rdflib创建rdf文件 import rdfli ...

  4. c# .net core + .net framework mongodb nuget 包

    FastNet.Framework.Mongo https://github.com/my-core/FastNet.Framework GH.MongoDb.GenericRepository ht ...

  5. SpringBoot第十篇:thymeleaf详解

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10931435.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   Sprin ...

  6. 【RS】Deep Learning based Recommender System: A Survey and New Perspectives - 基于深度学习的推荐系统:调查与新视角

    [论文标题]Deep Learning based Recommender System: A Survey and New Perspectives ( ACM Computing Surveys  ...

  7. 关于source insight 置顶窗口或者处于前台挡住窗口解决办法

    两个办法,分别如下: 1.重启source insight: 2.按两次F11:

  8. Android Studio Analyze APK 一直显示 Parsing Manifest探因及解决

    一.背景 大家都知道,Android Studio开发工具自带了Analyze Apk,可以很方便的分析Apk文件.具体位于菜单build >> Analyze APK...路径下,点击后 ...

  9. 【UOJ#33】【UR #2】树上GCD(长链剖分,分块)

    [UOJ#33][UR #2]树上GCD(长链剖分,分块) 题面 UOJ 题解 首先不求恰好,改为求\(i\)的倍数的个数,最后容斥一下就可以解决了. 那么我们考虑枚举一个\(LCA\)位置,在其两棵 ...

  10. ListView 实现进度条显示

    代码参考互联网,本人在Win10 + Delphi 10.3.2 社区版中测试通过,现将测试通过的代码分享如下: unit Unit1; interface uses Winapi.Windows, ...