XGBoost的全称是 eXtremeGradient Boosting,2014年2月诞生的专注于梯度提升算法的机器学习函数库,作者为华盛顿大学研究机器学习的大牛——陈天奇。他在研究中深深的体会到现有库的计算速度和精度问题,为此而着手搭建完成 xgboost 项目。xgboost问世后,因其优良的学习效果以及高效的训练速度而获得广泛的关注,并在各种算法大赛上大放光彩。
原始论文:https://arxiv.org/pdf/1603.02754.pdf
1.【 基本概念】
监督学习
XGBoost 主要是用来解决有监督学习问题,此类问题利用包含多个特征的训练数据
模型与参数
在监督学习中模型(model)表示一种数学函数,通过给定
在监督学习中参数(parameters)是待定的部分,我们需要从数据中进行学习得到。在线性回归问题中,参数用
目标函数:训练误差 + 正则化
根据对
这里需要强调的是,目标函数必须包含两个部分:训练误差和正则化。
其中,L表示训练误差函数,
另外针对逻辑回归,比较常见的损失函数为Logistic函数:
正则项是用来控制模型的复杂度,以防止过拟合(overfitting),XGBoost的正则项稍后解释。
CART回归树
CART中的一个例子,一类分类器用来辨别某人是否喜欢计算机游戏。
我们把家庭中的成员分到了不同的叶子节点,同时每个叶子节点上都有一个分数。CART与决策树相比,细微差别在于CART的叶子节点仅包含判断分数。在CART中,相比较于分类结果,每个叶子节点的分数给我们以更多的解释。
组合树模型
通常情况下,在实践中往往一棵树是不够用的。这个时候往往需要把多棵树的预测结果综合起来,这就是所谓的组合树模型(ensemble)。
上面就是由两棵树组成的组合树的例子。每棵树上的分数简单相加就得到了最终的分数。用数学式子可以表达如下:
现在问题来了,随机森林对应的模型是什么呢?对了,也是组合树模型。所以在模型的表述上,随机森林和提升树是一样的,他们俩的区别只是在于如何训练。
需要指出的是: 这样的模型很难用SGD方法训练,难以同时获得K棵回归树
2. 【XGBoost】
基本思路
假设我们有如下的目标函数(需要切记目标函数必须包含损失函数及正则项)
增量训练 方式(Additive Training)
首先我们需要问的是,这些树的参数是什么?我们会发现,我们所要学习的就是这些f i方法,每个方法中定义树的结构以及叶子节点的分数。这比传统最优化问题要更难,传统最优化问题我们可以通过梯度来解决。而且我们无法在一次训练所有的树。相反,我们用增量(additive)的方式:每一步我们都是在前一步的基础上增加一棵树,而新增的这棵树是为修复上一颗树的不足。我们把第t步的预测用
其中,在第t步,可以把前面的模型当作已知值,只关心如何获得f t即可
更具体的,在每一步中如何确定哪棵树是我们需要的呢?一个很自然的想法就是,增加这棵树有助于最小化我们的目标函数:
注意: constant代表第t步之前的t-1的已知模型的复杂度,视为常数。
此时,第t轮的预测:
如果,我们用MSE(均方差)作为损失函数 L,优化目标就变成了:
但是对于其他形式的损失函数 L (XGBoost支持自定义损失函数),就很难推导出这么友好的损失函数式子了。那么针对这种情形,我们就用泰勒展开公式:(将L(.)进行泰勒展开,
其中
优化目标函数:
删除常数项,那么在
式子只需要考虑
模型的复杂性度量方法
回归树的重定义:
我们将CART回归树定义为“由叶子节点的值组成的向量
叶子索引映射函数
则回归树可以定义为:
例子:回归树的表示:
在XGBoost中,我们用如下公式定义回归树的复杂度:
XGBoost如何求解优化目标?
现在,XGBoost的优化目标Eq.(1)中的除
XGBoost采用和大多数决策树一致的方法,通过定义某种评价指标,从所有可能的候选树中,选择指标最优者作为第t 轮迭代的树
把上面的一些定义代入目标Eq.(1),我们写出第
这里
同时我们令
在上述式子中,每一个
上述第二个式子计算的是回归树
如果上面的式子看着比较复杂的话,那么根据上面的这幅图来看如何计算这些分数,就会显得更直观些。一旦树的结构(q, T) 已知的话,我们只需要通过计算每个节点上的
初步的XGBoost算法——求解第t轮迭代的最优回归树
因为需要遍历的情况实在是太多了。所以我们来寻求一种贪婪的解法
注意,最后一项
怎么找到最优分割(参考CART树)
具体步骤:
寻找一棵最优回归树的复杂度
关于树的停止生成和修剪方法:
(待续...)
参考文献:
- 陈运文:XGBoost原理解析
2. https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf