XGBoost 学习笔记
集成算法
Bagging 和 Boosting 都是很常用的集成算法。
Bagging 算法下,各个弱评估器相互独立,最后对各个弱评估器的计算结果求平均 (或者加权平均)。
Boosting 算法下,每一颗树都是在前面树的基础上建立的,最后再对各个弱评估器的结果加权平均,刚开始建立的弱评估器的权重比较小,后来建立的弱评估器的权重比较大。常见的 Boosting算法有 AdaBoost 和 Gradient Boosting。XGBoost 使用的是改良版的 Gradient Boosting。
嵌入法(?)进行特征选择。当特征值比较多的时候,嵌入法是优先选择方法。
调参的时候,可以使用 sklearn.model_selection.learning_curve()
绘制 train_score
和test_score
。
进化的学习曲线:方差和泛化误差
在机器学习中,我们用来衡量模型在未知数据上的准确率的指标,叫做 泛化误差 (Generalization Error)。一个集成模型 在未知数据集上的泛化误差
, 由方差 (var),偏差(bias),噪声 (
)共同决定,其中偏差就是模型在训练集上的拟合程度,方差是模型在测试数据集上的拟合程度,代表了模型的泛化能力,噪声是不可控因素。
调参:梯度提升树相关参数
n_estimators
代表梯度增强树的个数,代表了模型的学习能力,树的数量越多,模型的学习能力越强。只要XGBoost 中树的数量够多,即便只有很少的样本数据,模型也能学到训练数据集所有的信息,所以 XGBoost 有天生过拟合的特性,这种情况下,模型很不稳定,泛化能力比较差。
当 XGBoost 模型中树的数量比较少时,增加数的数量可以很好的提高模型的泛化误差,但是达到一定数量之后,便对模型泛化能力的提高影响很少。这时候可以考虑使用公式(1)改进学习曲线.
在随机森林算法中,倾向于先调整 n_estimators
,当达到上限时,再调整其他参数。但是在 XGBoost 中,算法比较复杂,n_estimators
和其他参数有较强的耦合性,不过仍然建议首先调整 n_estimators
,建议先将其设置在 300 以下。
有放回取样:subsample
该参数表示:每次从全部数据中抽取多少数据来拟合模型。
相比于不放回取样,有放回取样可以更好地防止过拟合,因为在上一个模型中被预测错误的样本,在下一次拟合模型时,这些样本将拥有更大的权重,从容避免再次将其预测错误。
正常来说,样本数越大,模型越不容易过拟合,所以该参数通常在数据集很大时才使用,可以提高模型训练速度。
学习率:eta or learning_rate
梯度增强树预测结果的好坏,可以在"损失函数"上得以体现,"损失函数"越小,表示该模型的泛化效果越好。这样,求解最优模型的过程就转化为求解目标函数极值的数学问题。
为了求解函数极值,首先可以先随意取一个点 , 然后沿着损失函数梯度的方向确定下一个进行迭代的点
, 按着这个步骤一直进行迭代,知道损失函数取得极值。公式中的
就叫做“学习率”或者“迭代步长”。
当"学习率"比较大时,可以进行很快地迭代,加快学习速度,但是容易错过极值点;当"学习率"比较小时,迭代速度会比较慢,不容易错过极值点,但是很可能得出局部最优解。
因此,当样本数比较大时,可以在刚开始迭代的时候,设置较大的学习率,随着模型的迭代,一点点减小学习率,这样既能加快迭代速度,又不会错过最优解。不过,样本数较小时,最好设置较小的学习率。
学习率一般会设置在 [0.01,0.2] 之间,如果希望模型的效果更好,更多地可以考虑从树本身的角度入手,比如对其进行剪枝。
XGBoost 所使用的梯度提升树,有以下三个重要部分:
- 一个能够衡量继承算法效果,能够被优化的损失函数
;
- 一个能够实现预测的弱评估器
;
- 一种能够让弱评估器集成的手段,包括迭代方法、抽样方法和样本加权等;
XGBoost 是在梯度提升树的这三个核心要素上运行,并且重新定义了损失函数和弱评估器,对提升算法和集成手段进行了改进,实现了运算速度和模型效果的高度平衡。并且XGBoost 将原来的梯度提升树拓展开来,让 XGBoost 不再是单纯的树的继承模型,也不是单单地回归模型,
弱评估器参数
booster:弱评估器种类
可选参数有三个:gbtree
,gblinear
,dart
.
gbtree
: 梯度提升树;
gblinear
: 线性模型:当数据集是线性关系时,拟合效果比较好。
dart
: Dropouts meet multiple Additive Regression Trees
, 抛弃梯度树,在建树的过程中,会抛弃一些树,能够比梯度提升树更好地防止过拟合。
objective:目标函数
"损失函数"用于评估模型在测试集上的表现,该函数需要可微。
回归问题多使用均方误差 RMSE;分类问题多使用错误率 Error,或者对数损失 Log_loss。
XGBoost 不但使用"损失函数"评价一个模型的好坏,还使用"模型复杂度"。即"目标函数"=损失函数 + 模型复杂度。
表示损失函数,其中
表示样本数,
和
分别表示
的真实值和预测值;衡量真实标签
与预测值
之间的差异,损失函数通常是 RMSE (调节后的均方误差)。
则表示模型复杂度,其中
表示树模型的个数;使用树模型的某种变换
表示,这个变化代表了一个从树的结果来衡量树模型的复杂度的式子。