1 CatBoost简介
参考论文
Anna Veronika Dorogush, Andrey Gulin, Gleb Gusev, Nikita Kazeev, Liudmila Ostroumova Prokhorenkova, Aleksandr Vorobev "Fighting biases with dynamic boosting". arXiv:1706.09516, 2017
Anna Veronika Dorogush, Vasily Ershov, Andrey Gulin "CatBoost: gradient boosting with categorical features support". Workshop on ML Systems at NIPS 2017
本文参考:一文详尽解释CatBoost
https://cloud.tencent.com/developer/article/1546808
CatBoost是俄罗斯的搜索巨头Y andex在2017年开源的机器学习库,也是Boosting族算法的一种,同前面介绍过的XGBoost和LightGBM类似,依然是在GBDT算法框架下的一种改进实现,是一种基于对称决策树(oblivious trees)算法的参数少、支持类别型变量和高准确性的GBDT框架,主要解决的痛点是高效合理地处理类别型特征(Categorical features),这个从它的名字就可以看得出来,CatBoost是由catgorical和boost组成,另外是处理梯度偏差(Gradient bias)以及预测偏移(Prediction shift)问题,提高算法的准确性和泛化能力。
2 CatBoost的主要特性
- 1 无需调参即可获得较高的模型质量,采用默认参数就可以获得非常好的结果,减少在调参上面花的时间
- 2 支持类别型变量,无需对非数值型特征进行预处理
- 3 快速、可扩展的GPU版本,可以用基于GPU的梯度提升算法实现来训练你的模型,支持多卡并行
- 4 提高准确性,提出一种全新的梯度提升机制来构建模型以减少过拟合
- 5 快速预测,即便应对延时非常苛刻的任务也能够快速高效部署模型
3 CatBoost对类别型变量的处理
3.1 类别型变量
类别型变量(Categorical features)是指其值是离散的集合且相互比较并无意义的变量,比如用户的ID、产品ID、颜色等。因此,这些变量无法在二叉决策树当中直接使用。常规的做法是将这些类别变量通过预处理的方式转化成数值型变量再用模型进行训练,比如用一个或者若干个数值来代表一个类别型特征。
3.2 类别型变量的一般处理方式
- 1 目前广泛用于低势(一个有限集的元素个数是一个自然数)类别特征的处理方法是One-hot encoding:将原来的特征删除,然后对于每一个类别加一个0/1的用来指示是否含有该类别的数值型特征。One-hot encoding可以在数据预处理时完成,也可以在模型训练的时候完成,从训练时间的角度,后一种方法的实现更为高效,CatBoost对于低势类别特征也是采用后一种实现。
- 2 在高势特征当中,比如 user ID,这种编码方式会产生大量新的特征,造成维度灾难。一种折中的办法是可以将类别分组成有限个的群体再进行 One-hot encoding。一种常被使用的方法是根据目标变量统计(Target Statistics,以下简称TS)进行分组,目标变量统计用于估算每个类别的目标变量期望值。甚至有人直接用TS作为一个新的数值型变量来代替原来的类别型变量。重要的是,可以通过对TS数值型特征的阈值设置,基于对数损失、基尼系数或者均方差,得到一个对于训练集而言将类别一分为二的所有可能划分当中最优的那个。
3.3 CatBoost采用TS特征的优势
在LightGBM当中,类别型特征用每一步梯度提升时的梯度统计(Gradient Statistics,以下简称GS)来表示。虽然为建树提供了重要的信息,但是这种方法有以下两个缺点:
- 增加计算时间,因为需要对每一个类别型特征,在迭代的每一步,都需要对GS进行计算;
- 增加存储需求,对于一个类别型变量,需要存储每一次分离每个节点的类别。
为了克服这些缺点,LightGBM以损失部分信息为代价将所有的长尾类别归位一类,作者声称这样处理高势特征时比起 One-hot encoding还是好不少。不过如果采用TS特征,那么对于每个类别只需要计算和存储一个数字。
因此,采用TS作为一个新的数值型特征是最有效、信息损失最小的处理类别型特征的方法。TS也被广泛采用,在点击预测任务当中,这个场景当中的类别特征有用户、地区、广告、广告发布者等。
4 XGBoost、Light GBM和CatBoost比较
从结构到性能,一文概述XGBoost、Light GBM和CatBoost的同与不同
https://zhuanlan.zhihu.com/p/34698733
- 2014 年 3 月,XGBOOST 最早作为研究项目,由陈天奇提出
- 2017 年 1 月,微软发布首个稳定版 LightGBM
- 2017 年 4 月,俄罗斯顶尖技术公司 Yandex 开源 CatBoost
4.1 每个模型是如何处理属性分类变量的?
CatBoost
CatBoost 可赋予分类变量指标,进而通过独热最大量得到独热编码形式的结果(独热最大量:在所有特征上,对小于等于某个给定参数值的不同的数使用独热编码)。
如果在 CatBoost 语句中没有设置「跳过」,CatBoost 就会将所有列当作数值变量处理。
注意,如果某一列数据中包含字符串值,CatBoost 算法就会抛出错误。另外,带有默认值的 int 型变量也会默认被当成数值数据处理。在 CatBoost 中,必须对变量进行声明,才可以让算法将其作为分类变量处理。
对于可取值的数量比独热最大量还要大的分类变量,CatBoost 使用了一个非常有效的编码方法,这种方法和均值编码类似,但可以降低过拟合情况。
它的具体实现方法如下:
- 将输入样本集随机排序,并生成多组随机排列的情况。
- 将浮点型或属性值标记转化为整数。
- 将所有的分类特征值结果都根据以下公式,转化为数值结果。
LightGBM
和 CatBoost 类似,LighGBM 也可以通过使用特征名称的输入来处理属性数据;它没有对数据进行独热编码,因此速度比独热编码快得多。LGBM 使用了一个特殊的算法来确定属性特征的分割值。
注意,在建立适用于 LGBM 的数据集之前,需要将分类变量转化为整型变量;此算法不允许将字符串数据传给分类变量参数。
XGBoost
和 CatBoost 以及 LGBM 算法不同,XGBoost 本身无法处理分类变量,而是像随机森林一样,只接受数值数据。因此在将分类数据传入 XGBoost 之前,必须通过各种编码方式:例如标记编码、均值编码或独热编码对数据进行处理。
5 三种算法的超参数
所有的这些模型都需要调节大量参数,但我们只谈论其中重要的。以下是将不同算法中的重要参数按照功能进行整理的表格。
三种算法的超参数.png
6 用鸢尾花数据集实例演示
from catboost import CatBoostClassifier
import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
data = iris.data
target = iris.target
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=666)
model = CatBoostClassifier()
model.fit(X_train,y_train)
# 测试集预测
y_pred = model.predict(X_test)
# 模型评估
print('The rmse of prediction is:', mean_squared_error(y_test, y_pred) ** 0.5)
The rmse of prediction is: 0.0
estimator = CatBoostClassifier()
params = {'depth': [4, 7, 10],
'learning_rate' : (0,0.5,0.01),
'l2_leaf_reg': [1,4,9],
'iterations': [300]}
cat_cv = GridSearchCV(estimator, params)
clf = cat_cv.fit(X_train, y_train)
y_pred = clf.predict(X_test)
mean_squared_error(y_test, y_pred)
0.0
print('Best parameters found by grid search are:', cat_cv.best_params_)
Best parameters found by grid search are: {'depth': 4, 'iterations': 300, 'l2_leaf_reg': 1, 'learning_rate': 0.01}
在默认参数下,均方误差为 0
网友评论