Boosting Tuning
  1. XGBoost;
  2. LightGBM;
  3. CatBoost

XGBoost

efficient、flexible

Reference:XGBoost Documentation

Xgboost 是一种高度复杂的算法可以处理各种各样的数据,利用 Xgboost 构建模型简单,但是用 Xgboost 来调参提升模型却很难。

XGBoost 的优势

  1. Regularization(正则化);【可以减少过拟合】
  2. Parallel Processing(并行处理);【Boosting 是串行算法】
  3. High Flexibility(高度灵活);【自定义优化目标与评估标准】
  4. Handling Missing Values(处理缺失值) 【内置程序】
  5. Tree Pruning(树剪枝) 【参数max_depth】
  6. Built-in Cross-Validation(内置的交叉验证)
  7. Continue on Existing Model(继续现有模型) 【基于上一次运行迭代】

参数介绍

  1. General Parameters(通用参数): 设置整体功能
  2. Booster Parameters(提升参数): 选择你每一步的booster (树or回归)
  3. Learning Task Parameters(学习任务参数): 指导优化任务的执行

参数详细介绍参见: Blog

XGBoost 的参数较多,如果需要认知各个参数的参考上述 Blog, 我直接开始说参数调优…

Xgboost参数调优

通用方法

  • 选择一个相对较高的学习率。通常来说学习率设置为0.1。但是对于不同的问题可以讲学习率设置在0.05-0.3。通过交叉验证来寻找符合学习率的最佳树的个数。
  • 当确定好学习率与最佳树的个数时,调整树的某些特定参数。比如:max_depth, min_child_weight, gamma, subsample, colsample_bytree
  • 调整正则化参数 ,比如: lambda, alpha。这个主要是为了减少模型复杂度和提高运行速度的。适当地减少过拟合。
  • 降低学习速率,选择最优参数

修正学习速率及调参估计量

给定一个初始值,方便确定其他参数,可随意给定

调整max_depth 和min_child_weight

max_depth:树的最大深度,控制过拟合

min_child_weight:一个子集的所有观察值的最小权重和

需要调整参数的选择依据:对结果的影响程度

方法:

先预设一个较大的值,通过一个范围和步进值进行迭代,不断缩小范围,找寻最优组合,类似于最小二乘法。

调整gamma

这个指定了一个结点被分割时,所需要的最小损失函数减小的大小。

这个值一般来说需要根据损失函数来调整。

和上一步一致的方法,同样是设置范围和步进值进行迭代,找寻最优值。

调整subsample 和colsample_bytree

分别是采样率特征采样率

方法还和之前一致。

调整正则化参数

reg_alpha

此参数使用相对较少,主要是用来调整过拟合,调优选择精度最高的值。

减小学习率

通过减小学习率并增加树的数量

参数调优用例: Xgboost-tuning

返回…

LightGBM

LightGBM 的优点就是快的一逼的同时精度还高

LGB 不需要通过所有样本计算信息增益了,而是选择梯度大的样本来计算信息增益,所以更精;而且内置特征降维技术,所以更快。

如果一个样本的梯度较小,证明这个样本训练的误差已经很小了,所以不需要计算了。GBDT的梯度算出来实际上就是残差,梯度小残差就小,所以该样本拟合较好,不需要去拟合他们了。但是我们这样相当于改变数据分布,无法避免信息损失,还是会导致精度下降。

LGB 核心:

  1. 在保留大梯度样本的同时,随机地保留一些小梯度样本,同时放大了小梯度样本带来的信息增益。

e.g. 首先把样本按照梯度排序,选出梯度最大的$a%$个样本,然后在剩下小梯度数据中随机选取$b%$个样本,在计算信息增益的时候,将选出来$b%$个小梯度样本的信息增益扩大 $1 - \frac{a}{b}$ 倍。

  1. 内置了特征降维技术,思想就是合并那些冲突小的稀疏特征。

e.g. 对于一列特征[1,nan,1,nan,1]和一列特征[nan,1,nan,1,nan],他们正好可以合并成一列特征[1,2,1,2,1]。LGB的目标就是在于找到这样的特征并且将他们合并在一起。

Reference: 无痛看懂LightGBM原文

参数调优

一般步骤如下:

  1. 选择较高的学习率,大概0.1附近;
  2. 对决策树基本参数调参;
  3. 正则化参数调参;
  4. 最后降低学习率,这里是为了最后提高准确率。

可见对于基于决策树的模型,调参的方法都是大同小异,LGB 的参数调优步骤和 XGB 的调优步骤基本相同。

学习率和估计器及数目

给定一个初始值,方便设置其他参数

通常先把学习率先定一个较高的值,取 learning_rate = 0.1,其次确定估计器boosting/boost/boosting_type的类型,不过默认都会选gbdt。

为了确定估计器的数目,也就是boosting迭代的次数,也可以说是残差树的数目,参数名为n_estimators/num_iterations/num_round/num_boost_round。我们可以先将该参数设成一个较大的数,然后在cv结果中查看最优的迭代次数。

注意:在硬件条件允许的情况下,学习率尽可能小

调整 max_depth 和 num_leaves

max_depth :设置树深度,深度越大可能过拟合

num_leaves:树的复杂程度

因为 LightGBM 使用的是 leaf-wise 的算法,因此在调节树的复杂程度时,使用的是 num_leaves 而不是 max_depth。大致换算关系:$num_leaves = 2^(max_depth)$,但是它的值的设置应该小于 $2^(max_depth)$,否则可能会导致过拟合。

方法:

sklearn 里的 GridSearchCV() 函数进行搜索。

调整 min_data_in_leaf 和 min_sum_hessian_in_leaf

min_data_in_leaf: 取决于训练数据的样本个数和num_leaves.

min_sum_hessian_in_leaf: 使一个结点分裂的最小海森值之和

方法同上:还是利用 GridSearchCV 函数

调整 feature_fraction 和 bagging_fraction

feature_fraction: 进行特征的子抽样

bagging_fraction+bagging_freq参数必须同时设置,bagging_fraction相当于subsample样本采样

调整正则化参数

lambda_l1(reg_alpha), lambda_l2(reg_lambda)

两者分别对应l1正则化和l2正则化。分别对应 l1 正则化和 l2 正则化

方法仍然同上。

降低learning_rate

之前我们设置了较高的学习率,是为了让收敛更快,但是现在我们需要提高精度,使用较低的学习速率,以及使用更多的决策树n_estimators来训练数据。

方法:

LightGBM 的 cv( ) 函数

参数调优实例:Blog

返回…

CatBoost

Gradient Boosting(梯度提升) + Categorical Features(类别型特征)

优势

  1. 类别型特征的处理; 【降低拟合的同时将数据集随机排列进而将全部数据集用来学习】
  2. 特征组合;【贪婪策略,二值处理】
  3. 克服梯度偏差 【梯度步长的无偏估计、GBDT 技术构建新树】
  4. 快速评分 【oblivious 树作为基本预测器转换索引为二进制向量,进一步使用二进制特征来计算模型预测值】
  5. 基于GPU实现快速学习 【密集的数值特征、完美哈希_类别型特征、多 GPU 支持】

Reference:CatBoost “超强战斗力”的算法

Result:e.g.
null

参数调优

具有鲁棒性的 CatBoost 简直就是机器学习框架界的一匹黑马,不仅训练准确性超强,就连参数调优都特别舒适。

在 CatBoost Document 原文中,针对 CatBoost Tuning 是如此描述的

CatBoost provides a flexible interface for parameter tuning and can be configured to suit different tasks.

One-hot encoding

注意:

由于 One-hot encoding 对训练速度和训练结果的影响较大,所以千万不要在预处理的时候使用

适用性:

当分类特征值较少时,选择 One-hot encoding 会取得很好的效果

使用过程中 One-hot encoding 不会显著提高模型质量,但是如果模型质量需要提高,可以选择修改内置参数,而不需要预处理数据。

参数详细: Reference

Number of trees

  • CatBoost 在参数调优时,如果要调整任何其他参数,首先应该确定模型没有非正常拟合现象。所以我们有必要分析数据集的度量值和迭代次数。

  • 可以通过将迭代次数设置为一个较大值,使用 overfitting detector 参数并且将 use best model options 参数调大,这样一来,模型训练结果只包含前 k 个最佳迭代。【k-最佳损失值的索引】

  • 用于选择最佳模型的度量可能与用于优化目标值的度量不同。

参数详细: Reference

Tree depth

在大多数情况下,最佳深度范围是 4 ~ 10,建议深度6 ~ 10

The maximum depth of the trees is limited to 8 for pairwise modes (YetiRank, PairLogitPairwise and QueryCrossEntropy) when the training is performed on GPU.

GPU 上训练时,树的最大深度被限制在了 8。

参数详细: Reference

Border count

数字特征的分割数

此参数的值会影响 GPU 上的训练速度,值越小,训练速度越快。【Detail:Number of splits for numerical features

分割数 128 一般情况下来说足够了,但是如果想要更好的训练质量,可以将此参数设置为 254.

参数详细: Reference

其他参数:

参见:Reference

说了这么多,其实参数调优只能从表面上解决问题,如果想要实质性或更大的优化,还需要在特征工程模型集成上大做文章。