zoukankan      html  css  js  c++  java
  • XGBoost 引入

    认识提升树

    这个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 的详细推导过程.

  • 相关阅读:
    Beta阶段团队项目开发篇章2
    Beta阶段团队项目开发篇章1
    Alpha阶段博客链接
    大学生对技术网站需求的调查问卷结果分析
    关于大学生对技术网站需求的问卷调查
    第十。。。三周嘞
    进入第十一周喽
    第十周了耶~
    第九周也要过去啦~~~
    第,八,周,啦
  • 原文地址:https://www.cnblogs.com/chenjieyouge/p/12013958.html
Copyright © 2011-2022 走看看