CatBoost之解决prediction shift详细介绍----原理+技巧

CatBoost之解决预测偏移

  • 1 Categorical features
    • 1.1 TS
    • 1.2 Greedy TS
    • 1.3 Holdout TS
    • 1.4 Leave-one-out TS
    • 1.5 Ordered TS
  • 2 预测偏移(Prediction shift)
  • 3 Ordered boosting

1 Categorical features

  categorical features是一种互不相交并且不可相互比较的特征。处理categorical features的一种流行方法是One-Hot,但直接One-Hot会产生大量新特征,为此也可先对特征中的类别做聚合以控制数目,再用One-Hot编码。聚合类别的一种流行方法是target statistics(TS),用来估计每个类别的期望目标值。研究表明,TS是一个新的数值型特征。
  LightGBM在每一个梯度提升步长中将categorical features变换为梯度统计量,这虽然在构造树的过程中可以提供重要的信息,但也随之而来两个严重问题:一是增大计算时间;二是增大内存消耗,后来LightGBM聚合尾部类别(tail categories)为一个类,但却损失部分信息。而TS特征对于每个种类仅计算和存储一个值,是处理categorical features的一个最有效方法。

1.1 TS

  替代类别特征 i i i和第 k k k个样本值 x k i x_k^i xki,最有效方法是利用一个等于TS的数值特征 x ^ k i \hat x^i_k x^ki x ^ k i ≈ E ( y ∣ x i = x k i ) \hat x^i_k≈E(y|x^i=x^i_k) x^kiE(yxi=xki)

1.2 Greedy TS

  估计 E ( y ∣ x i = x k i ) E(y|x^i=x^i_k) E(yxi=xki)的最直接方法是对于同一种类 x k i x^i_k xki,令 y y y的均值为 E ( y ∣ x i = x k i ) E(y|x^i=x^i_k) E(yxi=xki)。但对于低频次类别而言,会有噪声加入,因此加入先验值域先验值系数:
   x ^ k i = ∑ j = 1 n [ x j i = x k i ] ∗ y j + α ∗ P ∑ j = 1 n [ x j i = x k i ] + α \hat x^i_{k}=\frac{\sum_{j=1}^{n}[x^i_{j}=x^i_{k}]*y_j+α*P}{\sum_{j=1}^{n}[x^i_{j}=x^i_{k}]+α} x^ki=j=1n[xji=xki]+αj=1n[xji=xki]yj+αP
  这种贪婪的方法是目标泄露,因为 x ^ k i \hat x^i_k x^ki是用 x k x_k xk的目标值 y k y_k yk计算得来,这会导致条件漂移(conditional shift) : x ^ i ∣ y \hat x^i|y x^iy的分布不同于训练和测试样本(例如某个特征中的类别值都是唯一的)。
  有几种方法来避免条件漂移,主要思想就是使用不包括 x k x_k xk的数据集来计算 x k x_k xk的TS:
x ^ k i = ∑ x j ∈ D k [ x j i = x k i ] ∗ y j + α ∗ P ∑ x j ∈ D k [ x j i = x k i ] + α ( 1 ) \hat x^i_{k}=\frac{\sum_{x_j∈D_k}[x^i_{j}=x^i_{k}]*y_j+α*P}{\sum_{x_j∈D_k}[x^i_{j}=x^i_{k}]+α}(1) x^ki=xjDk[xji=xki]+αxjDk[xji=xki]yj+αP(1)

1.3 Holdout TS

  Holdout TS将训练数据集 D D D拆分成两个集合 D = D ^ 0 ∪ D ^ 1 D=\hat D_0∪\hat D_1 D=D^0D^1,利用 D ^ 0 \hat D_0 D^0根据式(1)来计算TS,用 D ^ 1 \hat D_1 D^1来训练。
  这虽然可以避免条件漂移的问题,但同时均减少了训练模型的数据量和计算TS的数据量。

1.4 Leave-one-out TS

  对样本 x k x_k xk,取除自身以外的数据集 D k = D ∣ x k D_k=D|x_k Dk=Dxk作为训练样本计算TS,将全量样本 D D D作为测试样本计算TS。显然没有避免目标泄露问题,仍然导致了条件漂移问题。

1.5 Ordered TS

  CatBoost使用Ordered TS这一更有效的策略。它依赖于一个排序准则。每个样本的TS值仅依赖于已观测到的历史样本集:如训练样本的一个随机序列 σ σ σ。对于每一个样本,可采用如下方式计算TS:将 D k = { x j : σ ( j ) < σ ( k ) } D_k=\{x_j:σ(j)<σ(k)\} Dk={xj:σ(j)<σ(k)}按照式(1)作为训练样本,全量样本 D D D作为测试样本。
  如上方式,既不会导致条件漂移,也不会减少数据量。值得注意的是,如果只使用一个随机序列排列,先前的样本比后序样本的TS值方差更大,因此CatBoost在不同的梯度提升步长中,使用不同的随机序列。

2 预测偏移(Prediction shift)

  预测偏移,简而言之是训练样本 X k X_k Xk的分布 F ( X k ) ∣ X k F(X_k)|X_k F(Xk)Xk与测试样本 X X X的分布 F ( X ) ∣ X F(X)|X F(X)X之间产生的偏移。这种预测偏移存在于目前所有的梯度提升算法中,由目标泄露(target leakage)引起。CatBoost可以解决这一问题。
  CatBoost利用ordering principle来解决目标泄露和预测偏移的问题,由此派生出ordered boosting来避免目标泄露,以及一个新的算法来处理categorical features。二者综合,得到CatBoost,在一些数据集上表现比XGBoost和LightGBM出色。
  对于需要生成的弱分类器 h t h^t ht
h t = a r g m i n h ∈ H E ( − g t ( x , y ) − h ( x ) ) 2 , ( 2 ) h^t=argmin_{h∈H}E(-g^t(x, y)-h(x))^2,(2) ht=argminhHE(gt(x,y)h(x))2,(2)
  但式(1)的期望未知,因此往往使用同样数据集来近似:
   h t = a r g m i n h ∈ H 1 n ∑ k = 1 n ( − g t ( X k , y k ) − h ( X h ) ) 2 , ( 3 ) h^t=argmin_{h∈H}\frac1n \sum_{k=1}^n(-g^t(X_k,y_k)-h(X_h))^2,(3) ht=argminhHn1k=1n(gt(Xk,yk)h(Xh))2,(3)
  式(3)可以看出预测偏移产生的原因:第一,梯度 g t ( X k , y k ) ∣ X k g^t(X_k,y_k)|X_k gt(Xk,yk)Xk的条件分布与测试样本 g t ( X , y ) ∣ X g^t(X,y)|X gt(X,y)X的分布不同,产生偏移;第二,式(3)中定义的基础学习器 h t h^t ht与式(2)有偏差;第三,影响训练模型的泛化能力。

3 Ordered boosting

  为了解决预测偏移的问题,可以假设数据集无穷大,在每一步提升中,独立采样一个新的数据集,将现有模型应用至新训练数据上会得到无偏残差,可惜的是,数据是有限的。
  因此,采用基于Ordered TS的Oedered boosting方法。这样会训练n个不同的模型,这导致模型复杂度提高并且消耗内存。因此,Ordered boosting不可行,故Catboost有两个模块Ordered和Plain来加以改善。
  Plain:对应于标准GBDT算法,并内嵌有序目标统计量的组合(使用了随机序列);
  Ordered:是对Ordered boosting算法的改进。
  Catboost在每次迭代过程中,支持下采样,但这只能减轻预测偏移,不能很好的避免;由于随机序列前部分的TS方差较大,可丢弃来自于前部分的TS值。
  
  具体还可参考https://blog.csdn.net/qq_42003997/article/details/103682995。

你可能感兴趣的:(机器学习/深度学习,机器学习,算法,深度学习)