XgBoost 随笔

XGBoost 学习笔记

集成算法

Bagging 和 Boosting 都是很常用的集成算法。

Bagging 算法下,各个弱评估器相互独立,最后对各个弱评估器的计算结果求平均 (或者加权平均)。

Boosting 算法下,每一颗树都是在前面树的基础上建立的,最后再对各个弱评估器的结果加权平均,刚开始建立的弱评估器的权重比较小,后来建立的弱评估器的权重比较大。常见的 Boosting算法有 AdaBoost 和 Gradient Boosting。XGBoost 使用的是改良版的 Gradient Boosting。

嵌入法(?)进行特征选择。当特征值比较多的时候,嵌入法是优先选择方法。

调参的时候,可以使用 sklearn.model_selection.learning_curve() 绘制 train_scoretest_score

进化的学习曲线:方差和泛化误差

在机器学习中,我们用来衡量模型在未知数据上的准确率的指标,叫做 泛化误差 (Generalization Error)。一个集成模型 f(x) 在未知数据集上的泛化误差 E(f;D), 由方差 (var),偏差(bias),噪声 ( \varepsilon )共同决定,其中偏差就是模型在训练集上的拟合程度,方差是模型在测试数据集上的拟合程度,代表了模型的泛化能力,噪声是不可控因素。
E(f;D)=bias^2+var+\varepsilon^2

调参:梯度提升树相关参数

n_estimators

代表梯度增强树的个数,代表了模型的学习能力,树的数量越多,模型的学习能力越强。只要XGBoost 中树的数量够多,即便只有很少的样本数据,模型也能学到训练数据集所有的信息,所以 XGBoost 有天生过拟合的特性,这种情况下,模型很不稳定,泛化能力比较差。

当 XGBoost 模型中树的数量比较少时,增加数的数量可以很好的提高模型的泛化误差,但是达到一定数量之后,便对模型泛化能力的提高影响很少。这时候可以考虑使用公式(1)改进学习曲线.

在随机森林算法中,倾向于先调整 n_estimators,当达到上限时,再调整其他参数。但是在 XGBoost 中,算法比较复杂,n_estimators 和其他参数有较强的耦合性,不过仍然建议首先调整 n_estimators,建议先将其设置在 300 以下。

有放回取样:subsample

该参数表示:每次从全部数据中抽取多少数据来拟合模型。

相比于不放回取样,有放回取样可以更好地防止过拟合,因为在上一个模型中被预测错误的样本,在下一次拟合模型时,这些样本将拥有更大的权重,从容避免再次将其预测错误。

正常来说,样本数越大,模型越不容易过拟合,所以该参数通常在数据集很大时才使用,可以提高模型训练速度。

学习率:eta or learning_rate

梯度增强树预测结果的好坏,可以在"损失函数"上得以体现,"损失函数"越小,表示该模型的泛化效果越好。这样,求解最优模型的过程就转化为求解目标函数极值的数学问题。

为了求解函数极值,首先可以先随意取一个点 x_0, 然后沿着损失函数梯度的方向确定下一个进行迭代的点 x^,=x_0+\alpha, 按着这个步骤一直进行迭代,知道损失函数取得极值。公式中的 \alpha 就叫做“学习率”或者“迭代步长”。

当"学习率"比较大时,可以进行很快地迭代,加快学习速度,但是容易错过极值点;当"学习率"比较小时,迭代速度会比较慢,不容易错过极值点,但是很可能得出局部最优解。

因此,当样本数比较大时,可以在刚开始迭代的时候,设置较大的学习率,随着模型的迭代,一点点减小学习率,这样既能加快迭代速度,又不会错过最优解。不过,样本数较小时,最好设置较小的学习率。

学习率一般会设置在 [0.01,0.2] 之间,如果希望模型的效果更好,更多地可以考虑从树本身的角度入手,比如对其进行剪枝。

XGBoost 所使用的梯度提升树,有以下三个重要部分:

  1. 一个能够衡量继承算法效果,能够被优化的损失函数 F_{obj};
  2. 一个能够实现预测的弱评估器 f_k(x);
  3. 一种能够让弱评估器集成的手段,包括迭代方法、抽样方法和样本加权等;

XGBoost 是在梯度提升树的这三个核心要素上运行,并且重新定义了损失函数和弱评估器,对提升算法和集成手段进行了改进,实现了运算速度和模型效果的高度平衡。并且XGBoost 将原来的梯度提升树拓展开来,让 XGBoost 不再是单纯的树的继承模型,也不是单单地回归模型,

弱评估器参数

booster:弱评估器种类

可选参数有三个:gbtree,gblinear,dart.

gbtree: 梯度提升树;

gblinear: 线性模型:当数据集是线性关系时,拟合效果比较好。

dart: Dropouts meet multiple Additive Regression Trees, 抛弃梯度树,在建树的过程中,会抛弃一些树,能够比梯度提升树更好地防止过拟合。

objective:目标函数

"损失函数"用于评估模型在测试集上的表现,该函数需要可微。

回归问题多使用均方误差 RMSE;分类问题多使用错误率 Error,或者对数损失 Log_loss。

XGBoost 不但使用"损失函数"评价一个模型的好坏,还使用"模型复杂度"。即"目标函数"=损失函数 + 模型复杂度。
F_{obj} = \sum^m_{i=1}{l(y_i,\hat{y_i})}+\sum_{k=1}^K{\Omega(f_k)}
\sum^m_{i=1}{l(y_i,\hat{y_i})} 表示损失函数,其中 m 表示样本数,y_i\hat{y}_i 分别表示 y 的真实值和预测值;衡量真实标签 y_i 与预测值 \hat{y}_i 之间的差异,损失函数通常是 RMSE (调节后的均方误差)。

\sum_{k=1}^K{\Omega(f_k)} 则表示模型复杂度,其中 K 表示树模型的个数;使用树模型的某种变换 \Omega 表示,这个变化代表了一个从树的结果来衡量树模型的复杂度的式子。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容