机器学习:CatBoost简介

机器学习:CatBoost简介

CatBoost基于梯度增强,是Yandex开发的一种新的机器学习技术,其性能优于许多现有的增强算法,如XGBoost、Light GBM等。

虽然深度学习算法需要大量的数据和计算能力,但大多数业务问题仍然需要增强算法。然而,像XGBoost这样的增强算法需要数小时的训练,有时在调优超参数时会感到沮丧。

CatBoost易于实施且功能强大,让我们来看看CatBoost的特别之处。

树结构:

  • CatBoost和其他增强算法的一个主要区别是,CatBoost实现了对称树。这也许听起来疯狂,但有助于减少预测时间,这对于低延迟的环境是非常重要的。

机器学习:CatBoost简介

树在CatBoost中是对称的

  • 默认max_depth = 6

其他梯度增强算法的程序(XG boost,Light GBM)

步骤1:考虑所有(或一个样本)数据点以训练高度偏差的机器学习模型。

步骤2:计算每个数据点的残差(误差)。

步骤3:在相同的数据点和相应的残差(误差)上训练另一个模型作为类标签。

步骤4:重复步骤2和步骤3(n次迭代)。

这个过程容易过度拟合,因为我们计算的是模型已经在同一数据点上训练过的数据点的残差。

CatBoost程序

CatBoost以非常优雅的方式进行梯度增强。以下是使用示例对CatBoost的说明。

假设我们的数据集中有10个数据点,并按时间排序,如下所示。

机器学习:CatBoost简介

示例数据集

如果数据 没有时间,CatBoost会随机为每个数据点创建一个人工时间。

  • 步骤1:使用当时在所有其他数据点上训练过的模型计算每个数据点的残差(例如,要计算x5数据点的残差,我们使用x1、x2、x3和x4训练一个模型)。因此,我们针对不同的数据点训练不同的模型。最后,我们计算每个对应模型从未见过的数据点的残差。
  • 步骤2:使用每个数据点的残差训练模型
  • 步骤3:重复步骤1和步骤2(进行n次迭代)

对于上述示例数据集,我们应该训练9种不同的模型来获得9个数据点的残差。当我们有更多数据点时,这在计算上是昂贵的。

因此,默认情况下,它只训练log(num_of_datapoint)模型,而不是为每个数据点训练不同的模型。现在,如果一个模型已经训练了n个数据点,那么这个模型将被用来计算接下来n个数据点的残差。

  • 已经在第一数据点上训练的模型用于计算第二数据点的残差。
  • 已经在前两个数据点上训练的另一个模型用于计算第三和第四数据点的残差
  • 等等…

在上面的示例数据集中,现在我们使用已经在x1,x2,x3和x4上训练的模型计算x5,x6,x7和x8的残差。

我到目前为止所解释的所有这些程序都被称为有序增强。

随机排列

CatBoost实际上将给定数据集划分为随机排列,并对这些随机排列应用有序增强。默认情况下,CatBoost创建四个随机排列。有了这种随机性,我们可以进一步停止过度拟合我们的模型。我们可以通过调整参数bagging_temperature进一步控制这种随机性。这是您在其他增强算法中已经看到的内容。

处理分类特征

  • CatBoost具有非常好的分类数据向量表示。它采用有序增强的概念并将其应用于响应编码。
  • 在响应编码中,如果我们使用对具有相同分类特征的所有数据点的目标值的均值来表示每个分类特征,当我们用它的类标签表示数据点的一个特征时,这将导致目标泄漏。
  • CatBoost仅考虑该时间的先前数据点并计算具有相同分类特征的那些数据点的目标值的平均值。以下是带有示例的详细说明。

让我们看一个示例数据集。(所有数据点都按日期排序)

机器学习:CatBoost简介

使用fearture_1预测max_temperature

如果数据 没有时间,CatBoost会随机为每个数据点创建一个人工时间。

我们有feature ,一个分类特征,它有三个不同的类别。

对于响应编码,cloudy=(15 + 14 + 20 + 25)/ 4 = 18.5

这实际上导致了目标泄漏。因为我们使用相同数据点的目标值来向量化数据点。

CatBoost向量化所有分类特征,没有任何目标泄漏。它不会考虑所有数据点,而只会考虑数据点过去的数据点。例如,

  • Friday, cloudy = (15+14) /2 = 15.5
  • Saturday,cloudy = (15+14+20)/3 = 16.3
  • Tuesday ,cloudy = 0/0 ?

为了克服这个问题,我们都知道拉普拉斯平滑在朴素贝叶斯中是做什么的。CatBoost实现了相同的功能。

下面是另一个简洁的例子,

机器学习:CatBoost简介

在上面的数据集中,我们有两个类别(SDE和PR)的特征,假设所有数据点都是按时间顺序排列的。对于第i个数据点,我们将SDE表示为过去以SDE为特征的数据点的类标签的平均值(在分子和分母上添加一些常数以克服0/0错误)。

分类特征组合

CatBoost结合了多种分类特征。在大多数情况下,组合两个分类特征是有意义的。CatBoost会自动为您完成这一任务。

机器学习:CatBoost简介

在此数据集中,有两个特征(国家和头发长度)。我们可以很容易地发现,只要一个人来自印度,他/她的头发颜色就是黑色。我们可以将这两个特征表示为一个特征。在现实世界中,有许多分类特征可以表示为单个特征。

CatBoost通过构建基本树来实现特征组合,其中根节点仅包含单个特征,对于子节点,它随机选择另一个最佳特征并沿着根节点中的特征表示它 。

下面是CatBoost的图表,它将两个特征表示为树的第2级的单个特征。

机器学习:CatBoost简介

catboost中的对称树结构

在树的第一层,我们有一个单一的特征。当树的层数增加时,分类特征组合的数量成比例地增加。

CatBoost中的one-hot编码

默认情况下,当且仅当分类特征具有两个不同的类时,CatBoost内部用one-hot编码表示所有分类特征。

  • 如果希望对具有N个不同类别的分类特征实现One-hot编码,则可以更改参数one_hot_max_size = N。

处理数字特征

CatBoost以与其他树算法相同的方式处理数字特征。我们根据信息增益选择最佳拆分。

限制

  • CatBoost 不支持稀疏矩阵。
  • 当数据集具有许多数字特征时,CatBoost比Light GBM需要更多时间进行训练。

各种情况下的CatBoost:

对CatBoost来说,超参数调优并不是真正重要的。最重要的是根据我们正在解决的问题设置正确的参数。

1.数据随时间变化时

在现实世界中,有很多情况下数据会随着时间而变化。通过设置参数has_time = True, CatBoost可以在这些情况下很好地执行。

2。低延迟要求

CatBoost是唯一具有非常少的预测时间的增强算法。由于其对称的树形结构。在预测时,它比XGBoost 快8倍。

3. 加权数据点

在某些情况下,我们需要对某些数据点给予更多的重视。特别是当您进行时间训练-测试分割时,您需要模型主要针对早期数据点进行训练。当你赋予一个数据点更多权重时,它在随机排列中被选中的几率就会更高。

我们可以通过设置参数给予某些数据点更多的权重

例如,您可以给出所有数据点的线性加权

sample_weight = [ x for x in range(train.shape[0])]

4.使用小数据集

在某些情况下,如果数据点数较少,则需要的Log-loss最少。在这些情况下,您可以将参数fold_len_multiplier设置为接近 1 (必须> 1)和approx_on_full_history = True 。使用这些参数,CatBoost使用不同的模型计算每个数据点的残差。

5.使用大型数据集

对于大型数据集,可以通过设置参数task_type = GPU在GPU上训练CatBoost。它还支持多服务器分布式gpu。CatBoost还支持旧的gpu,您可以在谷歌Colabs中对其进行训练。

6.监控误差/损失函数

每次迭代都要监控模型,这是一种非常好的做法。您可以通过设置参数custom_metric = ['AUC','Logloss']来监控您选择的任何指标以及优化损失函数 。

您可以可视化您选择监控的所有指标。

7.分阶段预测和Shrinking Models

这又是CatBoost库提供的一种强大方法。您已经训练过模型,并且想知道模型在特定迭代中如何预测。您可以调用staged_predict()方法来检查模型在该阶段的执行情况。如果您确实注意到在特定阶段模型的性能优于最终训练模型,则可以使用shrink()方法将模型shrink到该特定阶段。

8.处理不同的情况

无论是节假日,还是淡季,还是正常日期,模型都应该预测每种情况下的最佳结果。

对于这类问题,您可以在 不同的交叉验证数据集上训练不同的模型,并使用sum_models()方法将所有模型与一些权重分配给每个模型。稍后根据情况,您可以更改每个模型的权重。

其他

  • 默认情况下,CatBoost有一个过度拟合检测器,当CV误差开始增加时,它会停止训练。您可以设置参数od_type = Iter,以便在几次迭代后停止训练模型。
  • 与其他算法一样,我们也可以使用class_weight参数来 平衡 不平衡数据集。
  • CatBoost不仅提供了重要的特征。它也告诉了我们,对于给定的数据点,重要的特征是什么。
  • 用于训练的代码CatBoost只是简单地直接转发,它几乎与sklearn模块类似。

超级参数调整?

CatBoost由强大的理论实现,如有序Boosting,Random permutations。它确保我们不会过度拟合我们的机器学习模型。它还实现了对称树,它消除了像(min_child_leafs)这样的参数。我们可以进一步调整参数,例如learning_rate,random_strength,L2_regulariser,但结果变化不大。

结束

CatBoost速度极快,它的性能优于所有梯度增强算法。如果数据集中的大多数特征都是分类的,那么它是一个很好的选择。

相关推荐