机器学习:集成算法 - xgboost

xgboost(eXtreme Gradient Boosting)
  • 大规模并行 boosting tree 的工具,据说是现在最好用的 boosting 算法,针对传统 GBDT 算法做了很多改进

xgboost 和传统 GBDT 的区别
  • GBDT 基学习器只用 CART 树,而 xgboost 除了用 CART 树,还可以用其他分类器
  • 优化目标函数里,用到了二阶导数信息,能够更快地收敛,而普通的 GBDT 只用到一阶
  • 优化目标函数里,对衡量模型复杂度的正则项进行了改进,GBDT 只对叶子个数做惩罚,而 xgboost 对叶子个数做惩罚的同时,还对叶子节点的权值做惩罚,有效地避免了过拟合
  • 利用优化目标函数的推导作为树的分裂准则
  • 在分割节点、寻找最佳分割点的时候,可以引入并行计算
  • 利用了特征的稀疏性
  • 能处理特征缺失
  • 支持列采样

输出函数

设有样本数据 \normalsize (x_{i}, y_{i})_{i=1}^{n}
j 棵树记为 \normalsize f_{j}(x)
则由 m 棵树组成的 xgboost 输出为
  \normalsize y_{i} = F_{m}(x_{i}) = F_{m-1}(x_{i}) + f_{m}(x_{i}) = \sum_{j=1}^{m}f_{j}(x_{i})
看起来就和 GBDT 一样,但 xgboost 的优化函数不一样

优化目标函数

xgboost 的优化目标函数为
  \normalsize Obj = \sum_{i=1}^{n}L(y_{i}, F_{m}(x_{i})) + \Omega(F)
  \normalsize \Omega(F) = \gamma T +\frac{1}{2}\lambda\sum_{k}^{T}(||w_{k}||^{2})
  其中 \small T 是所有树的叶子节点的总数,\small w 是每个叶子节点的系数

泰勒展开公式
  \normalsize f(x+\Delta x) = \frac{f(x)}{0!} + \frac{f^{'}(x)}{1!}\Delta x + ... + \frac{f^{(n)}(x)}{n!}\Delta x^{n} + R_{n}(x)
  
  其中 \small R_{n}(x)是泰勒公式的余项,是 \small \Delta x^{n}的高阶无穷小

将优化目标函数按泰勒公式展开,并取前三项目得到近似值
  \normalsize Obj = \sum_{i=1}^{n}L(y_{i}, F_{m}(x_{i})) + \Omega(F)
     \normalsize = \sum_{i=1}^{n}L(y_{i}, y_{i(m-1)}+f_{m}(x_{i})) + \Omega(F)
     \normalsize=\sum_{i=1}^{n}[L(y_{i}, y_{i(m-1)})+\frac{\partial L(y_{i}, y_{i(m-1)})}{\partial y_{i(m-1)}}f_{m}(x_{i})
       \normalsize + \frac{1}{2}\frac{\partial^{2} L(y_{i}, y_{i(m-1)})}{\partial^{2} y_{i(m-1)}}f^{2}_{m}(x_{i})] + \Omega(F)

将一阶导数记为 \normalsize g_{i} 将二阶导数记为 \normalsize h_{i} 改写为
  \normalsize Obj = \sum_{i=1}^{n}[L(y_{i}, y_{i(m-1)}) +g_{i}f_{m}(x_{i}) + \frac{1}{2}h_{i}f^{2}_{m}(x_{i})] + \Omega(F)

由于在计算第 m 棵树的时候,前 m-1 棵树已经确定,所以可以只保留和第 m 棵树有关的项,将优化目标改写为
  \normalsize Obj = \sum_{i=1}^{n}[g_{i}f_{m}(x_{i})+\frac{1}{2}h_{i}f^{2}_{m}(x_{i})]+\Omega(f_{m})

\normalsize f_{m} 的每个叶子节点是输出一个固定的值 \normalsize w_{j}
\normalsize I_{j} 代表所有会被映射到叶子节点 \normalsize j\normalsize x_{i} 集合
\normalsize T 代表 \normalsize f_{m} 的叶子节点数

进一步改写为
  \normalsize Obj = \sum_{j=1}^{T}[(\sum_{i\in I_{j}}g_{i})w_{j} + \frac{1}{2}(\sum_{i\in I_{j}}h_{i})w_{j}^{2}] + \gamma T +\frac{1}{2}\lambda\sum_{j=1}^{T}(w_{j}^{2})
     \normalsize = \sum_{j=1}^{T}[(\sum_{i\in I_{j}}g_{i})w_{j}+\frac{1}{2}(\sum_{i\in I_{j}}h_{i}+\lambda)w_{j}^{2}] + \gamma T

设有
  \normalsize G_{j} = \sum_{i\in I_{j}}g_{i}
  \normalsize H_{j} = \sum_{i\in I_{j}}h_{i}

可改写为
  \normalsize Obj = \sum_{j=1}^{T}[(G_{j}w_{j} +\frac{1}{2}(H_{j}+\lambda)w_{j}^{2}] + \gamma T

\normalsize w_{j} 求导并另导数为 0
  \normalsize G_{j}+(H_{j}+\lambda)w_{j} = 0

得到最优的

  \normalsize w_{j} = -\frac{G_{j}}{H_{j} + \lambda}

  \normalsize Obj = -\frac{1}{2}\sum_{j=1}^{T} \frac{G_{j}^{2}}{H_{j}+\lambda} + \gamma T

用于衡量树的优劣的就是 \normalsize Obj,其值越小,树结构越好

分裂叶子节点的依据

假设现在有一个叶子节点,属于这个叶子节点的样本的一阶导数的和为 \normalsize G_{M},二阶导数的和为 \normalsize H_{M},如果需要对这个叶子节点分裂成两个节点,那么叶子节点数量就 +1,假设分到左叶子的样本的值为 \normalsize G_{L}\normalsize H_{L},分到右叶子的样本的值为 \normalsize G_{R}\normalsize H_{R},则有 \normalsize G_{L} + G_{R} = G_{M} 以及 \normalsize G_{L} + G_{R} = H_{M},那么 \normalsize Obj 减小的值为

  \normalsize Gain = (-\frac{1}{2}\frac{G_{M}^{2}}{H_{M} + \lambda} + \gamma T) - (-\frac{1}{2}\frac{G_{L}^{2}}{H_{L}+\lambda} - \frac{1}{2}\frac{G_{R}^{2}}{H_{R} + \lambda} + \gamma(T+1))

      \normalsize = \frac{1}{2}[\frac{G_{L}^{2}}{H_{L} + \lambda} + \frac{G_{R}^{2}}{H_{R} + \lambda} - \frac{(G_{L} + G_{R})^{2}}{(H_{L} + H_{R})+\lambda}] - \gamma

选择使得 \normalsize Gain 值最大的分割特征和分割点
  
并计算分割后新的叶子节点的系数
  
  \normalsize w_{L} = -\frac{G_{L}}{H_{L} + \lambda}
  
  \normalsize w_{R} = -\frac{G_{R}}{H_{R} + \lambda}
  
停止分割的条件
  ○ 如果最大的 \normalsize Gain\normalsize\gamma 还小
  ○ 树已经达到了最大深度
  ○ 样本权重和小于某一个阈值

寻找最佳分裂点
  • 精确算法 - 穷举法
      遍历所有特征的所有特征值,该方法精度高但计算量大
  • 近似算法 - 分位点分割
      每个特征按照样本特征值的百分比选择候选分裂点
      近似法又有两种
      (1) 全局法:生成树之前就确定候选分裂点,这可以减少计算,但要一次取比较多的点
      (2) 局部法:每个节点确定候选分裂点,每次取的点较少,且可不断改善,但计算量大
  • 近似算法 - 二阶导数的分位点分割
      同样是按百分比选择候选分裂点,但不是直接用特征值,而是用二阶导数 \small h

提高计算速度
  • 提前计算和排序
     生成树的过程是串行的,在生成第 m 棵树时,第 m-1 棵树已经有了
     这样每个样本的一阶和二阶导数是已知的,可提前计算所有样本的 \normalsize g\normalsize h 值,并提前排序
     如果是近似算法,还可以提前将各个分位点之间的 \normalsize g\normalsize h 值进行累加得到 \normalsize G\normalsize H
  • 并行分裂节点
     每个节点的分裂都是独立互不影响的,所以可以并行计算
     每个节点的分裂要遍历所有特征,特征计算也可以并行处理
  • 存储优化
     采用 Block 结构以稀疏矩阵 CSC 存储特征数据并排序,后续的并行计算可以重复使用 Block
     Block 按列存储,方便计算
     Block 的特征需要指向对应样本的导数值,会导致非连续内存访问,使用缓存预取来避免
     不同的 Block 可以存在不同的机器上,该方法对局部近似法尤其有效
     当数据太大无法全写入内存时,需要将 Block 压缩落盘,然后有独立的线程做读取解压

特征评价

xgboost 有三个指标用于对特征进行评价

  • weight - 某个特征被用于分裂的次数
  • gain - 某个特征被用于分裂时得到的平均增益
  • cover - 某个特征在分裂时结点处的平均二阶导数

学习率(Shrinkage)

和 GBDT 一样,xgboost 也使用了学习率做 Shrinkage,在计算出了节点的 \normalsize w 值后,会乘以一个小于 1 的系数,这能够防止过拟合

列采样

xgboost 支持列抽样,能避免过拟合,同时能减少计算

稀疏数据

xgboost 能学习缺失值的分裂方向,在分裂的过程中,会尝试把所有特征缺失的样本都分入左节点,或是都分入右节点,看是哪边增益大,然后决定其分裂方向



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354