• 机器学习六 Xgboost: 一把屠龙刀的自我修养


    引言

    集成学习, 在机器学习中是一个非常重要的思想: 把多个弱分类器精巧地组合在一起,成为一个很强大的学习器. 集成学习也因此一直处在风口浪边. 集成学习主要分为bagging 及boosting, 二者分别(主要)解决偏倚-方差分解中的方差与偏倚. 目前, 一般会认为boosting的效果会更好一些,故在这方面研究的就会多一些, 而陈天奇绝对是这一众人等的明星, 他携屠龙宝刀Xgboost 杀出重围, 莫敢争锋. xgboost在各大机器学习相关的竞赛中,文治武功,望尘莫及, 大有一统江湖之势… 这么'犀利'的一把利器, 如果不了解它, 是不是都不好意思自己是做机器学习, 人工智能的?

    Xgboost 是boosting 学习方法的一种. 是对gbdt的改进升级. Xgboost 效果明显好于之前的boosting算法, 而且速度快, 更'可气的'是其竟支持并行计算, 这对工业界来说可是一个不小的福音. 这些优势成就了它今天的美名.

    Xgboost

    在介绍之前,先'初始化'一些'参数': 数据集 (D = {(x_i,y_i) | x_iin R^m, y_i in R i = 1,2,…,n}).

    机器学习的目的是找到一个映射 f(x) 使得:

    [L(y,hat{y}) = L(y,f(x)) = sum_{i = 1}^N L(y_i, f(x_i)) ]

    最小化, 其中 (hat{y}) 是经过模型得到的对 y 的估计, L 代表损失函数(Loss Function).

    Boosting 解决上式的方法是采用前向分步算法, f(x) 是在训练过程中, 一步一步逐渐(组合)得到的:

    [f(x) = w_0 + sum_{k= 1}^K w_k b_k(x) = sum_{k=1}^K t_k(x) ]

    其中, b(x) 是基学习器, w 是学习器的权重($w_0 $ 为偏置, 常取0,为简便,后面忽略, 因其为常数,对优化方式完全没有影响). 另, 再强调下:

    [f_k(x) = sum_{j=1}^kw_jb_j(x)) = sum_{j = 1}^k t_j(x) ]

    有时 t(x) 也会乘上一个衰减因子(shrinkage), 通常为0.1, 这个衰减因子可过拟合(因如果过早到达最优附近, 很可能越过最优点, 导致表现下降).

    (Ps: 请注意, 本文的符号表示,与xgboost的论文符号表示不尽相同, 原因是原论文的符号与我之前的boosting符号有冲突, 为了统一,只好修改了. 如果理解原理了, 用什么符号都无所谓了,对吧~ =^_^=)

    在Xgboost中, 这里出现了第一次改进, 其思想也很自然, 即加上了正则项, 防止过拟合.

    [f(x) = sum_{k = 1}^K t_k(x ) + sum_{k = 1}^K Omega_k(t_k(x)) ]

    其中 (Omega_k(t_k(x))) 是第 k 步中的 (t_k(x)) 的正则项. 因这里的基学习器(通常)为CART, 故这里的 正则项可理解为对树的复杂度的惩罚, 树的复杂度可以用树的叶结点的个数及各个叶结点的权重表示, 陈给出下了面的一种形式:

    [Omega(t_k) = r T + frac{1}{2} lambda sum_{ j= 1}^T c^2_j ]

    其中 T 为第 k 棵树的叶点结点个数, (c_j) 为此树上第 j 个叶结点上的权重(或称为 第 j 个叶结点的输出值). 这只是其中一种正则形式, 只要合理,完全可以用其他的代替.

    这个改进确实很自然, 现在的机器学习的目标函数基本上都可以抽象为损失,正则项的组合:

    [Object = Loss + Regulation ]

    在前向分步算法中, 第 k 步 的优化目标函数可表示为:

    [egin{array}\ Object_k(Theta) &=& L(y, f_k)+ Omega(f_k) \ &=& sum_{i = 1}^N l(y_i,f_k(x_i)) + Omega(f_k)\ &=& sum_{i=1}^Nl(y_i,f_{k-1}(x_i)+t_k(x_i)) + sum_{j=1}^kOmega(t_j)\ &=& sum_{i=1}^Nl(y_i,f_{k-1}(x_i)+t_k(x_i)) + Omega(t_j) + constant\ end{array} ]

    其中 constant 表示常数(后面为简洁优化会忽略, 因常数对优化无影响).

    接下来, xgboost在这里进一步改进, 传统的gradient boosting算法, 从名字就可以知道是应用的梯度(或一阶导数)优化的, 而xgboost 则用 牛顿法 来进行优化,即应用二阶导数优化:

    [egin{array}\ Object_k(Theta) &=& sum_{i=1}^Nl(y_i,f_{k-1}(x_i)+t_k(x_i)) + Omega(t_j) \ & = & sum_{i = 1}^N left(l(y_i,f_{k-1}(x_i)) + g_{k,i} cdot t_k(x_i) + frac{1}{2}h_{k,i}cdot t^2_k(x_i) ight) + Omega(t_j) \ end{array} ]

    其中:

    [egin{array}\ g_{k,i} = frac{partial l(y_i, f_{k-1}(x_i))}{partial f_{k-1}(x_i)}\ h_{k,i} = frac{partial^2 l(y_i, f_{k-1}(x_i))}{partial f_{k-1}(x_i)^2}\ end{array} ]

    即一阶偏导与二阶偏导. 这里的展开,其实用到的就是泰勒公式的二阶展开:

    [f(x) = f(x_0) + f'(x_0)(x-x_0) + frac{1}{2}f''(x_0)(x-x_0)^2+ o((x-x_0)^2) ]

    其中 (x_0) 相当于面的(f_{k-1}), (Delta x = x-x_0) 相当于 (t_k(x)).

    忽略掉常数项, 并把正则项展开得:

    [egin{array}\ Object_k(Theta) & = & sum_{i = 1}^N left( g_{k,i} cdot t_k(x_i) + frac{1}{2}h_{k,i}cdot t^2_k(x_i) ight) + rT_k+frac{1}{2}lambdasum_{j=1}^T c^2_{k,j}\ end{array} ]

    (t_k(x)) 是 CART, 则 可表示为:

    [t_k(x) = sum_{j = 1}^T c_{k,j} cdot I_{x in R_j} ]

    其中, (R_j) 是 第 k 棵 CART 的 第 j 个节点, (c_{k,j}) 为此叶结点的输出值.

    于是:

    [egin{array}\ Object_k(Theta) & = & sum_{j = 1}^T left[(sum_{xin R_j}g_{k,i})cdot c_{k,j} +frac{1}{2} (sum_{xin R_j} h_{k,j} + lambda)cdot c^2_{k,j} ight] + r T_k\ end{array} ]

    (c_{k,j}) 求偏导:

    [c_{k,j} = frac{sum_{xin R_j}g_{k,i}}{sum_{xin R_j} h_{k,j} + lambda} = frac{G_{k,j}}{H_{k,j}+lambda} ]

    这个公式揭示了最佳树结构的条件, 再代入目标函数:

    [Obj = -frac{1}{2}sum_{j =1}^T frac{G_{k,j}^2}{H_{k,j}+lambda} + rT ]

    以上两式是Xgboost 最重要的公式! (因这两个公式不但是boosting 的generallized additive 的优化目标,而且也是每棵树获得的最优目标(gain)的关键.)

    然而, 就算这样, 满足最优结构的树也可能有无数棵, 为此, 第 k 棵 CART 的获取采用贪心算法, 贪心的标准即是寻找最大分离增益(splitting Gain):

    [Gain = frac{1}{2}left[ frac{G_{L}^2}{H_{L}+lambda}+ frac{G_{R}^2}{H_{R}+lambda} - frac{G^2}{H+lambda} ight] - r ]

    其中 L, R 分点表示分离之后的左右两叶结点, 无下标的 G,H 则属于未分离时结点的相关参数.

    参考文献

    1. BoostedTree(slides), 2014, Tianqi Chen.
    2. XgBoost: A scalable Tree Boosting System
  • 相关阅读:
    HQL查询.
    Apache solr(二).
    Apache solr(一).
    Node.js入门以及第一个helloworld程序.
    SQL优化一(SQL使用技巧)
    NodeJS安装第一个工程.
    [LeetCode] 545. Boundary of Binary Tree 二叉树的边界
    [LeetCode] 41. First Missing Positive 首个缺失的正数
    [LeetCode] 749. Contain Virus 包含病毒
    [LeetCode] 803. Bricks Falling When Hit 打击砖块掉落
  • 原文地址:https://www.cnblogs.com/vpegasus/p/xgboost.html
Copyright © 2020-2023  润新知