从决策树、随机森林、GBDT最终到XGBoost,每个热门算法都不是孤立存在的,而是基于一系列算法的改进与优化。决策树算法简单易懂可解释性强,但是过拟合风险很大,应用场景有限;随机森林采用Bagging采样+随机属性选择+模型集成的方法解决决策树易过拟合的风险,但是牺牲了可解释性;GBDT在随机森林的基础上融合boosting的思想建立树与树之间的联系,使森林不再是互相独立的树存在,进而成为一种有序集体决策体系;XGBoost在GBDT的基础上更进一步,将每轮迭代的目标函数中加入正则项,进一步降低过拟合的风险。相对于GBDT启发式的迭代原则,XGBoost的优化准则完全基于目标函数的最小化推导,并采用了二阶泰勒展开,使自定义损失函数成为可能。除此之外,XGBoost同样继承了随机采样、随机属性选择、学习率等算法实用技巧,与此同时实现了属性计算级别的并行化。可以说,XGBoost是一种集大成的机器学习算法。
几个误区:
在目标函数中增加正则项是XGBoost的一项比较重要的改进,因为GBDT中的正则化主要依靠一些工程措施,局限性与可操作性较差。XGBoost则直接将正则项加入到目标函数中,这样一来,每一轮的迭代均在数学层面进行了正则化,效果与可操作性大大提升。
XGB是一个具有可扩展性的树提升算法机器学习系统,它的可扩展性体现在以下四个方面:
模型的scalability,弱分类器除cart外也支持lr和linear
策略的scalability,可以支持不同的loss functions,来优化效果,只要一、二阶可导即可
算法的scalability,做了很多细节工作,来优化参数学习和迭代速度,特征压缩技,bagging学习中的特征抽样,特征选择与阈值分裂的分位方法和并行方法等
数据的scalability,因为3种的优化,支持B级别的快速训练和建模;同时也因为加上了正则项和随机特征抽样,减少了过拟合问题
1. Xgboost的算法的流程?
(1)引入
回归树:每个叶子节点都有一个分数,预测的结果就是所有树的分数之和
输入:age,gender,occupation,...
输出:判断一个人是否喜欢打游戏
xgboost的基本思想就是一种提升的思想,后一个模型在前一个模型的基础上再进行预测,弥补前一个模型做的不好的地方。例如真实值是100,第一颗树的预测值是95,还有5的误差,然后我们再用第二颗树再预测,预测出来3这样两颗树的综合结果就是98,然后依次类推。
给定数据集,n个实例,m个特征:
树集成模型(下图所示)使用K个函数的累加和来预测输出;
这里有几个疑问:
每一棵树的分支依据是如何确定的?(比如先分age,再分性别) 【贪心:从所有特征中找最好的】
每一棵树的分支分到哪里为止?(比如is male?下面还要不要分支?)【可以根据公式判断是否要继续分裂,见(3)节公式4】
每棵树的叶子节点的权重分值是如何确定的?(为什么有的是2,有的是0.9,有的是-1)【对于固定的树结构,可以根据(3)节公式2得到叶子的最优权重】
树的棵数是如何确定的,多少棵树是最合适的?
(2)目标函数
目标函数:
这里l是一个可微的凸损失函数,测量预测值和目标值的不同。
是k颗树的正则项,用于抑制模型的复杂度防止过拟合。当正则项的参数是0时,上述目标函数就是一个传统的梯度树提升模型。
左上角描绘的是用户随着时间的变化对某话题的感兴趣程度的变化,如果使用step function来建模,可以看到右上角的模型基本上拟合到每一个数据点,然而也可以看到它太复杂了,也就是模型复杂度太高;而对于左下角模型,它虽然比较简单,但是很多数据都没有拟合到;最后看看右下角的模型,它简单,而且基本拟合到所有数据点。因此我们说右下角的模型是最好的,对于一个机器学习的模型的通用原则是:简单并且准确。模型往往需要在简单和准确之中做一个折中,这种折中也成为偏差-方差的折中(bias-variance tradeoff)。
(3)梯度树提升
上述目标函数的参数本身是函数,这样使用传统的优化方法是不能优化到最优值的。相反,模型的训练时采用加法的形式来训练的,形式上,使用 作为第i个