一、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