一、泰勒公式
- 泰勒公式:一个用函数在某点的信息描述其附近取值的公式,其初衷是用多项式来近似表示函数在某点周围的情况
- 比如:
e
x
e^x
ex在x=0处的展开:
e
x
=
∑
n
=
0
∞
x
n
n
!
e^x = \sum_{n=0}^{\infty} \frac{x^n}{n!}
ex=∑n=0∞n!xn
实际函数值和多项式的偏差称为泰勒公式的余项 - 对于一般的函数,泰勒公式的系数的选择依赖于函数在一点的各阶导数值,函数f(x)在x0处的基本形式如下:
二、CART
- 分类回归树CART:假设要判断一个人是否喜欢电脑游戏,输入为年龄,性别职业等特征。可以得到如下的回归树:
- 单棵CART拟合能力有限,通过之前的集成学习,可以使用多棵树。比如下图用两棵树一起进行预测,样本的预测结果就是两棵树的和:
“一起预测”的学习方法又分为随机森林和提升树
多棵树即我们的模型: y ^ i = ∑ t = 1 K f t ( x i ) , f t ∈ F \hat y_i = \sum_{t=1}^Kf_t(x_i),\ \ f_t \in\mathcal{F} y^i=t=1∑Kft(xi), ft∈F
假设有K棵树,f是回归树,而F对应了所有回归树组成的函数空间
三、算法原理
- 算法思想
不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值。
- 算法原理
参考:XGBoost原理
四、损失函数(目标函数)
每一轮训练一棵树,都是为了使得损失函数能够极小化,也就是每一棵树训练要达到的目标。XGBoost的损失函数(目标函数)与GBDT不同,它不仅仅是衡量了模型的拟合误差,还增加了正则化项,即对每棵树树复杂度的惩罚项,来限制树的复杂度,防止过拟合
如何学习模型?定义目标函数,然后去优化目标函数!
五、分裂节点算法
六、正则化
XGBoost有几种防止过拟合的正则化方法:
- 在目标函数中,不仅包含了模型的拟合误差函数,还增加了关于每棵树复杂度的惩罚项,即叶子节点的个数以及叶子节点分数的平方项,限制了树的复杂度
- 像GBDT那样,可以对每个模型乘上一个步长a,a∈(0,1],用来降低每个模型对预测的贡献
- 可以行采样与列采样,与随机森林类似
七、缺失值处理
XGBoost在选择最优分裂点的时候,不考虑该特征的缺失样本,但在后面对样本划分中,会分别将该特征的缺失样本放到左、右节点中,分别计算Gain值,哪边大就把该样本划分到哪一边。如果在训练集中,该特征没有出现缺失样本,但在预测的时候出现缺失样本了,则默认将该样本划分到右节点中
八、优缺点
优点
- 高度灵活性
xgboost支持线性分类器;xgboost对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数 - 正则化
xgboost在代价函数里加入了正则项,用于控制模型的复杂度,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合 - Shrinkage(缩减)
xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数(eta),主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点 - 剪枝
当分裂时遇到一个负损失时,GBM会停止分裂,因此GBM实际上是一个贪心算法,XGBoost会一直分裂到指定的最大深度(max_depth),然后回过头来剪枝 - 缺失值处理
对缺失值的处理。对于特征的值有缺失的样本,XGBoost内置处理缺失值的规则,可以自动学习出它的分裂方向 - 并行操作
可并行的近似直方图算法:树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点,当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点
缺点
容易出现过拟合,防止过拟合方法:
目标函数的正则项, 叶子节点数+叶子节点数输出分数的平方和 Ω ( f t ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f_t) =\gamma T +\frac{1}{2}\lambda\sum_{j=1}^{T} w_j^2 Ω(ft)=γT+21λj=1∑Twj2
行抽样和列抽样:训练的时候只用一部分样本和一部分特征
可以设置树的最大深度
η: 可以叫学习率、步长或者shrinkage
Early stopping:使用的模型不一定是最终的ensemble,可以根据测试集的测试情况,选择使用前若干棵树