Stacked Generalization

Stacked Generalization

堆栈泛化:使用多种模型分别训练训练,将其结果叠加作为下层 模型的输入,最终得到预测输出

stacking

  • 属于异源集成模型,可以视为

    • 复合函数

      stacing_workflow_2

    • 短路网络

      stacing_workflow_1

  • 从某种意义上,复杂模型都是stacking

思想

  • 不同模型侧重于获取数据不同方面的特征

    • 使用基学习器抽取数据特征进行表示学习,提取不同角度的 数据高维特征
    • 考虑到使用全量训练数据训练、预测作为下层模型输入会 导致过拟合,可使用K折交叉验证避免过拟合
    • 有些基学习器只使用适合其部分特征训练
      • GBDT、DNN适合低维稠密特征
  • 元学习器组合多个基学习器的输出

    • 从数据高维特征学习数据模式,具有更好的泛化能力,避免 过拟合

算法

  • 输入:模型$M1, M_2, \cdots, M_d$、训练特征:$X{n*m}$、 训练标签$Y_{n}$、测试特征$X^{‘}$
  • 输出:stacking模型、预测标签
  • 将训练数据K折划分,对第$i$轮划分

    • 使用模型$M1, M_2, \cdots, M_d$分别在相应训练集 $[X[:n_i,:], X[n{i+1}:,:]]$、 $[Y[:ni], Y[n{i+1}:]]$上训练
    • 在相应验证集$X[ni:n{i+1}, :]$上验证、并记录验证 结果
    • 将验证集验证结果叠加得到部分样本新特征 $N[ni: n{i+1}, d]$
  • 将K轮划分得到的部分新特征拼接得到训练集的完整新特征 $N_{n * d}$,将新特征作为输入,训练下层模型,得到最终 stacking模型

  • 将测试特征如上作为输入经过两层模型预测,得到最终预测结果

  • 以上以2层stacking为例,有深层stacking

常用模型

基学习器

  • 交叉项、原始特征本身也可以视为线性基学习器学习到的特征
  • 具体模型参见 ml_specification/rec_system/ctr_stacking_models

GBDT

gbdt_in_stacking

  • 各树中各节点对应元学习器一维输入特征
  • 适合低维稠密通用特征,对输入特征分布没有要求

  • GBDT树根据熵增益(Gini系数增益)划分节点,每条路径 都代表一定区分能力

    • 以叶子节点(路径)作为特征,相当于自动进行特征 转换、组合、选择、离散化,得到高维组合特征
  • GDBT相较于单棵树、或RF更适合stacking

    • 单棵树表达能力弱,无法表达多个有区分性特征组合, 集成模型可将样本映射为多个特征
    • GBDT拟合残差意味着各树对样本区分度不同,对各特征 区别对待更合理

DNN

  • 适合普通稠密特征、embedding特征
  • 模型表达能力强,能抽取有良好分布数据的深层次特征,提高 模型准确性、泛化能力
  • 容易扩充其他类别特征,如:图片、文字

元学习器

  • LR

    • 适合低维稀疏特征,可对所有特征离散化以引入非线性
  • FM

    • 适合低维稀疏特征
    • LR基础上自动组合二阶交叉项
  • Linear:训练模型、对训练结果线性加权

?

Model Enhancement

Emsemble Learning

  • 集成学习:训练多个基模型,并将其组合起来,以达到更好的 预测能力、泛化能力、稳健性
  • base learner:基模型,基于独立样本建立的、一组 具有相同形式的模型中的一个
  • 组合预测模型:由基模型组合,即集成学习最终习得模型
  • 源于样本均值抽样分布思路

    • $var(\bar{X}) = \sigma^2 / n$
    • 基于独立样本,建立一组具有相同形式的基模型
    • 预测由这组模型共同参与
    • 组合预测模型稳健性更高,类似于样本均值抽样分布方差 更小
  • 关键在于

    • 获得多个独立样本的方法
    • 组合多个模型的方法

分类

  • homogenous ensemble:同源集成,基学习器属于同一类型

    • bagging
    • boosting
  • heterogenous ensemble:异源集成,基学习器不一定属于同 一类型

    • [genralization] stacking
Target Data parallel Classifier Aggregation
Bagging 减少方差 基于boostrap随机抽样,抗异常值、噪声 模型间并行 同源不相关基学习器,一般是树 分类:投票、回归:平均
Boosting 减少偏差 基于误分分步 模型间串行 同源若学习器 加权投票
Stacking 减少方差、偏差 K折交叉验证数据、基学习器输出 层内模型并行、层间串行 异质强学习器 元学习器
  • 以上都是指原始版本、主要用途

Boosting

提升方法:将弱可学习算法提升为强可学习算法的组合元算法

  • 属于加法模型:即基函数的线性组合
  • 各模型之间存在依赖关系

boosting

分类Boosting

  • 依次学习多个基分类器
  • 每个基分类器依之前分类结果调整权重
  • 堆叠多个分类器提高分类准确率
  • boosting通过组合多个误分率略好于随机猜测的分类器得到 误分率较小的分类器,因此boosting适合这两类问题

    • 个体之间难度有很大不同,boosting能够更加关注较难的 个体
    • 学习器对训练集敏感,boosting驱使学习器在趋同的、 “较难”的分布上学习,此时boosting就和bagging一样能够 使得模型更加稳健(但原理不同)
  • boosting能减小预测方差、偏差、过拟合

    • 直觉上,使用在不同的样本上训练的基学习器加权组合, 本身就能减小学习器的随机变动

    • 基于同样的理由,boosting同时也能减小偏差

    • 过拟合对集成学习有些时候有正面效果,其带来多样性, 使模型泛化能力更好,前提是样本两足够大,否则小样本 仍然无法提供多样性

回归Boosting

  • 依次训练多个基学习器
  • 每个基学习器以之前学习器拟合残差为目标
  • 堆叠多个学习器减少整体损失
  • boosting组合模型整体损失(结构化风险)

    • $l$:损失函数
    • $f_t$:基学习器
    • $\Omega(f_t)$:单个基学习器的复杂度罚
    • $N, M$:样本数目、学习器数目
  • 基学习器损失

最速下降法

使用线性函数拟合$l(y_i, \hat y_i^{(t)})$

  • $gi = \partial{\hat y} l(y_i, \hat y^{t-1})$
  • 一次函数没有极值
  • 将所有样本损失视为向量(学习器权重整体施加),则负梯度 方向损失下降最快,考虑使用负梯度作为伪残差

Newton法

使用二次函数拟合$l(y_i, \hat y_i^{(t)}$

  • $hi = \partial^2{\hat y} l(y_i, \hat y^{t-1})$
  • 二次函数本身有极值
  • 可以结合复杂度罚综合考虑,使得每个基学习器损失达到最小

Boosting&Bagging

  • 基分类器足够简单时,boosting表现均显著好于bagging

    • 仅靠单次决策(单个属性、属性组合)分类
  • 使用C4.5树作为基分类器时,boosting仍然具有优势,但是不够 有说服力

  • 结论来自于Experiments with a New Boosting Algorithm

Boosting&Bagging

  • 基分类器足够简单时,boosting表现均显著好于bagging

    • 仅靠单次决策(单个属性、属性组合)分类
  • 使用C4.5树作为基分类器时,boosting仍然具有优势,但是不够 有说服力

  • 结论来自于Experiments with a New Boosting Algorithm

原理

probably approximately correct:概率近似正确,在概率近似 正确学习的框架中

  • strongly learnable:强可学习,一个概念(类),如果存在 一个多项式的学习算法能够学习它,并且正确率很高,那么 就称为这个概念是强可学习的

  • weakly learnable:弱可学习,一个概念(类),如果存在 一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测 略好,称此概念为弱可学习的

  • Schapire证明:在PAC框架下强可学习和弱可学习是等价的

具体措施

  • 弱学习算法要比强学习算法更容易寻找,所以具体实施提升就是 需要解决的问题
  • 改变训练数据权值、概率分布的方法

    • 提高分类错误样本权值、降低分类正确样本权值
  • 将弱学习器组合成强学习器的方法

    • competeing
    • simple majority voting
    • weighted majority voting
    • confidence-based weighting

学习器组合方式

  • 很多模型无法直接组合,只能组合预测结果
  • simple majority voting/simple average:简单平均

    • $h_k$:第k个预测
  • weighted majority voting/weighted average:加权平均

    • $w_k$:第k个预测权重,对分类器可以是准确率
  • competing voting/largest:使用效果最优者

  • confidence based weighted:基于置信度加权

    • $e_k$:第k个模型损失

Meta Learning

元学习:自动学习关于关于机器学习的元数据的机器学习子领域

  • 元学习主要目标:使用学习到元数据解释,自动学习如何 flexible的解决学习问题,借此提升现有学习算法性能、 学习新的学习算法,即学习学习

  • 学习算法灵活性即可迁移性,非常重要

    • 学习算法往往基于某个具体、假象的数据集,有偏
    • 学习问题、学习算法有效性之间的关系没有完全明白,对 学习算法的应用有极大限制

要素

  • 元学习系统必须包含子学习系统
  • 学习经验通过提取元知识获得经验,元知识可以在先前单个 数据集,或不同的领域中获得
  • 学习bias(影响用于模型选择的前提)必须动态选择
    • declarative bias:声明性偏见,确定假设空间的形式 ,影响搜索空间的大小
      • 如:只允许线性模型
    • procedural bias:过程性偏见,确定模型的优先级
      • 如:简单模型更好

Recurrent Neural networks

RNN:self-referential RNN理论上可以通过反向传播学习到, 和反向传播完全不同的权值调整算法

Meta Reinforcement Learning

MetaRL:RL智能体目标是最大化奖励,其通过不断提升自己的学习 算法来加速获取奖励,这也涉及到自我指涉

Additional Model

加法模型:将模型视为多个基模型加和而来

  • $b(x;\theta_m)$:基函数
  • $\theta_m$:基函数的参数
  • $\beta_m$:基函数的系数
  • 则相应风险极小化策略

    • $L(y, f(x))$:损失函数

Forward Stagewise Algorithm

前向分步算法:从前往后,每步只学习加法模型中一个基函数 及其系数,逐步逼近优化目标函数,简化优化复杂度

  • 即每步只求解优化

    • $\hat f_m$:前m轮基函数预测值加和

步骤

  • 输入:训练数据集$T={(x_1,y_1), \cdots, (x_N,y_N)}$,损失 函数$L(y,f(x))$,基函数集${b(x;\theta)}$
  • 输出:加法模型$f(x)$
  • 初始化$f_0(x)=0$

  • 对$m=1,2,\cdots,M$,加法模型中M个基函数

    • 极小化损失函数得到参数$\beta_m, \theta_m$

    • 更新

  • 得到加法模型

AdaBoost&前向分步算法

AdaBoost(基分类器loss使用分类误差率)是前向分步算法的特例, 是由基本分类器组成的加法模型,损失函数是指数函数

  • 基函数为基本分类器时加法模型等价于AdaBoost的最终分类器 $f(x) = \sum_{m=1}^M \alpha_m G_m(x)$

  • 前向分步算法的损失函数为指数函数$L(y,f(x))=exp(-yf(x))$ 时,学习的具体操作等价于AdaBoost算法具体操作

    • 假设经过m-1轮迭代,前向分步算法已经得到

    • 经过第m迭代得到$\alpha_m, G_m(x), f_m(x)$,其中

      • $\bar w{m,i}=exp(-y_i f{m-1}(x_i))$:不依赖 $\alpha, G$
    • $\forall \alpha > 0$,使得损失最小应该有 (提出$\alpha$)

      此分类器$G_m^{*}$即为使得第m轮加权训练误差最小分类器 ,即AdaBoost算法的基本分类器

    • 又根据

      带入$G_m^{*}$,对$\alpha$求导置0,求得极小值为

      • $w_{m,i}, Z_M$同AdaBoost中

      即为AdaBoost中$\alpha_m$

    • 对权值更新有

      与AdaBoost权值更新只相差规范化因子$Z_M$

AdaBoost

AdaBoost

通过改变训练样本权重,学习多个分类器,并将分类器进行线性 组合,提高分类性能

  • 对离群点、奇异点敏感
  • 对过拟合不敏感

Boosting实现

  • 改变训练数据权值或概率分布:提高分类错误样本权值、降低 分类正确样本权值

  • 弱分类器组合:加权多数表决,即加大分类误差率小的弱分类器 权值,使其在表决中起更大作用;减小分类误差率大的弱分类器 权值,使其在表决中起更小作用

步骤

adaboost_steps

  • 输入:训练数据集$T={(x_1, y_1), \cdots, (x_N, y_N)}$, 弱分类器算法$G(x)$
    • $x_i \in \mathcal{X \subset R^n}$
    • $y_i \in \mathcal{Y} = {-1, +1 }$
  • 输出:最终分类器$G(x)$
  • 初始化训练数据权值分布: $D1=(w{11}, \cdots, w{1N}), w{1i}=\frac 1 N$

  • 对$m=1,2,\cdots,M$(即训练M个弱分类器)

    • 使用具有权值分布$D_m$的训练数据学习,得到基本 分类器

    • 计算$G_m(x)$在训练数据集上的分类误差率

    • 计算$G_m(x)$组合为最终分类器时权重

      • $\alpha_m$表示就简单分类器$G_m(x)$在最终分类器中 的重要性,随$e_m$减小而增加 (弱分类器保证$e_m \leq 1/2$)
    • 更新训练集权值分布

      • $Zm$:规范化因子,是第m轮调整后的权值之和,其 使得$D{m+1}$成为概率分布
      • 误分类样本权值相当于被放大 $e^{2\alpha_m} = \frac {e_m} {1 - e_m}$倍
  • 构建基本分类器线性组合

    得到最终分类器

    • 这里$\alpha_m$没有规范化,和不为1,规范化没有必要
    • $f(x)$符号决定分类预测结果,绝对值大小表示分类确信度
  • AdaBoost中分类器学习和之后的分类误差率“无关”,基分类器 学习算法中的loss不是分类误差率,可以是其他loss,只是需要 考虑训练数据的权值分布
    • 好像基学习器的loss就要是和集成部分调权的loss一致

      todo

    • 按权值分布有放回的抽样,在抽样集上进行训练
    • 各样本loss按权重加权,类似分类误差率中加权

训练误差边界

AdaBoost算法最终分类器的训练误差边界为

  • $G(x_i) \neq y_i$时,$y_if(x_i)<0$,所以 $exp(-y_i f(x_i)) \geq 1$,则不等式部分可证

  • AdaBoost训练误差边界性质的关键:权重调整与基本分类器权重 调整共系数(形式不完全一样)
  • 这也是AdaBoost权重调整设计的依据,方便给出误差上界

二分类训练误差边界

  • $\gamma_m = \frac 1 2 - e_m$
  • 由$\forall x \in [0, 0.5], e^{-x} > \sqrt{1-2x}$可得, $\sqrt{1-4\gamma_m^2} \leq exp(-2\gamma_m^2)$

  • 二分类AdaBoost误差边界性质的关键:$\alpha$的取值,也是 前向分步算法(损失函数)要求
  • 若存$\gamma > 0$,对所有m有$\gamma_m \geq \gamma$,则 即AdaBoost的训练误差是指数下降
  • 分类器下界$\gamma$可以未知,AdaBoost能适应弱分类器各自 训练误差率,所以称为adptive

Adaboost.M1

Adaboost.M1是原版AdaBoost的多分类升级版,基本思想同Adaboost

Boosting实现

  • 基分类器组合方式

    • 仍然是加权投票,且投票权重同Adaboost
    • 出于多分类考虑,没有使用sign符号函数
  • 改变训练数据权值或概率分布:和Adaboost形式稍有不同,但 相对的错误分类样本提升比率完全相同

    • 被上个分类器错误分类样本,权值保持不变
    • 被上个分类器正确分类样本,权值缩小比例是Adaboost平方

步骤

  • 输入

    • 训练集:$T={x_i, y_i}, i=1,\cdots,N; y_i \in C, C={c_1, \cdots, c_m}$
    • 训练轮数:T
    • 弱学习器:I
  • 输出:提升分类器

    • $h_t, h_t(x) \in C$:分类器
    • $\beta_t$:分类器权重

adaboostm1_steps

误分率上界

  • 对弱学习算法产生的伪损失$\epsilon1,\cdots,\epsilon_t$, 记$\gamma_t = 1/2 \epsilon_t$,最终分类器$h{fin}$误分率 上界有

特点

Adaboost.M1和Adaboost基本上没有区别

  • 类别数目为2的Adaboost.M1就是Adaboost
  • 同样无法处理对误分率高于0.5的情况,甚至在多分类场合, 误分率小于0.5更加难以满足
  • 理论误分率上界和Adaboost相同

Adaboost.M2

AdaboostM2是AdaboostM1的进阶版,更多的利用了基分类器信息

  • 要求基学习器能够输出更多信息:输出对样本分别属于各类别 的置信度向量,而不仅仅是最终标签
  • 要求基分类器更加精细衡量错误:使用伪损失代替误分率 作为损失函数

Psuedo-Loss

  • $D$:权重分布(行和为1,但不满足列和为1)
    • $D_{i,y}$:个体$x_i$中错误标签$y$的权重,代表从个体 $x_i$中识别出错误标签$y$的重要性
  • $B = {(i, y)|y \neq y_i, i=1,2,\cdots,N }$
  • $w$:个体各错误标签权重边际分布
  • $h(x, y)$:模型$h$预测样本$x$为$y$的置信度
    • $h(x_i,y_i)$:预测正确的置信度
    • $h(x_i,y), y \neq y_i$:预测$x_i$为错误分类$y$置信度
  • 伪损失函数同时考虑了样本和标签的权重分布
  • 通过改变此分布,能够更明确的关注难以预测的个体标签, 而不仅仅个体

Boosting实现

  • 改变数据权值或者概率分布

    • 使用psuedo-loss替代误分率,以此为导向改变权值
    • 对多分类每个错误分类概率分别计算错误占比,在此基础上 分别计算
  • 基分类器组合方式:同Adaboost.M1

步骤

adaboostm2_steps

训练误差上界

  • 对弱学习算法产生的伪损失$\epsilon1,\cdots,\epsilon_t$, 记$\gamma_t = 1/2 \epsilon_t$,最终分类器$h{fin}$误分率 上界有

特点

  • 基于伪损失的Adaboost.M2能够提升稍微好于随机预测的分类器

  • Adaboosting.M2能够较好的解决基分类器对噪声的敏感性,但是 仍然距离理论最优Bayes Error有较大差距,额外误差主要 来自于

    • 训练数据
    • 过拟合
    • 泛化能力
  • 控制权值可以有效的提升算法,减小最小训练误差、过拟合 、泛化能力

    • 如对权值使用原始样本比例作为先验加权
  • 其分类结果不差于AdaBoost.M1(在某些基分类器、数据集下)

Bagging

Bagging

baggingbootstrap aggregating,每个分类器随机从原样本 中做有放回的随机抽样,在抽样结果上训练基模型,最后根据 多个基模型的预测结果产生最终结果

  • 核心为bootstrap重抽样自举

步骤

  • 建模阶段:通过boostrap技术获得k个自举样本 $S_1, S_2,…, S_K$,以其为基础建立k个相同类型模型 $T_1, T_2,…, T_K$

  • 预测阶段:组合K个预测模型

    • 分类问题:K个预测模型“投票”
    • 回归问题:K个预测模型平均值

模型性质

  • 相较于单个基学习器,Bagging的优势
    • 分类Bagging几乎是最优的贝叶斯分类器
    • 回归Bagging可以通过降低方差(主要)降低均方误差

预测误差

总有部分观测未参与建模,预测误差估计偏乐观

  • OOB预测误差:out of bag,基于袋外观测的预测误差, 对每个模型,使用没有参与建立模型的样本进行预测,计算预测 误差

  • OOB观测比率:样本总量n较大时有

    • 每次训练样本比率小于10交叉验证的90%

Random Forest

随机森林:随机建立多个有较高预测精度、弱相关(甚至不相关) 的决策树(基础学习器),多棵决策树共同对新观测做预测

  • RF是Bagging的扩展变体,在以决策树为基学习器构建Bagging 集成模型的基础上,在训练过程中引入了随机特征选择

  • 适合场景

    • 数据维度相对较低、同时对准确率有要求
    • 无需很多参数调整即可达到不错的效果

步骤

  • 样本随机:Bootstrap自举样本

  • 输入属性随机:对第i棵决策树通过随机方式选取K个输入变量 构成候选变量子集$\Theta_I$

    • Forest-Random Input:随机选择$k=log_2P+1或k=\sqrt P$ 个变量

    • Forest-Random Combination

      • 随机选择L个输入变量x
      • 生成L个服从均匀分布的随机数$\alpha$
      • 做线性组合 $vj = \sum{i=1}^L \alpha_i x_i, \alpha_i \in [-1, 1]$
      • 得到k个由新变量v组成的输入变量子集$\Theta_i$
  • 在候选变量子集中选择最优变量构建决策树

    • 生成决策树时不需要剪枝
  • 重复以上步骤构建k棵决策树,用一定集成策略组合多个决策树

    • 简单平均/随机森林投票

优点

  • 样本抽样、属性抽样引入随机性

    • 基学习器估计误差较大,但是组合模型偏差被修正
    • 不容易发生过拟合、对随机波动稳健性较好
    • 一定程度上避免贪心算法带来的局部最优局限
  • 数据兼容性

    • 能够方便处理高维数据,“不用做特征选择”
    • 能处理分类型、连续型数据
  • 训练速度快、容易实现并行

  • 其他

    • 可以得到变量重要性排序
    • 启发式操作
    • 优化操作

缺点

  • 决策树数量过多时,训练需要资源多
  • 模型解释能力差,有点黑盒模型

Boosting

Gredient Boosting

GB:(利用)梯度提升,将提升问题视为优化问题,前向分步算法 利用最速下降思想实现

  • 一阶展开拟合损失函数,沿负梯度方向迭代更新

    • 损失函数中,模型的样本预测值$f(x)$是因变量
    • 即$f(x)$应该沿着损失函数负梯度方向变化
    • 即下个基学习器应该以负梯度方向作为优化目标,即负梯度 作为伪残差
    • 类似复合函数求导
  • 对基学习器预测值求解最优加权系数

    • 最速下降法中求解更新步长体现
    • 前向分布算法中求解基学习器权重

损失函数

基学习器拟合目标:损失函数的负梯度在当前模型的值

平方损失

平方损失:$L(y, f(x)) = \frac 1 2 (y - f(x))^2$(回归)

  • 第m-1个基学习器伪残差为

    • $N$:样本数量
  • 第m个基学习器为

  • 第m轮学习器组合为

    • $\alpha_m$:学习率,留给之后基模型学习空间
    • 这里只是形式上表示模型叠加,实际上树模型等不可加, 应该是模型预测结果叠加

指数损失

指数损失:$L(y, f(x)) = e^{-y f(x)}$(分类)

  • 第m-1个基学习器伪残差

  • 基学习器、权重为

  • 第m轮学习器组合为

步骤

  • 输入:训练数据集$T={(x_1, y_1), \cdots, (x_N, y_N)}$, 损失函数$L(y, f(x))$
    • $x_i \in \mathcal{X \subset R^n}$
    • $y_i \in \mathcal{Y} = {-1, +1 }$
  • 输出:回归树$\hat f(x)$
  • 初始化模型

  • 对$m=1,2,\cdots,M$(即训练M个若分类器)

    • 计算伪残差

    • 基于${(x_i, r_i^{(t)})}$生成基学习器$h_t(x)$

    • 计算最优系数

    • 更新预测值

  • 得到最终模型

Gradient Boosted Desicion Tree

GBDT:梯度提升树,以回归树为基学习器的梯度提升方法

  • GBDT会累加所有树的结果,本质上是回归模型(毕竟梯度)

    • 所以一般使用CART回归树做基学习器
    • 当然可以实现分类效果
  • 损失函数为平方损失(毕竟回归),则相应伪损失/残差

特点

  • 准确率、效率相较于RF有一定提升
  • 能够灵活的处理多类型数据
  • Boosting类算法固有的基学习器之间存在依赖,难以并行训练 数据,比较可行的并行方案是在每轮选取最优特征切分时,并行 处理特征

XGBoost

Extreme Gradient Boost/Newton Boosting:前向分步算法利用 Newton法思想实现

  • 二阶展开拟合损失函数

    • 损失函数中,模型的样本预测值$\hat y_i$是因变量
    • 将损失函数对$\hat y_i$二阶展开拟合
    • 求解使得损失函数最小参数
  • 对基学习器预测值求解最优加权系数

    • 阻尼Newton法求解更新步长体现
    • 前向分布算法中求解基学习器权重
    • 削弱单个基学习器影响,让后续基学习器有更大学习空间

损失函数

  • 第t个基分类器损失函数

    • $f_t$:第t个基学习器
    • $f_t(x_i)$:第t个基学习器对样本$x_i$的取值
    • $gi = \partial{\hat y} l(y_i, \hat y^{t-1})$
    • $hi = \partial^2{\hat y} l(y_i, \hat y^{t-1})$
    • $\Omega(f_t)$:单个基学习器的复杂度罚
    • $T_t$:第t个基学习器参数数量,即$L_0$罚
      • 线性回归基学习器:回归系数数量
      • 回归树基学习器:叶子节点数目
    • $\gamma$:基学习器$L_0$罚系数,模型复杂度惩罚系数
    • $w_j = f_t$:第t个基学习器参数值,即$L_2$罚
      • 线性回归基学习器:回归系数值
      • 回归树基学习器:叶子节点
    • $\lambda$:基学习器$L_2$罚系数,模型贡献惩罚系数
    • $\approx$:由二阶泰勒展开近似
  • 对损失函数进行二阶泰勒展开(类似牛顿法)拟合原损失函数, 同时利用一阶、二阶导数求解下个迭代点

  • 正则项以控制模型复杂度

    • 降低模型估计误差,避免过拟合
    • $L_2$正则项也控制基学习器的学习量,给后续学习器留下 学习空间

树基学习器

XGBoost Tree:以回归树为基学习器的XGBoost模型

  • 模型结构说明

    • 基学习器类型:CART
    • 叶子节点取值作惩罚:各叶子节点取值差别不应过大,否则 说明模型不稳定,稍微改变输入值即导致输出剧烈变化
    • 树复杂度惩罚:叶子结点数量
  • XGBoost最终损失(结构风险)有

    • $N, M$:样本量、基学习器数量
    • $\hat y_i$:样本$i$最终预测结果

损失函数

  • 以树作基学习器时,第$t$基学习器损失函数为

    • $f_t, T_t$:第t棵回归树、树叶子节点
    • $f_t(x_i)$:第t棵回归树对样本$x_i$的预测得分
    • $w_j^{(t)} = f_t(x)$:第t棵树中第j叶子节点预测得分
    • $gi = \partial{\hat y} l(y_i, \hat y^{t-1})$
    • $hi = \partial^2{\hat y} l(y_i, \hat y^{t-1})$
    • $I_j$:第j个叶结点集合
    • $Gj = \sum{i \in I_j} g_i$
    • $Hj = \sum{i \in I_j} h_i$
    • 对回归树,正则项中含有$(w_j^{(t)})^2$作为惩罚,能够 和损失函数二阶导合并,不影响计算

    • 模型复杂度惩罚项惩罚项是针对树的,定义在叶子节点上, 而平方损失是定义在样本上,合并时将其改写

  • 第t棵树的整体损失等于其各叶子结点损失加和,且 各叶子结点取值之间独立

    • 则第t棵树各叶子结点使得损失最小的最优取值如下 ($G_j, H_j$是之前所有树的预测得分和的梯度取值,在 当前整棵树的构建中是定值,所以节点包含样本确定后, 最优取值即可确定)

    • 整棵树结构分数(最小损失)带入即可得

    • 则在结点分裂为新节点时,树损失变化量为

      • $I_L, I_R$:结点分裂出的左、右结点
  • 则最后应根据树损失变化量确定分裂节点、完成树的分裂,精确 贪心分裂算法如下

    !xgb_exact_greedy_algorithm_for_split_finding

    • 对于连续型特征需遍历所有可能切分点

      • 对特征排序
      • 遍历数据,计算上式给出的梯度统计量、损失变化
    • 不适合数据量非常大、或分布式场景

模型细节

  • shrinkage:对新学习的树使用系数$\eta$收缩权重

    • 类似SGD中学习率,降低单棵树的影响,给后续基模型留下 学习空间
  • column subsampling:列抽样

    • 效果较传统的行抽样防止过拟合效果更好 (XGB也支持行抽样)
    • 加速计算速度

XGB树分裂算法

  • 线性回归作为基学习器时,XGB相当于L0、L2正则化的 Logistic回归、线性回归

近似分割算法

XGB近似分割算法:根据特征分布选取分位数作为候选集,将连续 特征映射至候选点划分桶中,统计其中梯度值、计算最优分割点

!xgb_approximate_algorithm_for_split_finding

  • 全局算法:在树构建初始阶段即计算出所有候选分割点,之后 所有构建过程均使用同样候选分割点

    • 每棵树只需计算一次分割点的,步骤少
    • 需要计算更多候选节点才能保证精度
  • 局部算法:每次分裂都需要重新计算候选分割点

    • 计算步骤多
    • 总的需要计算的候选节点更少
    • 适合构建较深的树
  • 分位点采样算法参见 ml_model/model_enhancement/gradient_boost

Sparsity-aware Split Finding

稀疏特点分裂算法:为每个树节点指定默认分裂方向,缺失值对应 样本归为该方向

xgb_sparsity_aware_split_finding

  • 仅处理非缺失值,算法复杂度和随无缺失数据集大小线性增加, 减少计算量

  • 按照升许、降序分别扫描样本两轮,以便将缺失值样本分别归为 两子节点,确定最优默认分裂方向

    xgb_sparsity_aware_split_finding_example

XGB系统设计

Column Block for Parallel Learning

  • 建树过程中最耗时的部分为寻找最优切分点,而其中最耗时部分 为数据排序

XGB对每列使用block结构存储数据

  • 每列block内数据为CSC压缩格式

    • 特征排序一次,之后所有树构建可以复用(忽略缺失值)
    • 存储样本索引,以便计算样本梯度
    • 方便并行访问、处理所有列,寻找分裂点
  • 精确贪心算法:将所有数据(某特征)放在同一block中

    • 可同时对所有叶子分裂点进行计算
    • 一次扫描即可得到所有叶子节点的分割特征点候选者统计 数据
  • 近似算法:可以使用多个block、分布式存储数据子集

    • 对local策略提升更大,因为local策略需要多次生成分位点 候选集

Cache-aware Access

  • 列block结构通过索引获取数据、计算梯度,会导致非连续内存 访问,降低CPU cache命中率
  • 精确贪心算法:使用cache-aware prefetching

    • 对每个线程分配连续缓冲区,读取梯度信息存储其中,再 统计梯度信息
    • 对样本数量较大时更有效
  • 近似算法:合理设置block大小为block中最多的样本数

    • 过大容易导致命中率低、过小导致并行化效率不高

Blocks for Out-of-core Computation

  • 数据量过大不能全部存放在主存时,将数据划分为多个block 存放在磁盘上,使用独立线程将block读入主存 (这个是指数据划分为块存储、读取,不是列block)

  • 磁盘IO提升

    • block compression:将block按列压缩,读取后使用额外 线程解压
    • block sharding:将数据分配至不同磁盘,分别使用线程 读取至内存缓冲区

分位点采样算法—XGB

Quantile Sketch

样本点权重

  • 根据已经建立的$t-1$棵树可以得到数据集在已有模型上误差, 采样时根据误差对样本分配权重,对误差大样本采样粒度更大
  • 将树按样本点计算损失改写如下

  • 则对各样本,其损失为$f_t(x_i) - \frac {g_i} {h_i}$ 平方和$h_i$乘积,考虑到$f_t(x_i)$为样本点在当前树预测 得分,则可以

    • 将样本点损失视为“二次损失”
    • 将$\frac {g_i} {h_i}$视为样本点“当前标签”
    • 相应将$h_i$视为样本点权重
  • 样本权重取值示例

    • 二次损失:$h_i$总为2,相当于不带权
    • 交叉熵损失:$h_i=\hat y(1-\hat y)$为二次函数, 则$\hat y$接近0.5时权重取值大,此时该样本预测值 也确实不准确,符合预期

Rank函数

  • 记集合$D={(x_1, h_1), \cdots, (x_n, h_n)}$

  • 定义rank函数$r_D: R \rightarrow [0, +\infty)$如下

    • 即集合$D$中权重分布中给定取值分位数
    • 即取值小于给定值样本加权占比,可视为加权秩

分位点抽样序列

  • 分位点抽样即为从集合$D$特征值中抽样,找到升序点序列 $S = {s_1, \cdots, s_l}$满足

    • $\epsilon$:采样率,序列长度$l = 1/\epsilon$
    • $s1 = \min{i} x_i$:特征最小值
    • $sl = \max{i} x_i$:特征最大值

    • 各样本等权分位点抽样已有成熟方法,加权分位点抽样方法 为XGB创新,如下

Weighted Quantile Sketch

Formalization

  • 记$Dk={(x{1,k}, h1), \cdots, (x{n,k}, h_n)}$为各 训练样本第$k$维特征、对应二阶导数

    • 考虑到数据点可能具有相同$x, h$取值,$D_k$为可能包含 重复值的multi-set
  • 对于多重集$D$,额外定义两个rank函数

    定义相应权重函数为

  • 多重集$D$上全部权重和定义为

Quantile Summary of Weighted Data

  • 定义加权数据上的quantile summary为 $Q(D)=(S, \tilde r_D^{+}, \tilde r_D^{-}, \tilde w_D)$

    • $S$为$D$中特征取值抽样升序序列,其最小、最大值分别 为$D$中特征最小、最大值

    • $\tilde r_D^{+}, \tilde r_D^{-}, \tilde w_D$为定义在 $S$上的函数,满足

  • $Q(D)$满足如下条件时,称为 $\epsilon$-approximate quantile summary

    • 即对任意$y$的秩估计误差在$\epslion$之内
  • $\phi-quantile$:秩位于$\phi * N$的元素(一般向下取整)
  • $\epsilon-\phi-quantile$:秩位于区间 $[(\phi-\epsilon)N, (\phi+\epsilon)N]$的元素

构建$\epsilon$-Approximate Qunatile Summary

  • 初始化:在小规模数据集 $D={(x_1,h_1), \cdots, (x_n,h_n)}$上构建初始 初始quantile summary $Q(D)=(S, \tilde r_D^{+}, \tilde r_D^{-}, \tilde w_D)$ 满足

    • 即初始化$Q(D)$为0-approximate summary
  • merge operation:记 $Q(D1)=(S_1, \tilde r{D1}^{+}, \tilde r{D1}^{-}, \tilde w{D1})$、 $Q(D_2)=(S_2, \tilde r{D2}^{+}, \tilde r{D2}^{-}, \tilde w{D_2})$、 $D = D_1 \cup D_2$,则归并后的 $Q(D)=(S, \tilde r_D^{+}, \tilde r_D^{-}, \tilde w_D)$ 定义为

  • prune operation:从给定 $Q(D)=(S, \tilde r_D^{+}, \tilde r_D^{-}, \tilde w_D)$, (其中$S = {x_1, \cdots, x_k }$),构建新的summary $\acute Q(D)=(\acute S, \tilde r_D^{+}, \tilde r_D^{-}, \tilde w_D)$

    • 仅定义域从$S$按如下操作抽取 $\acute S={\acute x1, \cdots, \acute x{b+1}}$

    • $g(Q, d)$为查询函数,对给定quantile summary $Q$、 秩$d$返回秩最接近$d$的元素

      xgb_weighted_quantile_sketch_query_function