CatBoost是一种基于对称决策树(oblivious trees)为基学习器实现的参数较少、支持类别型变量和高准确性的GBDT框架,是俄罗斯搜索公司Yandex在2017年开源的机器学习框架,属于Boosting算法族。Catboost和XGBoost、LightGBM并称为GBDT三大主流神器,都是基于GBDT算法的一种改进实现。
最早的XGBoost算法首次于2014年3月被陈天奇提出,2017年1月微软发布了LGBM的第一个稳定版本,2017年4月Yandex开源了Catboost。后两者是对XGBoost的一种改进。
CatBoost擅长处理类别型特征,可直接传入类别型特征的列标识,模型会自动对其进行独热编码,还可以通过设置one_hot_max_size
参数来限制独热特征向量的长度。如果不传入类别型特征的列标识,那么CatBoost会把所有列视为数值特征。对于独热编码超过设定的one_hot_max_size
值的特征来说,CatBoost将会使用一种高效的encoding方法,与mean encoding类似,但是会降低过拟合。处理过程如下:
LGBM和CatBoost类似,也可以通过使用特征名称的输入来处理类别型特征数据,它没有对数据进行独热编码,因此速度比独热编码快很多。需要注意的是,在建立适用于LGBM的数据集之前,需要将类别型特征变量转化为整形变量,因为该算法不允许将字符串数据传给类别型变量参数。
XGBoost和CatBoost、LGBM不同,其本身无法处理类别型特征,而是像随机森林一样,只接收数值数据。因此在将类别型特征数据传入XGBoost之前,必须通过各种编码方式:例如独热编码等对数据进行预处理。
优点:
- 性能卓越:在性能方面可以匹敌任何先进的机器学习算法;
- 鲁棒性:减少了很多超参数调优的需求,降低了过拟合的几率,使得模型繁华性能更强;
- 易于扩展:支持自定义损失函数;
- 实用:可以处理类别型、数值型特征。
缺点:
- 处理类别型特征时需要消耗大量的内存和时间;
- 不同随机数的设定对模型预测结果有一定影响。
所谓类别型特征,即这类特征不是数值型特征,而是离散的集合,比如省份名(山东、山西、河北等),城市名(北京、上海、深圳等),学历(本科、硕士、博士等)。在梯度提升算法中,最常用的是将这些类别型特征转为数值型来处理,一般类别型特征会转化为一个或多个数值型特征。
如果某个类别型特征基数比较低(low-cardinality feature),即该特征的所有值去重后构成的集合元素个数比较少,一般利用One-hot编码方法将特征值转为数值型。One-hot编码可以在数据预处理时完成,也可以在模型训练时完成,从训练时间的角度,后一种方法的实现更为高效,CatBoost对于基数较低的类别特征采取的是后一种方式。
在高基数类别特征(high-cardinality feature)中,比如user-ID
,这种编码方式会产生大量新的特征,造成维度灾难。一种折中的办法是可以将类别分组成有限个的群体再进行独热编码。一种常用的方法是根据目标变量统计(Target Statistics, TS)进行分组,目标变量统计用于估算每个类别的目标变量期望值。甚至有人直接用TS作为一个新的数值型变量来代替原来的类别型变量。重要的是,可以通过对TS数值型特征阈值设置,给予对数损失、基尼系数或者均方差,得到一个对于训练集而言将类别一分为二的所有可能划分当中最优的那个。在LGBM中,类别型特征用每一步梯度提升时的梯度统计(Gradient Statistics, GS)来表示。虽然为建树提供了重要的信息,但是有两个缺点:
为了克服这些缺点,LGBM以损失部分信息为代价将所有的长尾类别归为一类,这样要处理高基数类别特征时要比独热编码好不少。不过如果采用TS特征,那么对于每个类别只需要计算和存储一个数字。
因此,采用TS作为一个新的数值型特征时最有效、信息损失最小的处理类别特征的方法,该方法也被广泛应用在点击预测任务当中,这个场景当中的类别型特征有用户、地区、广告、广告发布者等。
CatBoost算法设计初衷是为了更好地处理GBDT特征中的类别特征。在处理时,最简单的方法是用类别特征对应的标签的平均值来替换。在决策树中,标签平均值将作为节点分裂的标准。这种方法被称为Greedy Target-based Statistics,简称Greedy TS,用公式来表达就是:
x ^ k i = ∑ j = 1 n [ x j , k = x i , k ] ? Y i ∑ j = 1 n [ x j , k = x i , k ] \hat{x}_k^i = \frac{\sum_{j=1}^n[x_{j,k}=x_{i,k}]\cdot Y_i}{\sum_{j=1}^n[x_{j,k}=x_{i,k}]} x^ki?=∑j=1n?[xj,k?=xi,k?]∑j=1n?[xj,k?=xi,k?]?Yi??
这种方法有一个显而易见的缺陷,就是通常特征比标签包含更多的信息,如果强行用标签的平均值来表示特征的话,当训练数据集和测试数据集数据结构和分布不一样的时候会出现条件偏移问题。
一些改进Greedy TS的方法,如:Holdout TS、Leave-one-out TS、Ordered TS,参考论文<<CatBoost:unbiased boosting with categorical features>>.
值得注意的是几个类别特征的任意组合都可视为新的特征。例如,在音乐推荐应用中,我们有两个类别型特征:用户ID和音乐流派。如果有些用户更喜欢摇滚乐,将用户ID和音乐流派转换为数字特征时,根据上述这些信息就会丢失。结合这两个特征就可以解决这个问题,并且可以得到一个新的强大的特征。然而,组合的数量会随着数据集中类别型特征的数量成指数增长,因此不可能在算法中考虑所有组合。为当前树构造新的分割点时,CatBoost会采用贪婪的策略考虑组合。对于树的第一次分割,不考虑任何组合。对于下一个分割,CatBoost将当前树的所有组合、类别型特征与数据集中的所有类别型特征相结合,并将新的组合类别型特征动态地转换为数值型特征。
CatBoost还通过以下方式生成数值型特征和类别型特征的组合:树中选定的所有分割点都被视为具有两个值的类别型特征,并像类别型特征一样被进行组合考虑。
Liudmila Prokhorenkova et al.(2017). CatBoost: unbiased boosting with categorical features.