一、CatBoost简介
CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,都是在GBDT算法框架下的一种改进实现。
正如其名字所说那样,CatBoost主要是在类别特征上的处理上做了很多的改进。
从用户使用角度来看,相比XGBoost和LightGBM,CatBoost具有如下特点。
-
模型精度:XGBoost和LightGBM相当,CatBoost往往略好一些,无需调参即可获取很好的结果。
-
训练速度:LightGBM远快于XGBoost,CatBoost快于XGBoost但比LightGBM慢。
-
预测速度:LightGBM与XGBoost相当,CatBoost远快于LightGBM与XGBoost,是它们的几十分之一。
-
内存消耗:LightGBM远小于XGBoost,CatBoost小于XGBoost,但大于LightGBM。
-
类别特征:XGBoost不支持类别特征,需要OneHot编码预处理。LightGBM支持类别特征,需转换成整数编码。CatBoost提供更强大的对类别特征的支持,直接支持字符串类型的类别特征,无需预处理。
-
缺失值特征:XGBoost和LightGBM都可以自动处理特征缺失值,CatBoost不能自动处理缺失值(或者将缺失值视为最小值/最大值)。
-
GPU支持:LightGBM与CatBoost支持GPU训练,XGBoost也支持GPU训练。
-
可视化:CatBoost还自带一套可视化工具,可以在Jupyter Notebook或者TensorBoard中实时看到指标变化。
CatBoost主要创新点如下:
-
类别特征的 Ordered Target Statistics 数值编码方法。
-
基于贪心策略的特征组合方法。
-
避免预测偏移的 Ordered Boosting 方法。
-
使用对称二叉树作为基模型,有正则作用且预测极快。
二、原理说明
1、类别特征的Ordered Target Statistics 数值编码方法
对于类别特征,如果类别数目不多,可以使用onehot编码。
但如果类别数量成百上千,使用onehot编码会导致特征数量爆炸。
CatBoost设计了一种基于预测目标统计值的方法可以将类别特征转化为数值特征。
以风控领域的预测信贷用户是否会违约为例,假设有一个类别特征是根据身份证号码解析出来的用户所出生的城市。
全国有几百个城市,转化为onehot编码会造成特征维数爆炸。
一种非常make sense 的方式是我们用某个城市用户的平均逾期率来作为该城市的数值特征编码。
简而言之,我们用如下方式将 city = "上海" 这一类别特征取值 代替为如下值。
city_numeric("上海") = sample_count(city="上海" and label=1(逾期)) / sample_count(city="上海")
这就是所谓的 Target Statistics 编码方法。
但是考虑到有一些小城市,比如黑龙江鹤岗市,可能在训练样本中数量很少甚至没有,这时候用训练样本中鹤岗市的用户平均逾期率来估计会比较不靠谱。
例如鹤岗市只有1个样本,并且这个样本是逾期的,那么数值编码
city_numeric("鹤岗") = sample_count(city="鹤岗" and label=1(逾期)) / sample_count(city="鹤岗") = 1.0
我们可以考虑加入先验值来抑制这种小样本的波动。
假设不区分城市,全部训练样本中用户的 逾期率 为 P = 0.1, 我们可以在分子分母上分别加入 a = 100个 逾期率为P 的先验样本。
city_numeric("鹤岗") = (sample_count(city="鹤岗" and label=1(逾期)) + a·P) / (sample_count(city="鹤岗")+ a) = 11/101
这样就合理多了。
这种数值编码方式虽然好,但是会造成训练集中 label的泄露,因为对于某个样本来说,其数值编码计算过程中已经把这个样本的 label值纳入了计算过程中。
未来要预测的验证集的数据分布未必与训练集相同,例如训练集中 上海市 用户的平均逾期率为 0.12,但是验证集中上海市用户的平均逾期率可能只有0.04,在训练集中这个 city_numeric特征可能会特别好用,特别重要,但是在验证集中可能会变得没有那么好用,没有那么重要。
为了让模型正确地评估 city_numeric 特征的真实有效性和重要程度,我们可以拿出一部分数据来计算这个 特征编码,用另外一部分数据来训练。但是这样会造成可用数据的减少。