Catboost 原论文笔记及操作实例
一、Catboost是什么?
CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,是Categorical Features(类别型特征)+Gradient Boosting(梯度提升) ,也是基于梯度提升决策树的机器学习框架。
大多数流行的梯度提升算法利用决策树作为基本预测器。对于数值型特征使用决策树很方便,但是实际中,许多数据集包括类别型特征,这些特征对预测也很重要。类别型特征具有离散的值,比如省份名(山东,山西,河北等),城市名(北京,上海,南京等)。梯度提升算法中处理这类特征的最常用的方法就是在学习之前,也就是数据预处理阶段,将这些特征的值转换为数字。一般类别型特征会转化为一个或多个数值型特征(one-hot编码等)。
而Catboost从名字就可以看出:可以很好的处理类别型特征的梯度提升算法,该算法的改进之处就在于在学习的时候处理这些特征,而不是在数据预处理阶段,不需要任何显式的预处理来将类别转换为数字。
二、Catboost 的原理
Catboost引入了两个关键的算法改进——实现了有序提升,排列驱动以代替经典算法和用于处理分类特征的创新算法。这些方法旨在解决prediction shift(普遍存在于梯度提升算法中)。
2.1、类别型特征
一种有效的处理类别特征的方法就是:使用一个计算出的数值(target statistic (TS))来代替,即第 k k k个训练样本的第 i i i个类别特征( x k i x_k^i xki),通常根据类别条件估计预期目标y,表达式为: x ^ k i = E ( y ∣ x i = x k i ) \hat{x}_k^i = E(y|x^i = x_k^i) x^ki=E(y∣xi=xki)
2.1.1、Greedy TS
在决策树中,标签平均值将作为节点分裂的标准。这种方法被称为 Greedy Target Statistics , 简称 Greedy TS,用公式来表达就是:
x ^ k i = ∑ j = 1 n I { x j i = x k i } ⋅ y j ∑ j = 1 n I { x j i = x k i } \hat{x}_k^i = \frac{\sum_{j=1}^nI_{\{x_j^i=x_k^i\}}\cdot y_j} {\sum_{j=1}^nI_{\{x_j^i = x_k^i\}}} x^ki=∑j=1nI{
xji=xki}∑j=1nI{
xji=xki}⋅yj
这里的 I I I是 Iverson brackets(指示函数),即括号里的两个相等时取1,否则取0:
{ x j i = x k i } = { x j i = x k i 1 o t h e r w i s e 0 \{x_j^i = x_k^i\}=\begin{cases} x_j^i=x_k^i &1\\ otherwise &0 \end{cases} {
xji=xki}={
xji=xkiotherwise10
如果某个标称值 x k i x_k^i xki,只有一条记录的时候,则这个标称值转换成数字后就等于该记录的标签值。这样的处理过程,显然会造成过拟合。
对于这样的低频类别来说是有噪声的,通常用一些先验值p来平滑它:
x ^ k i = ∑ j = 1 n I { x j i = x k i } ⋅ y j + a ⋅ P ∑ j = 1 n I { x j i = x k i } + a \hat{x}_k^i = \frac{\sum_{j=1}^nI_{\{x_j^i=x_k^i\}}\cdot y_j+a\cdot P} {\sum_{j=1}^nI_{\{x_j^i = x_k^i\}}+a} x^ki=∑j=1nI{ xji=xki}+a∑j=1nI{ xji=x