CatBoost
1.介绍
CatBoost(categorical boosting)是一种能够很好地处理类别型特征的梯度提升算法库。该库中的学习算法基于GPU实现,打分算法基于CPU实现。
2. 类别型特征处理
首先对categorical features做一些统计,计算某个类别特征(category)出现的频率,之后加上超参数,生成新的数值型特征(numerical features)。
类别型特征
这类特征不是数值型特征,而是离散的集合,比如省份名(山东,山西,河北等)。在梯度提升算法中,最常用的是将这些类别型特征转为数值型来处理,一般类别型特征会转化为一个或多个数值型特征。如果某个类别型特征基数比较低,即该特征的所有值去重后构成的集合元素个数比较少,一般利用one-hot编码方法将特征转为数值型。
类别特征》》数值型特征
- 序列编码:一般处理类别间具有大小关系的数据,例如期末成绩的 [A, B, C, D] 四挡可以直接转化为 [0, 1, 2, 3]。在转化后,依然保持类别之间的顺序关系。
- 独热编码:使用独热编码,对每种血型赋予不同的权重:
A - [1, 0, 0, 0]
B - [0, 1, 0, 0]
AB - [0, 0, 1, 0]
O - [0, 0, 0, 1] - 二进制编码:先使用序列编码转化为数值形式,再将数值转义成二进制的方式,使得编码更加紧凑,节省存储空间。
- 统计编码:统计各类别在训练集中出现的频率,并将频率作为新的特征。在某些情况下,具有统计意义的统计编码也是一种值得尝试的技巧。
CatBoot的解决办法
将离散特征的处理过程与标签关联起来。
首先对所有样本进行随机排序,然后针对类别型特征中的某个取值,每个样本的该特征转为数值型时都是基于排在该样本之前的类别标签取均值,同时加入了优先级和优先级的权重系数。公式示例如下:
∑
j
=
1
p
−
1
[
x
σ
j
,
k
=
x
σ
p
,
k
]
Y
σ
j
+
a
⋅
P
∑
j
=
1
p
−
1
[
x
σ
j
,
k
=
x
σ
p
,
k
]
+
a
\frac{\sum_{j=1}^{p-1}[x_{\sigma_j,k}=x_{\sigma_p,k}]Y_{\sigma_j}+a\cdot P}{\sum_{j=1}^{p-1}[x_{\sigma_j,k}=x_{\sigma_p,k}]+a}
∑j=1p−1[xσj,k=xσp,k]+a∑j=1p−1[xσj,k=xσp,k]Yσj+a⋅P
上面的
σ
j
\sigma_j
σj表示第j条数据,k表示第k个特征。括号就是指示函数,符合里面的条件就为1,否则就为0
.这种做法可以降低类别特征中低频次特征带来的噪声。
3.组合类别特征
考虑使用categorical features的不同组合。例如颜色和种类组合起来,可以构成类似于blue dog这样的feature。
方法
当需要组合的categorical features变多时,catboost只考虑一部分combinations。
在选择第一个节点时,只考虑选择一个feature,例如A。
在生成第二个节点时,考虑A和任意一个categorical feature的组合,选择其中最好的。
就这样使用贪心算法生成combinations。
4.Leaf_values
传统的boosting使用平均数:
∑ i = 1 n g ( a p p r o x ( i ) , t a r g e t ( i ) ) n \sum_{i=1}^n \frac{g(approx(i),target(i))}{n} i=1∑nng(approx(i),target(i))
catboost采用另外的计算方法:
∑ i = 1 d o c g ( a p p r o x ( i ) , t a r g e t ( i ) ) d o c s i n t h e p a s t \sum_{i=1}^{doc} \frac{g(approx(i),target(i))}{docs in the past} i=1∑docdocsinthepastg(approx(i),target(i))