CatBoost原理介绍

news2024/12/24 9:12:23

文章最前: 我是Octopus,这个名字来源于我的中文名–章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

CatBoost是俄罗斯的搜索巨头Y andex在2017年开源的机器学习库,也是Boosting族算法的一种,同前面介绍过的XGBoost和LightGBM类似,依然是在GBDT算法框架下的一种改进实现,是一种基于对称决策树(oblivious trees)算法的参数少、支持类别型变量和高准确性的GBDT框架,主要说解决的痛点是高效合理地处理类别型特征,这个从它的名字就可以看得出来,CatBoost是由catgorical和boost组成,另外是处理梯度偏差(Gradient bias)以及预测偏(Prediction shift)问题,提高算法的准确性和泛化能力。

CatBoost

CatBoost主要有以下五个特性:

  • 无需调参即可获得较高的模型质量,采用默认参数就可以获得非常好的结果,减少在调参上面花的时间
  • 支持类别型变量,无需对非数值型特征进行预处理
  • 快速、可扩展的GPU版本,可以用基于GPU的梯度提升算法实现来训练你的模型,支持多卡并行
  • 提高准确性,提出一种全新的梯度提升机制来构建模型以减少过拟合
  • 快速预测,即便应对延时非常苛刻的任务也能够快速高效部署模型

CatBoost的主要算法原理可以参照以下两篇论文:

  • Anna Veronika Dorogush, Andrey Gulin, Gleb Gusev, Nikita Kazeev, Liudmila Ostroumova Prokhorenkova, Aleksandr Vorobev "Fighting biases with dynamic boosting". arXiv:1706.09516, 2017
  • Anna Veronika Dorogush, Vasily Ershov, Andrey Gulin "CatBoost: gradient boosting with categorical features support". Workshop on ML Systems at NIPS 2017

Categorical features

所谓类别型变量(Categorical features)是指其值是离散的集合且相互比较并无意义的变量,比如用户的ID、产品ID、颜色等。因此,这些变量无法在二叉决策树当中直接使用。常规的做法是将这些类别变量通过预处理的方式转化成数值型变量再喂给模型,比如用一个或者若干个数值来代表一个类别型特征。

目前广泛用于低势 (一个有限集的元素个数是一个自然数)类别特征的处理方法是One-hot encoding:将原来的特征删除,然后对于每一个类别加一个0/1的用来指示是否含有该类别的数值型特征。One-hot encoding可以在数据预处理时完成,也可以在模型训练的时候完成,从训练时间的角度,后一种方法的实现更为高效,CatBoost对于低势类别特征也是采用后一种实现。

显然,在高势 特征当中,比如 user ID,这种编码方式会产生大量新的特征,造成维度灾难。一种折中的办法是可以将类别分组成有限个的群体再进行 One-hot encoding。一种常被使用的方法是根据目标变量统计(Target Statistics,以下简称TS)进行分组,目标变量统计用于估算每个类别的目标变量期望值。甚至有人直接用TS作为一个新的数值型变量来代替原来的类别型变量。重要的是,可以通过对TS数值型特征的阈值设置,基于对数损失、基尼系数或者均方差,得到一个对于训练集而言将类别一分为二的所有可能划分当中最优的那个。在LightGBM当中,类别型特征用每一步梯度提升时的梯度统计(Gradient Statistics,以下简称GS)来表示。虽然为建树提供了重要的信息,但是这种方法有以下两个缺点:

  • 增加计算时间,因为需要对每一个类别型特征,在迭代的每一步,都需要对GS进行计算;
  • 增加存储需求,对于一个类别型变量,需要存储每一次分离每个节点的类别。

为了克服这些缺点,LightGBM以损失部分信息为代价将所有的长尾类别归位一类,作者声称这样处理高势特征时比起 One-hot encoding还是好不少。不过如果采用TS特征,那么对于每个类别只需要计算和存储一个数字。

如此看到,采用TS作为一个新的数值型特征是最有效、信息损失最小的处理类别型特征的方法。TS也被广泛采用,在点击预测任务当中,这个场景当中的类别特征有用户、地区、广告、广告发布者等。接下来我们着重讨论TS,暂时将One-hot encoding和GS放一边。

Target statistics

一个有效和高效的处理类别型特征 i i i的方式是用一个与某些TS相等的数值型变量 x ^ k i \hat{x}_k^i x^ki来代替第 k k k个训练样本的类别 x k i {x}_k^i xki。通常用基于类别的目标变量 y y y的期望来进行估算: x ^ k i ≈ E ( y ∣ x i = x k i ) \hat{x}_k^i\approx\mathbb{E}(y|x^i={x}_k^i) x^kiE(yxi=xki)

Greedy TS

估算 E ( y ∣ x i = x ∗ k i ) \mathbb{E}(y|x^i={x}*k^i) E(yxi=xki)最直接的方式就是用训练样本当中相同类别 x k i x_k^i xki的目标变量 y y y的平均值。

$$
\hat{x}_k^i=\frac{\sum* {j=1}n\mathbb{I}*{{x_ji={x}_k^i}}\cdot y_i}{\sum* {j=1}n\mathbb{I}*{{x_ji={x}_k^i}}}

$$

显然,这样的处理方式很容易引起过拟合。举个例子,假如在整个训练集当中所有样本的类别 x k i {x}_k^i xki都互不相同,即 k k k个样本有 k k k个类别,那么新产生的数值型特征的值将与目标变量的值相同。某种程度上,这是一种目标穿越(target leakage),非常容易引起过拟合。比较好的一种做法是采用一个先验概率 p p p进行平滑处理:
$$
\hat{x}_k^i=\frac{\sum* {j=1}n\mathbb{I}*{{x_ji={x}_k^i}}\cdot y_i+a,p}{\sum* {j=1}n\mathbb{I}_{{x_ji={x}_k^i}}+a}

$$

其中 a > 0 a>0 a>0是先验概率 p p p的权重,而对于先验概率,通常的做法是设置为数据集当中目标变量的平均值。

不过这样的平滑处理依然无法完全避免目标穿越:特征 x ^ ∗ k i \hat{x}*k^i x^ki是通过自变量 X k X_k Xk的目标 y k y_k yk计算所得。这将会导致条件偏移:对于训练集和测试集, x ^ k i ∣ y \hat{x}_k^i|y x^kiy的分布会有所不同。再举个例子,假设第 i i i个特征为类别型特征,并且特征所有取值为无重复的集合,然后对于每一个类别 A A A,对于一个分类任务,我们有 P ( y = 1 ∣ x i = A ) = 0.5 P(y=1|x^i=A)=0.5 P(y=1∣xi=A)=0.5。然后在训练集当中, x ^ k i = y k + a   p 1 + a \hat{x}_k^i=\frac{y_k+a\,p}{1+a} x^ki=1+ayk+ap,于是用阈值 t = 0.5 + a   p 1 + a t=\frac{0.5+a\,p}{1+a} t=1+a0.5+ap就可以仅用一次分裂就训练集完美分开。但是,对于测试集,因为还无法判断此时目标变量的类别,所以这一项 ∑ ∗ j = 1 n I x j i = x k i = 0 \sum* {j=1}^n\mathbb{I}_{{x_j^i={x}_k^i}}=0 j=1nIxji=xki=0,最后得到的TS值为 p p p,并且得到的模型在 p < t p<t p<t时,预测目标为0,反之则为1,两种情况下的准确率都为0.5。总结一下,我们希望TS有以下的性质:

$$
{\rm{P1}\quad}\mathbb{E}(\hat{x}i|y=v)=\mathbb{E}(\hat{x}_ki|y_k=v)

$$

其中, ( X k , y k ) (X_k, y_k) (Xk,yk)是第 k k k个训练样本。

在我们的例子当中, E ( x ^ k i ∣ y k ) = y k + a   p 1 + a \mathbb{E}(\hat{x}_k^i|y_k)=\frac{y_k+a\,p}{1+a} E(x^kiyk)=1+ayk+ap E ( x ^ k i ∣ y ) = p \mathbb{E}(\hat{x}_k^i|y)=p E(x^kiy)=p,显然无法满足上述条件。

Holdout TS

留出TS,就是将训练集一分为二: D = D ^ ∗ 0 ⊔ D ^ 1 \mathcal{D}=\hat{\mathcal{D}}*0 \sqcup\hat{\mathcal{D}}_1 D=D^0D^1,然后根据下式用 D k = D ^ 0 \mathcal{D}_k=\hat{\mathcal{D}}_0 Dk=D^0来计算TS,并将 D ^ 1 \hat{\mathcal{D}}_1 D^1作为训练样本。

$$
\hat{x}_k^i=\frac{\sum* {X_j \in {\mathcal{D}k}}\mathbb{I} {{x_ji={x}*ki}}\cdot y_i+a,p}{\sum* {X_j \in {\mathcal{D}k}}\mathbb{I} {{x_ji={x}_ki}}+a}

$$

这样处理能够满足同分布的问题,但是却大大减少了训练样本的数量。

Leave-one-out TS

初看起来,留一TS(Leave-one-out TS)能够非常好地工作:

  • 对于训练样本: D k = D \ X k \mathcal{D}_k=\mathcal{D}\backslash X_k Dk=D\Xk
  • 对于测试样本: D k = D \mathcal{D}_k=\mathcal{D} Dk=D

但事实上,这并没有给预防target leakage带来多少益处。举个例子,考虑一个常数类别型特征:对于所有的样本, x k i = A x_k^i=A xki=A,在二分类的条件下,让 n + n^+ n+表示 y = 1 y=1 y=1的样本数量,则有:

  • x ^ k i = n + − y k + a   p n − 1 + a \hat{x}_k^i=\frac{n^{+}-y_k+a\,p}{n-1+a} x^ki=n1+an+yk+ap
  • 对于测试样本: x ^ i = n + + a   p n + a \hat{x}^i=\frac{n^{+}+a\,p}{n+a} x^i=n+an++ap

此时,同样可以用阈值 x ^ k i = n + − 0.5 + a   p n − 1 + a \hat{x}_k^i=\frac{n^{+}-0.5+a\,p}{n-1+a} x^ki=n1+an+0.5+ap将训练集完美的分类。

Ordered TS

从在线学习按照时间序列获得样本得到的启发,CatBoost依靠排序原则,采用了一种更为有效的策略。主要有以下几个步骤:

  • 产生一个随机排列顺序 σ \sigma σ并对数据集进行编号
  • 对于训练样本: D k = X j : σ ( j ) < σ ( k ) \mathcal{D}_k={X_j: \sigma(j)<\sigma(k)} Dk=Xj:σ(j)<σ(k)
  • 对于测试样本: D k = D \mathcal{D}_k=\mathcal{D} Dk=D
  • 根据带先验概率的Greedy TS计算 x ^ k i \hat{x}_k^i x^ki

这样计算得到的 Ordered TS能够满足P1,同时也能够使用所有的训练样本。且比在线学习的划窗(sliding window)处理能够进一步减小 x ^ k i \hat{x}_k^i x^ki的方差。需要注意的是,CatBoost在不同的迭代上会采用不同的排列顺序。

下面是Ordered TS与其它各种TS在不同数据集上面在logloss/zero-one loss上面的效果比较:

特征组合

CatBoost的另外一项重要实现是将不同类别型特征的组合作为新的特征,以获得高阶依赖(high-order dependencies),比如在广告点击预测当中用户ID与广告话题之间的联合信息,又或者在音乐推荐引用当中,用户ID和音乐流派,如果有些用户更喜欢摇滚乐,那么将用户ID和音乐流派分别转换为数字特征时,这种用户内在的喜好信息就会丢失。然而,组合的数量会随着数据集中类别型特征的数量成指数增长,因此在算法中考虑所有组合是不现实的。为当前树构造新的分割点时,CatBoost会采用贪婪的策略考虑组合。对于树的第一次分割,不考虑任何组合。对于下一个分割,CatBoost将当前树的所有组合、类别型特征与数据集中的所有类别型特征相结合,并将新的组合类别型特征动态地转换为数值型特征。CatBoost还通过以下方式生成数值型特征和类别型特征的组合:树中选定的所有分割点都被视为具有两个值的类别型特征,并像类别型特征一样地被进行组合考虑。

Gradient bias

CatBoost,和所有标准梯度提升算法一样,都是通过构建新树来拟合当前模型的梯度。然而,所有经典的提升算法都存在由有偏的点态梯度估计引起的过拟合问题。在每个步骤中使用的梯度都使用当前模型中的相同的数据点来估计,这导致估计梯度在特征空间的任何域中的分布与该域中梯度的真实分布相比发生了偏移,从而导致过拟合。为了解决这个问题,CatBoost对经典的梯度提升算法进行了一些改进,简要介绍如下:

在许多利用GBDT框架的算法(例如,XGBoost、LightGBM)中,构建下一棵树分为两个阶段:选择树结构和在树结构固定后计算叶子节点的值。为了选择最佳的树结构,算法通过枚举不同的分割,用这些分割构建树,对得到的叶子节点中计算值,然后对得到的树计算评分,最后选择最佳的分割。两个阶段叶子节点的值都是被当做梯度或牛顿步长的近似值来计算。在CatBoost中,第二阶段使用传统的GBDT框架执行,第一阶段使用修改后的版本。

既然原来的梯度估计是有偏的,那么能不能改成无偏估计呢?

F i F^i Fi为构建 i i i棵树后的模型, g i ( X k , y k ) g^i(X_k,y_k) gi(Xk,yk)为构建 i i i棵树后第 k k k个训练样本上面的梯度值。为了使得 g i ( X k , y k ) g^i(X_k,y_k) gi(Xk,yk)无偏于模型 F i F^i Fi,我们需要在没有 X k X_k Xk参与的情况下对模型 F i F^i Fi进行训练。由于我们需要对所有训练样本计算无偏的梯度估计,乍看起来对于 F i F^i Fi的训练不能使用任何样本,貌似无法实现的样子。我们运用下面这个技巧来处理这个问题:对于每一个样本 X k X_k Xk,我们训练一个单独的模型 M k M_k Mk,且该模型从不使用基于该样本的梯度估计进行更新。我们使用 M k M_k Mk来估计 X k X_k Xk上的梯度,并使用这个估计对结果树进行评分。用伪码描述如下,其中 L o s s ( y , a ) Loss(y,a) Loss(y,a)是需要优化的损失函数, y y y是标签值, a a a是公式计算值。

值得注意的是 M i {M_{i}} Mi模型的建立并没有样本 X i {X_{i}} Xi 的参与,并且CatBoost中所有的树 M i {M_{i}} Mi的共享同样的结构。

在CatBoost中,我们生成训练数据集的 s s s个随机排列。采用多个随机排列是为了增强算法的鲁棒性,这在前面的Odered TS当中对于类别型特征的处理有介绍到:针对每一个随机排列,计算得到其梯度,为了与Ordered TS保持一致,这里的排列与用于计算Ordered TS时的排列相同。我们使用不同的排列来训练不同的模型,因此不会导致过拟合。对于每个排列 σ \sigma σ,我们训练 n n n个不同的模型 M i {M_{i}} Mi,如上所示。这意味着为了构建一棵树,需要对每个排列存储并重新计算,其时间复杂度近似于 O ( n 2 ) O(n^2) O(n2):对于每个模型 M i {M_{i}} Mi,我们必须更新 M 1 ( X 1 ) , . . . , M i ( X i ) {M_{1}}({X_{1}}),...,{M_{i}}({X_{i}}) M1(X1),...,Mi(Xi)。因此,时间复杂度变成 O ( s n 2 ) O(sn^2) O(sn2)。当然,在具体实现当中,CatBoost使用了其它的技巧,可以将构建一个树的时间复杂度降低到 O ( s n ) O(sn) O(sn)

Prediction shift

预测偏移(Prediction shift)是由上一节所讨论的梯度偏差造成的。本节希望用数学语言严格地对预测偏差进行描述和分析。

首先来看下梯度提升的整体迭代过程:

  • 对于梯度提升: F t = F t − 1 + α t   h t ,   h t = a r g m i n h ∈ H L ( F t − 1 + h ) F^t = F^{t-1}+\alpha^t\,h^t,\,h^t=\underset{h \in H}{\mathrm{argmin}}\mathcal{L}(F^{t-1}+h) Ft=Ft1+αtht,ht=hHargminL(Ft1+h)
  • g t ( X , y ) : = ∂ L ( y , s ) ∂ s ∣ s = F t − 1 ( x ) g^t(X,y):=\frac{\partial L(y,s)}{\partial s}|_{s=F^{t-1}(x)} gt(X,y):=sL(y,s)s=Ft1(x)
  • h ^ t = a r g m i n h ∈ H E ( − g t ( X , y ) − h ( X ) ) 2 \hat{h}^t=\underset{h \in H}{\mathrm{argmin}}\mathbb{E}{\left(-g^t(X,y)-h(X)\right)}^2 h^t=hHargminE(gt(X,y)h(X))2
  • h t = a r g m i n h ∈ H 1 n ∑ k = 1 n ( − g t ( X k , y k ) − h ( X k ) ) 2 h^t=\underset{h \in H}{\mathrm{argmin}}\frac{1}{n}\sum_{k=1}^n{\left(-g^t(X_k,y_k)-h(X_k)\right)}^2 ht=hHargminn1k=1n(gt(Xk,yk)h(Xk))2

在这个过程当中,偏移是这样发生的:

  • 根据 D \ X k \mathbb{D} \backslash {X_k} D\Xk进行随机计算的条件分布 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发生偏移
  • 这样导致基学习器 h t h^t ht h ^ t \hat{h}^t h^t产生偏差
  • 最后影响模型 F t F^t Ft的泛化能力

下面以一个回归任务为例,从理论上分析计算偏差的值。

假设以下边界条件:

  • 损失函数: L ( y , y ^ ) = ( y − y ^ ) 2 L(y,\hat{y})=(y-\hat{y})^2 L(y,y^)=(yy^)2
  • 两个相互独立的特征 x 1 , x 2 x^1,x^2 x1,x2,随机变量,符合伯努利分布,先验概率 p = 1 / 2 p=1/2 p=1/2
  • 目标函数: y = f ∗ ( x ) = c 1   x 1 + c 2   x 2 y=f^*(x)=c_1\,x^1+c_2\,x^2 y=f(x)=c1x1+c2x2
  • 梯度提升迭代次数为2
  • 树深度为1
  • 学习率: α = 1 \alpha=1 α=1

最后得到的模型为: F = F 2 = h 1 + h 2 F=F^2=h^1+h^2 F=F2=h1+h2,其中 h 1 , h 2 h^1,h^2 h1,h2分别基于 x 1 x^1 x1 x 2 x^2 x2

区分数据集是否独立,我们有以下两个推论:

  • 如果使用了规模为 n n n的两个独立数据集 D ∗ 1 \mathcal{D}*1 D1 D 2 \mathcal{D}_2 D2来分别估算 h 1 h^1 h1 h 2 h^2 h2,则对于任意 x ∈ 0 , 1 2 x \in {{0,1}}^2 x0,12,有: E ∗ D 1 , D 2   F 2 ( X ) = f ∗ ( X ) + O ( 1 2 n ) \mathbb{E}* {\mathcal{D}_1,\mathcal{D}_2}\,F^2(X)=f^*(X)+O(\frac{1}{2^n}) ED1,D2F2(X)=f(X)+O(2n1)
  • 如果使用了相同的数据集 D \mathcal{D} D来估算 h 1 h^1 h1 h 2 h^2 h2,则有: E D 1 , D 2   F 2 ( X ) = f ∗ ( X ) + O ( 1 2 n ) − 1 n − 1 c 2 ( x 2 − 1 2 \mathbb{E}_{\mathcal{D}_1,\mathcal{D}_2}\,F^2(X)=f^*(X)+O(\frac{1}{2^n})-\frac{1}{n-1}c_2(x^2-\frac{1}{2} ED1,D2F2(X)=f(X)+O(2n1)n11c2(x221

显然,偏差部分 1 n − 1 c 2 ( x 2 − 1 2 \frac{1}{n-1}c_2(x^2-\frac{1}{2} n11c2(x221与数据集的规模 n n n成反比,与映射关系 f ∗ f^* f也有关系,在我们的例子当中,与 c 2 c_2 c2成正比。

Ordered boosting

为了克服上一节所描述的预测偏移问题,我们提出了一种新的叫做Ordered boosting的算法。假设用 I I I棵树来学习一个模型,为了确保 r I − 1 ( X k , y k ) r^{I-1}(X_k,y_k) rI1(Xk,yk)无偏,需要确保模型 F I − 1 F^{I-1} FI1的训练没有用到样本 X k X_k Xk。由于我们需要对所有训练样本计算无偏的梯度估计,乍看起来对于 F I − 1 F^{I-1} FI1的训练不能使用任何样本,貌似无法实现的样子,但是事实上可以通过一些技巧来进行克服,具体的算法在前面已经有所描述,而且是作者较新的论文当中的描述,这里不再赘述。本节主要讲讲Ordered boosting的具体实现。

Ordered boosting算法好是好,但是在大部分的实际任务当中都不具备使用价值,因为需要训练 n n n个不同的模型,大大增加的内存消耗和时间复杂度。在CatBoost当中,我们实现了一个基于GBDT框架的修改版本。

前面提到过,在传统的GBDT框架当中,构建下一棵树分为两个阶段:选择树结构和在树结构固定后计算叶子节点的值。CatBoost主要在第一阶段进行优化。

First phase

在建树的阶段,CatBoost有两种提升模式,Ordered和Plain。Plain模式是采用内建的ordered TS对类别型特征进行转化后的标准GBDT算法。Ordered则是对Ordered boosting算法的优化。

Ordered boosting mode

一开始,CatBoost对训练集产生 s + 1 s+1 s+1个独立的随机序列。序列 σ 1 , . . . , σ s \sigma_1,...,\sigma_s σ1,...,σs用来评估定义树结构的分裂, σ 0 \sigma_0 σ0用来计算所得到的树的叶子节点的值。因为,在一个给定的序列当中,对于较短的序列,无论是TS的计算还是基于Ordered boosting的预测都会有较大的方差,所以仅仅用一个序列可能引起最终模型的方差,这里我们会有多个序列进行学习。

CatBoost采用对称树作为基学习器,对称意味着在树的同一层,其分裂标准都是相同的。对称树具有平衡、不易过拟合并能够大大减少测试时间的特点。建树的具体算法如下伪码描述。

在Ordered boosting模式的学习过程当中,我们维持一个模型 M r , j M_{r,j} Mr,j,其中 M r , j ( i ) M_{r,j}(i) Mr,j(i)表示基于在序列 σ r \sigma_r σr当中的前 j j j个样本学习得到的模型对于第 i i i个样本的预测。在算法的每一次迭代 t t t,我们从 σ 1 , . . . , σ s {\sigma_1,...,\sigma_s} σ1,...,σs当中抽样一个随机序列 σ r \sigma_r σr,并基于此构建第 t t t步的学习树 T t T_t Tt。然后,基于 M r , j ( i ) M_{r,j}(i) Mr,j(i),计算相应的梯度 g r a d r , j ( i ) = ∂ L ( y i , s ) ∂ s ∣ ∗ s = M ∗ r , j ( i ) grad_{r,j}(i)=\frac{\partial L(y_i,s)}{\partial s}|*{s=M* {r,j}(i)} gradr,j(i)=sL(yi,s)s=Mr,j(i)。接下来,我们会用余弦相似度来近似梯度 G G G,其中对于每一个样本 i i i,我们取梯度 g r a d r , σ ( i ) − 1 ( i ) grad_{r,\sigma(i)-1}(i) gradr,σ(i)1(i)。在候选分裂评估过程当中,第 i i i个样本的叶子节点的值 δ ( i ) \delta(i) δ(i)由与 i i i同属一个叶子的 l e a f r ( i ) leaf_r(i) leafr(i)的所有样本的前 p p p个样本的梯度值 g r a d r , σ ( i ) − 1 grad_{r,\sigma(i)-1} gradr,σ(i)1求平均得到。需要注意的是, l e a f r ( i ) leaf_r(i) leafr(i)取决于选定的序列 σ r \sigma_r σr,因为 σ r \sigma_r σr会影响第 i i i个样本的Ordered TS。当树 T t T_t Tt的结构确定以后,我们用它来提升所有的模型KaTeX parse error: Expected group after '^' at position 5: M_{r^̲',j},我们需要强调下,一个相同的树结构 T t T_t Tt会被用于所有的模型,但是会根据KaTeX parse error: Expected group after '^' at position 2: r^̲' j j j的不同设置不同的叶子节点的值以后应用于不同的模型。

Plain boosting mode

Plain boosting模式的算法与标准GBDT流程类似,但是如果出现了类别型特征,它会基于 σ 1 , . . . , σ s \sigma_1,...,\sigma_s σ1,...,σs得到的TS维持 s s s个支持模型 M r M_r Mr

Second phase

当所有的树结构确定以后,最终模型的叶子节点值的计算与标准梯度提升过程类似。第 i i i个样本与叶子 l e a f 0 ( i ) leaf_0(i) leaf0(i)进行匹配,我们用 σ 0 \sigma_0 σ0来计算这里的TS。当最终模型 F F F在测试期间应用于新的样本,我们采用整个训练集来计算TS。

GPU加速

就GPU内存使用而言,CatBoost至少与LightGBM一样有效,CatBoost的GPU实现可支持多个GPU,分布式树学习可以通过样本或特征进行并行化。

sklearn参数

sklearn本身的文档当中并没有CatBoost的描述,CatBoost python-reference_parameters-list上面看到主要参数如下:

  • iterations: 迭代次数, 解决机器学习问题能够构建的最大树的数目,default=1000

  • learning_rate: 学习率,default=0.03

  • depth: 树的深度,default=6

  • l2_leaf_reg: L 2 L_2 L2正则化数,default=3.0

  • model_size_reg:模型大小正则化系数,数值越到,模型越小,仅在有类别型变量的时候起作用,取值范围从0到 + ∞ +\infty +,GPU计算时不可用, default=None

  • rsm: =None,

  • loss_function: 损失函数,字符串 (分类任务,default=Logloss,回归任务,default=RMSE)

  • border_count: 数值型变量的分箱个数

    • CPU:1~65535的整数,default=254
    • GPU:1~255的整数,default=128
  • feature_border_type: 数值型变量分箱个数的初始量化模式,default=GreedyLogSum

  • Median

  • Uniform

  • UniformAndQuantiles

  • MaxLogSum

  • MinEntropy

  • GreedyLogSum

  • per_float_feature_quantization: 指定特定特征的分箱个数,default=None,

  • input_borders=None,

  • output_borders=None,

  • fold_permutation_block: 对数据集进行随机排列之前分组的block大小,default=1

  • od_pval: 过拟合检测阈值,数值越大,越早检测到过拟合,default=0

  • od_wait: 达成优化目标以后继续迭代的次数,default=20

  • od_type: 过拟合检测类型,default=IncToDec

    • IncToDec
    • Iter
  • nan_mode: 缺失值的预处理方法,字符串类型,default=Min

  • Forbidden: 不支持缺失值

  • Min: 缺失值赋值为最小值

  • Max: 缺失值赋值为最大值

  • counter_calc_method: 计算Counter CTR类型的方法,default=None

  • leaf_estimation_iterations: 计算叶子节点值时候的迭代次数,default=None,

  • leaf_estimation_method: 计算叶子节点值的方法,default=Gradient

    • Newton
    • Gradient
  • thread_count: 训练期间的进程数,default=-1,进程数与部件的核心数相同

  • random_seed: 随机数种子,default=0

  • use_best_model: 如果有设置eval_set设置了验证集的话可以设为True,否则为False

  • verbose: 是否显示详细信息,default=1

  • logging_level: 打印的日志级别,default=None

  • metric_period: 计算优化评估值的频率,default=1

  • ctr_leaf_count_limit: 类别型特征最大叶子数,default=None

  • store_all_simple_ctr: 是否忽略类别型特征,default=False

  • max_ctr_complexity: 最大特征组合数,default=4

  • has_time: 是否采用输入数据的顺序,default=False

  • allow_const_label: 使用它为所有对象用具有相同标签值的数据集训练模型,default=None

  • classes_count: 多分类当中类别数目上限,defalut=None

  • class_weights: 类别权重,default=None

  • one_hot_max_size: one-hot编码最大规模,默认值根据数据和训练环境的不同而不同

  • random_strength: 树结构确定以后为分裂点进行打分的时候的随机强度,default=1

  • name: 在可视化工具当中需要显示的实验名字

  • ignored_features: 在训练当中需要排除的特征名称或者索引,default=None

  • train_dir: 训练过程当中文件保存的目录

  • custom_loss: 用户自定义的损失函数

  • custom_metric: 自定义训练过程当中输出的评估指标,default=None

  • eval_metric: 过拟合检测或者最优模型选择的评估指标

  • loss-functions

  • bagging_temperature: 贝叶斯bootstrap强度设置,default=1

  • save_snapshot: 训练中断情况下保存快照文件

  • snapshot_file: 训练过程信息保存的文件名字

  • snapshot_interval: 快照保存间隔时间,单位秒

  • fold_len_multiplier: 改变fold长度的系数,default=2

  • used_ram_limit: 类别型特征使用内存限制,default=None

  • gpu_ram_part: GPU内存使用率,default=0.95

  • allow_writing_files: 训练过程当中允许写入分析和快照文件,default=True

  • final_ctr_computation_mode: Final CTR计算模式

  • approx_on_full_history: 计算近似值的原则,default=False

  • boosting_type: 提升模式

    • Ordered
    • Plain
  • simple_ctr: 单一类别型特征的量化设置

  • CtrType

  • TargetBorderCount

  • TargetBorderType

  • CtrBorderCount

  • CtrBorderType

  • Prior

  • combinations_ctr: 组合类别型特征的量化设置

    • CtrType
    • TargetBorderCount
    • TargetBorderType
    • CtrBorderCount
    • CtrBorderType
    • Prior
  • per_feature_ctr: 以上几个参数的设置具体可以细看下面的文档

  • Categorical features

  • task_type: 任务类型,CPU或者GPU,default=CPU

  • device_config: =None

  • devices: 用来训练的GPU设备号,default=NULL

  • bootstrap_type: 自采样类型,default=Bayesian

    • Bayesian
    • Bernoulli
    • MVS
    • Poisson
    • No
  • subsample: bagging的采样率,default=0.66

  • sampling_unit: 采样模式,default=Object

  • Object

  • Group

  • dev_score_calc_obj_block_size: =None,

  • max_depth: 树的最大深度

  • n_estimators: 迭代次数

  • num_boost_round: 迭代轮数

  • num_trees: 树的数目

  • colsample_bylevel: 按层抽样比例,default=None

  • random_state: 随机数状态

  • reg_lambda: 损失函数 L 2 L_2 L2范数,default=3.0

  • objective: =同损失函数

  • eta: 学习率

  • max_bin: =同border_coucnt

  • scale_pos_weight: 二分类任务当中1类的权重,default=1.0

  • gpu_cat_features_storage: GPU训练时类别型特征的存储方式,default=GpuRam

    • CpuPinnedMemory
    • GpuRam
  • data_partition: 分布式训练时数据划分方法

  • 特征并行

  • 样本并行

  • metadata: =None

  • early_stopping_rounds: 早停轮次,default=False

  • cat_features: =指定类别型特征的名称或者索引

  • grow_policy: 树的生长策略

  • min_data_in_leaf: 叶子节点最小样本数,default=1

  • min_child_samples: 叶子节点最小样本数,default=1

  • max_leaves: 最大叶子数,default=31

  • num_leaves: 叶子数

  • score_function: 建树过程当中的打分函数

  • leaf_estimation_backtracking: 梯度下降时回溯类型

  • ctr_history_unit: =None

  • monotone_constraints: =None

如果有遗漏,具体可以参阅CatBoost python-reference_parameters-list

区分具体的机器学习任务有:

CatBoostClassifier

CatBoostClassifier

class CatBoostClassifier(iterations=None,
                         learning_rate=None,
                         depth=None,
                         l2_leaf_reg=None,
                         model_size_reg=None,
                         rsm=None,
                         loss_function=None,
                         border_count=None,
                         feature_border_type=None,
                         per_float_feature_quantization=None,                       
                         input_borders=None,
                         output_borders=None,
                         fold_permutation_block=None,
                         od_pval=None,
                         od_wait=None,
                         od_type=None,
                         nan_mode=None,
                         counter_calc_method=None,
                         leaf_estimation_iterations=None,
                         leaf_estimation_method=None,
                         thread_count=None,
                         random_seed=None,
                         use_best_model=None,
                         verbose=None,
                         logging_level=None,
                         metric_period=None,
                         ctr_leaf_count_limit=None,
                         store_all_simple_ctr=None,
                         max_ctr_complexity=None,
                         has_time=None,
                         allow_const_label=None,
                         classes_count=None,
                         class_weights=None,
                         one_hot_max_size=None,
                         random_strength=None,
                         name=None,
                         ignored_features=None,
                         train_dir=None,
                         custom_loss=None,
                         custom_metric=None,
                         eval_metric=None,
                         bagging_temperature=None,
                         save_snapshot=None,
                         snapshot_file=None,
                         snapshot_interval=None,
                         fold_len_multiplier=None,
                         used_ram_limit=None,
                         gpu_ram_part=None,
                         allow_writing_files=None,
                         final_ctr_computation_mode=None,
                         approx_on_full_history=None,
                         boosting_type=None,
                         simple_ctr=None,
                         combinations_ctr=None,
                         per_feature_ctr=None,
                         task_type=None,
                         device_config=None,
                         devices=None,
                         bootstrap_type=None,
                         subsample=None,
                         sampling_unit=None,
                         dev_score_calc_obj_block_size=None,
                         max_depth=None,
                         n_estimators=None,
                         num_boost_round=None,
                         num_trees=None,
                         colsample_bylevel=None,
                         random_state=None,
                         reg_lambda=None,
                         objective=None,
                         eta=None,
                         max_bin=None,
                         scale_pos_weight=None,
                         gpu_cat_features_storage=None,
                         data_partition=None
                         metadata=None, 
                         early_stopping_rounds=None,
                         cat_features=None, 
                         grow_policy=None,
                         min_data_in_leaf=None,
                         min_child_samples=None,
                         max_leaves=None,
                         num_leaves=None,
                         score_function=None,
                         leaf_estimation_backtracking=None,
                         ctr_history_unit=None,
                         monotone_constraints=None)

CatBoostRegressor

CatBoostRegressor

class CatBoostRegressor(iterations=None,
                        learning_rate=None,
                        depth=None,
                        l2_leaf_reg=None,
                        model_size_reg=None,
                        rsm=None,
                        loss_function='RMSE',
                        border_count=None,
                        feature_border_type=None,
                        per_float_feature_quantization=None,
                        input_borders=None,
                        output_borders=None,
                        fold_permutation_block=None,
                        od_pval=None,
                        od_wait=None,
                        od_type=None,
                        nan_mode=None,
                        counter_calc_method=None,
                        leaf_estimation_iterations=None,
                        leaf_estimation_method=None,
                        thread_count=None,
                        random_seed=None,
                        use_best_model=None,
                        best_model_min_trees=None,
                        verbose=None,
                        silent=None,
                        logging_level=None,
                        metric_period=None,
                        ctr_leaf_count_limit=None,
                        store_all_simple_ctr=None,
                        max_ctr_complexity=None,
                        has_time=None,
                        allow_const_label=None,
                        one_hot_max_size=None,
                        random_strength=None,
                        name=None,
                        ignored_features=None,
                        train_dir=None,
                        custom_metric=None,
                        eval_metric=None,
                        bagging_temperature=None,
                        save_snapshot=None,
                        snapshot_file=None,
                        snapshot_interval=None,
                        fold_len_multiplier=None,
                        used_ram_limit=None,
                        gpu_ram_part=None,
                        pinned_memory_size=None,
                        allow_writing_files=None,
                        final_ctr_computation_mode=None,
                        approx_on_full_history=None,
                        boosting_type=None,
                        simple_ctr=None,
                        combinations_ctr=None,
                        per_feature_ctr=None,
                        ctr_target_border_count=None,
                        task_type=None,
                        device_config=None,                      
                        devices=None,
                        bootstrap_type=None,
                        subsample=None,                      
                        sampling_unit=None,
                        dev_score_calc_obj_block_size=None,
                        max_depth=None,
                        n_estimators=None,
                        num_boost_round=None,
                        num_trees=None,
                        colsample_bylevel=None,
                        random_state=None,
                        reg_lambda=None,
                        objective=None,
                        eta=None,
                        max_bin=None,
                        gpu_cat_features_storage=None,
                        data_partition=None,
                        metadata=None,
                        early_stopping_rounds=None,
                        cat_features=None,
                        grow_policy=None,
                        min_data_in_leaf=None,
                        min_child_samples=None,
                        max_leaves=None,
                        num_leaves=None,
                        score_function=None,
                        leaf_estimation_backtracking=None,
                        ctr_history_unit=None,
                        monotone_constraints=None)

应用场景

作为GBDT框架内的算法,GBDT、XGBoost、LightGBM能够应用的场景CatBoost也都适用,并且在处理类别型特征具备独有的优势,比如广告推进领域。

优缺点

优点

  • 能够处理类别特征
  • 能够有效防止过拟合
  • 模型训练精度高
  • 调参时间相对较多

缺点

  • 对于类别特征的处理需要大量的内存和时间
  • 不同随机数的设定对于模型预测结果有一定的影响

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1872830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专业好用的数据恢复软件(iTop Data Recovery Pro v4.4.0.687 激活版 )

前言 由于 iTop 独特的恢复算法&#xff0c;这个强大的数据恢复工具加快了扫描和数据恢复过程。您无需等待很长时间即可取回数据。只需几分钟&#xff0c;您就可以按预期完美找回已删除的文件。此外&#xff0c;扫描选项多种多样&#xff0c;可满足不同的需求。您可以通过位置…

《昇思25天学习打卡营第3天 | 昇思MindSpore数据集 Dataset》

第三天 今天学习了不同的数据集加载方式、数据集常见操作和自定义数据集方法。 1.数据集加载。 以Mnist数据集为例。mindspore.dataset提供的接口仅支持解压后的数据文件&#xff0c;因此我们使用download库下载数据集并解压。 2.数据集迭代。 用create_tuple_iterator或create…

Android (已解决)Gradle 编译失败 Unsupported class file major version 61

文章目录 一、报错原因二、解决方法 一、报错原因 新版本的 Android Studio 默认使用的是 Java 17 LTS&#xff0c;而这个历史项目的 Gradle 版本很低&#xff0c;不支持高版本的 Java。 具体原因&#xff1a;Java 17 (major version 61) 编译的 class 文件&#xff0c;如果在…

重磅更新-UniApp自定义字体可视化设计

重磅更新-UniApp自定义字体可视化设计。 DIY可视化为了适配不同APP需要&#xff0c;支持用户自定义字体&#xff0c;自定义字体后&#xff0c;设计出来的界面更多样化&#xff0c;不再是单一字体效果。用户可以使用第三方字体加入设计&#xff0c;在设计的时候选择上自己的字体…

[数据集][目标检测]水面垃圾水面漂浮物检测数据集VOC+YOLO格式3749张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3749 标注数量(xml文件个数)&#xff1a;3749 标注数量(txt文件个数)&#xff1a;3749 标注…

开启网络监控新纪元:免费可视化工具助力网络信息链路拓扑监控大屏

在数字化浪潮汹涌的今天&#xff0c;网络已成为我们生活、工作的不可或缺的一部分。然而&#xff0c;你是否曾经想过&#xff0c;在这个庞大的网络世界中&#xff0c;是谁在默默守护着每一条信息的传输&#xff0c;确保我们的数据安全、稳定地抵达目的地&#xff1f; 网络信息链…

C# 在WPF .net8.0框架中使用FontAwesome 6和IconFont图标字体

文章目录 一、在WPF中使用FontAwesome 6图标字体1.1 下载FontAwesome1.2 在WPF中配置引用1.2.1 引用FontAwesome字体文件1.2.2 将字体文件已资源的形式生成 1.3 在项目中应用1.3.1 使用方式一&#xff1a;局部引用1.3.2 使用方式二&#xff1a;单个文件中全局引用1.3.3 使用方式…

Transformer教程之Encoder-Decoder架构

在当今的自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Transformer已经成为不可或缺的模型。它以其高效的并行计算和卓越的性能在多个任务中占据了主导地位。在这篇文章中&#xff0c;我们将深入探讨Transformer的核心——Encoder-Decoder架构&#xff0c;帮助大家…

可燃气体报警器:广东深圳五金行业的安全守护者

在广东深圳这一五金制造与集散的重地&#xff0c;安全问题一直受到业界和社会的高度重视。在五金行业的日常运营中&#xff0c;可燃气体作为能源的重要来源&#xff0c;其安全使用与监控显得尤为重要。 可燃气体报警器作为保障生产安全的重要设备&#xff0c;在五金行业中扮演…

入门机器视觉的正确打开方式——徒手撸一个python+opencv实现的机器视觉简易调试工具(下)

目录 1.引言2.框架思路3.图像处理流程化的实现3.1如何解析图像流程数据结构3.2 使用networkx网络图库3.3 python实现 4.结论5.python源码PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源 1.引言 在当今AI时代&#xff0c;关于视觉…

【JPCS独立出版】第四届机电一体化技术与航空航天工程国际学术会议(ICMTAE 2024,8月2-4)

第四届机电一体化技术与航空航天工程国际学术会议&#xff08;ICMTAE 2024&#xff09;将围绕“机电一体化”、“电工与电子技术”、“航天工程”与“航空工程”等相关最新研究领域&#xff0c; 为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供…

【语言模型】Xinference的部署过程

一、引言 Xinference&#xff0c;也称为Xorbits Inference&#xff0c;是一个性能强大且功能全面的分布式推理框架&#xff0c;专为各种模型的推理而设计。无论是研究者、开发者还是数据科学家&#xff0c;都可以通过Xinference轻松部署自己的模型或内置的前沿开源模型。Xinfe…

【MTK平台】如何学习Bluedroid A2DP Code

一 Bluedroid A2DP架构图 备注: vendor/mediatek/proprietary/packages/modules/Bluetooth/system/audio_a2dp_hw/src 目录下编译生成audio.a2dp.default.so,主要实现a2dp做为设备的功能 二 A2DP File Hierarchy ModuleFileDescriptionAudio HAL (hardware/libhardware/…

好用的兼容性测试工具推荐

兼容性测试确保软件在不同系统和环境中的一致性。本指南探讨了开发人员和QA专业人员有效检测和解决问题的工具&#xff0c;从而提高应用程序的稳健性和用户满意度。 好用的兼容性测试工具推荐 1.Lambda测试 它是一个由AI驱动的测试编排和执行平台&#xff0c;可让您使用超过300…

微信小程序在线客服源码系统 附带完整的安装代码包以及搭建部署教程

系统概述 微信小程序在线客服源码系统是一款基于微信小程序的客服解决方案&#xff0c;它集成了实时通讯、聊天记录保存、智能机器人客服、自定义消息通知、多客服协同工作、客户信息管理、数据统计与分析等多项功能。该系统采用云端架构&#xff0c;确保数据的安全性和可恢复…

北京小程序开发如何选择开发团队与开发语言?

随着移动互联网的飞速发展&#xff0c;小程序的开发与使用也变得越来越频繁。对于商户来说&#xff0c;市面上的小程序开发团队数量众多又鱼龙混杂&#xff0c;应该如何选择合适的开发团队与开发语言呢&#xff1f; 一&#xff0e; 北京小程序的开发语言的种类及不同 北京小程…

正版软件 | WIFbox:智能化文件管理工具,让效率与隐私并行

在数字化办公日益普及的今天&#xff0c;文件管理成为了提升工作效率的关键。WIFbox 一款智能文件管理工具&#xff0c;利用强大的人工智能技术&#xff0c;帮助您快速对文件进行分类&#xff0c;完成复杂的智能文件分类任务。 智能分类&#xff0c;效率倍增 WIFbox 通过精细化…

三河市寄大件物品快递多少钱?

在三河市&#xff0c;如果你需要寄送大件物品&#xff0c;费用问题无疑是你最关心的。不同的快递公司收费标准各异&#xff0c;今天&#xff0c;就让我们来探讨一下&#xff0c;从三河市寄大件物品&#xff0c;哪家快递更划算。 1. 祺祺寄快递&#xff1a; “祺祺寄快递”是一…

Vscode lanuch.json

Intro 使用launch.json 能够方便的运行需要传很多参数的代码文件 如下&#xff1a; import math import argparse # 1、导入argpase包def parse_args():parse argparse.ArgumentParser(descriptionCalculate cylinder volume) # 2、创建参数对象parse.add_argument(--rad…

【原创教程】FX5UCPU扩展FX3模拟量模块应用案例(新手篇)

模块配置 名称 型号 数量 PLC FX5U-64MR/ES 1个 总线转换模块 FX5U-CNV-BUS 1个 FX3U模拟量输入模块 FX3U-4AD 2个 ①硬件配置 扩展FX3模块时,若在总线转换模块后面添加了FX3扩展电源模块,则最多可添加8个FX3智能模块,否则最多6个。 ②软件配置