原论文地址:here,本文主要记录论文中重要的部分。

1. Abstract

CatBoost 中最主要的两个算法性的特点在于:实现了有序提升,排列驱动以代替经典算法;一种新颖的算法处理分类变量。这些方法旨在解决prediction shift(普遍存在于梯度提升算法中)。

2. Introduction

所有现存的梯度提升算法都存在统计学上的问题。经过多次提升的预测模型 FF 依赖于训练样本的目标变量的。我们论证了:这会导致来自训练样本中XkX_kF(Xk)XkF(X_k)|X_k 分布与测试样本中XXF(Xk)XkF(X_k)|X_k 分布的偏移。这最终会导致训练模型的prediction shift。我们将这种的问题称作:target leakage

3. Categorical features

一种有效的处理分类特征的方法就是:使用一个计算出的数值(target statistic (TS))来代替xkix_k^{i} (表示第k个训练样本的第i个分类型特征)。这个数值TS计算如下:x^ki=E(yxi=xki)\hat x_k^{i}=E(y|x^i=x_k^i)

3.1 Greedy TS

由于某些类别出现次数少,所以需要做平滑处理:
x^ki=j=1n1{xji=xki}yj+aPj=1n1{xji=xki}+a\hat x_k^{i}=\frac{\sum_{j=1}^{n}1_{\{x_j^i=x_k^i\}}\cdot y_j+aP}{\sum_{j=1}^{n}1_{\{x_j^i=x_k^i\}}+a}
a>0a>0为参数,PP通常取作所有数据中目标变量的平均值。但是,这样的平滑处理可能造成一个问题,也就是target leakageE(x^iy=v)=E(x^kiyk=v)E(\hat x^i|y = v) = E(\hat x_k^i|y_k = v),这个式子可能不成立。

注:博主还没弄清楚为什么Greedy TS会存在这个问题,待更新。。

大概懂了,意思就是:假设某个分类变量没有重复值,即每个样本对应一个分类值,这样的话,计算 E(x^kiyk)=yk+aP1+aE(\hat x_k^i|y_k) = \frac{y_k+aP}{1+a},而计算E(x^iy)=PE(\hat x^i|y) =P,也就说对单个样本的估计量是有偏的。作为参考对比,可以考虑均值估计方法,就是无偏的估计方法。

所以,需要解决办法之一就是使用除去 xkx_k 样本的数据子集来估计 xkix_k^i 的值:DkD{xk}D_k \subset D- \{x_k\},而不是使用全体数据集 DD

3.2 Ordered TS

CatBoost使用更加有效的处理方式。使用次序原则(ordering principle,文章的核心思想),这受在线学习算法的启发(在线学习算法按照时序来获取训练数据)。简单地说,就是TS值的计算依靠目前已经观察的样本集。我们可以随机生成一个排列来实现带时序的训练集,CatBoost在不同的梯度提升步中使用不同的排列。

4. Prediction shift and ordered boosting

同样,在每一步的梯度提升的过程中,也存在 prediction shift 的问题,它是由某种特殊类型的target leakage造成的,处理方法类似于Ordered TS

梯度提升算法中,在提升步做法如下式(1)hth^t 为新生成的弱分类器,gt(xk,yk)-g^t(x_k, y_k) 为损失函数在当前模型下的负梯度,即为弱分类器要拟合的值):
ht=argmin{hH}1nk=1n(gt(xk,yk)h(xk))h_t=argmin_{\{h\in H\}}\frac{1}{n}\sum_{k=1}^{n}(-g^t(x_k, y_k)-h(x_k))

链式偏移可以描述如下:

  • 梯度的条件分布 gt(xk,yk)xkg_t(x_k, y_k) | x_k 与训练样本gt(x,y)xg_t(x, y) | x 分布存在偏移;
  • 从而,hth^t 的估计式(1)也会与式(2)存在偏差。
  • 最终,会影响模型FtF^t的泛化能力。

式(2) 如下:
【论文笔记】CatBoost: unbiased boosting with categorical features

4.1 prediction shift 举例

在一般的回归问题中,损失函数为L(y,y^)=(yy^)2L(y, \hat y)=(y-\hat y)^2。此时,负梯度 gt(xk,yk)=ykFt1(xk)-g^t(x_k, y_k)=y_k - F^{t-1}(x_k),恰好等于每个样本的残差。

假设有两个变量 x1,x2x^1, x^2 独立同服从伯努利分布(p=0.5),且y=f(x)=c1x1+c2x2y=f^*(x) =c_1x^1+c_2x^2。经过两次梯度提升的迭代后,我们得到模型F=F2=h1+h2F=F^2=h^1+h^2,假设h1h^1基于变量x1x^1h2h^2基于变量x2x^2

有以下定理(具体证明见原论文):

  • 如果大小为nn的两个独立样本D1D_1D2D_2被分别用来估计 h1h^1h2h^2,使用式(1),有ED1,D2F2(x)=f(x)+O(1/2n)E_{D_1,D_2}F^2(x)=f^*(x) + O(1/2^n),对任意 x{0,1}2x\in\{0,1\}^2
  • 如果相同的数据集D=D1=D2D=D_1=D_2 均用于h1h^1h2h^2,则EDF2(x)=f(x)1n1c2(x212)+O(1/2n)E_DF^2(x)=f^*(x)-\frac{1}{n-1}c_2(x^2-\frac{1}{2})+O(1/2^n).

上面的理论告诉我们,如果在每次迭代提升步,使用相互独立的数据集,则得到的训练模型是对原有模型 f(x)f^*(x) 的无偏估计。否则,使用相同的数据集,则会得到有偏估计的模型,且数据集越大,偏差越小。

4.2 Ordered boosting

为了解决上述提到的 prediction shift,方法如下:

  • 首先随机生成一个1n1-n的排列σ\sigma
  • 维护 nn 个不同的 supporting models M1,...,MnM_1,...,M_n,使得MiM_i是仅利用了排列中的前ii个样本得到的训练模型。
  • 迭代的每一步,为了得到第jj个样本残差的估计值,使用模型Mj1M_{j-1} 估计。

事实上,由于上述方法需要维护nn个不同的模型,所以导致时间和空间复杂度都比较高。在CatBoost中,使用了改进的GBDT。

5. Practical implementation

这里给出最重要的实现细节,其算法伪代码如下:
【论文笔记】CatBoost: unbiased boosting with categorical features【论文笔记】CatBoost: unbiased boosting with categorical features

下面从各个方面给出算法细节:

5.1 Building a tree

5.2 Choosing leaf values

5.3 Complexity

5.4 Feature combinations

相关文章:

  • 2021-11-23
  • 2021-10-09
  • 2021-04-11
  • 2021-04-06
  • 2021-04-17
  • 2021-09-26
  • 2021-05-07
  • 2021-08-05
猜你喜欢
  • 2021-11-05
  • 2021-07-07
  • 2022-01-18
  • 2021-09-08
  • 2021-05-17
  • 2021-07-03
  • 2021-07-10
相关资源
相似解决方案