原创:程祥国
1. XGBoost概述
XGBoost是陈天奇提出的一个端对端的梯度提升树系统,该算法在GBDT【关于GBDT这里不再展开叙述,可以参考李航老师统计学习方法一书中对该算法的讲述】的基础之上,在算法层面和系统设计层面都做了一些创新性的改进,可以把XGBoost看作是GBDT更好更快的实现。XGBoost在许多机器学习以及数据挖掘的任务中表现惊艳,2015年,kaggle竞赛平台上发布了29个挑战获胜的解决方案,其中17个解决方案用了XGBoost。由于XGBoost在实际任务中的良好表现,因此搞清XGBoost的实现细节对于在实践中应用XGBoost是非常有帮助的。因此本文基于陈天奇的论文XGBoost: A Scalable Tree Boosting System,详细阐述XGBoost的各种细节。
上述我们提到XGBoost在算法层面和系统设计层面都做了一些创新性的改进,我们首先将XGBoost的创新做一个总结:
算法层面
(1)在GBDT目标函数的基础上,在对优化目标求解的时候使用了二阶导数的信息,因此会使优化目标的定义更加精确,训练速度会更快;此外,XGBoost在优化目标函数中加入了正则项,这会限制模型的复杂度,防止过拟合的发生。
(2)提出了一种处理缺失值的算法,XGBoost能够自动对缺失值进行处理
(3)在树生成选择特征划分节点的时候,通过加权分位数草图算法,预先对每个特征建立候选的划分节点,不在使用原先的贪婪算法(遍历每个特征所有取值),从而大大加快训练速度
系统设计层面
(1)对训练的每个特征排序并且以块(block)的结构存储在内存中,方便后续训练迭代重复使用,减少计算量。对于不同的特征的特征划分点,XGBoost分别在不同的线程中并行选择分裂的最大增益,从而实现了并行训练。
(2)提出了一种有效的缓存感知块结构用于树模型的核外学习
下面我们将分别对上述5项进行分析。
2. 模型层面
2.1 优化目标函数
假设数据集D有n个样本m个特征: D = ( x i , y i ) ( ∣ D ∣ = n , x i ϵ R m , y i ϵ R ) D={(x_i,y_i)}(|D|=n,x_i \epsilon R^m,y_i \epsilon R) D=(xi,yi)(∣D∣=n,xiϵRm,yiϵR),树集成算法使用加法模型对K个基学习器进行合成,作为最终的预测输出。如图1所示。
图1:树集成模型,最终的预测结果为两棵树的和
为了使上述预测的结果尽可能的接近实际值,我们首先定义模型的优化目标函数,优化目标函数如下所示:
L ( ϕ ) = ∑ i l ( y ‾ i , y i ) + ∑ Ω ( f k ) (1.1) L(\phi) = \sum_{i}l(\overline y_i,y_i)+\sum\Omega (f_k) \tag{1.1} L(ϕ)=i∑l(yi,yi)+∑Ω(fk)(1.1)
∑ Ω ( f k ) = γ T + 1 2 λ ∣ ∣ ω ∣ ∣ 2 (1.2) \sum\Omega (f_k)=\gamma T +\frac{1}{2}\lambda||\omega||^2 \tag{1.2} ∑Ω(fk)=γT+21λ∣∣ω∣∣2(1.2)
这里 L L L是一个可微的凸损失函数,它表示预测 y ‾ i \overline y_i yi和目标 y i y_i yi之间的差值。T是每棵树叶子的数量, ω \omega ω表示模型对叶子节点的预测数值。第二项$\sum\Omega (f_k) 是 惩 罚 项 , 限 制 回 归 树 模 型 的 复 杂 度 。 正 则 化 项 有 助 于 使 最 终 学 习 到 的 权 值 更 加 平 滑 , 避 免 过 拟 合 。 直 观 地 说 , 带 有 正 则 化 的 目 标 函 数 倾 向 于 选 择 简 单 的 预 测 模 型 。 当 第 是惩罚项,限制回归树模型的复杂度。正则化项有助于使最终学习到的权值更加平滑,避免过拟合。直观地说,带有正则化的目标函数倾向于选择简单的预测模型。当第 是惩罚项,限制回归树模型的复杂度。正则化项有助于使最终学习到的权值更加平滑,避免过拟合。直观地说,带有正则化的目标函数倾向于选择简单的预测模型。当第t$颗树生成的时候,我们可以将公式1.1变成如下形式:
L t = ∑ i n l ( y ‾ i t − 1 + f t ( x i ) , y i ) + L^t = \sum_{i}^{n}l(\overline y^{t-1}_i+f_t(x_i),y_i)+ Lt=i∑nl(yit−1+ft(xi),yi)+
γ J + 1 2 λ ∑ j = 1 J ω t j 2 (1.3) \gamma J +\frac{1}{2}\lambda \sum_{j=1}^{J}\omega_{tj}^2 \tag{1.3} γJ+21λj=1∑Jωtj2(1.3)
在公式1.3中, y ‾ i t − 1 \overline y^{t-1}_i yit−1是前