CatBoost简介
CatBoost是俄罗斯搜索巨头Yandex在2017年开源的机器学习库,是Boosting算法的一种,CatBoost和XGBoost,Lightgbm并称为GBDT三大主流神器,都是在GBDT算法框架下的一种改进实现,XGBoost是被广泛应用于工业界,LightGBM有效的提升了GBDT的计算效率,而Yandex的CatBoost号称是比XGBoost和LightGBM在算法准确率等方面表现更为优秀的算法。
CatBoost是一种基于对称决策树,为基学习器实现的参数较少,支持类别性变量和高准确性的GBDT框架,主要解决的痛点时高效合理的处理类别型特征。这一点从其的名字中可以看出来,CatBoost是由Categorical和Boosting组成。此外CatBoost还解决了梯度偏差以及预测偏移的问题。
从而减少过拟合的发生,进而提高算法的准确性和泛化能力。
域XGBoost、LightGBM相比, CatBoost的创新点有:
- 嵌入了自动将类别型特征处理为数值型特征的创新算法,首先对categorical features做一些统计,计算某个类别特征出现的概率,之后加上超参数,生成新的数值型特征 n u m e r i c a l f e a t u r e s numerical features numericalfeatures.
- CatBoost是使用了组合类别特征,可以利用特征之间的关系,极大的丰富了特征的维度。
- 采用排序提升的算法对抗训练集中的噪声点,从而避免梯度估计偏差,进而解决梯度预偏移的问题。
- 采用了完全对称树作为基模型
类别型特征
类别型特征相关工作
所谓类别型特征,即这类特征不是数值型特征,而是离散的集合,比如省份名山东、山西、河北等),城市名(北京、上海、深圳等),学历(本科、硕士、博士等)。在梯度提升算法中,最常用的是将这些类别型特征转换为数值型特征处理,一般类别型特征转换为一个或多个数值型特征。
如果某个类别型特征基础比较低,low-cardinality features,即改特征的所有值去重后构成的集合元素个数比较少,一般利用one-hot编码方式将特征转换为数值型,one-hot编码可以在数据预处理时候完成,也可以在模型训练时候完成,从训练时间的角度,后一种方式实现更为高效,CatBoost对于基数较低的类别型特征也是采用后一种实现。
显然,在高基础类别型特征,high cardinality features。当中,比如user ID,这种编码方式会产生大量的新特征,造成维度灾难,一种折中的办法是可以将类别分组成有限个的群体再进行One-hot编码。一种常被使用的方法是根据目标变量统计(Target Statistics,以下简称TS**)进行分组**,目标变量统计用于估算每个类别的目标变量期望值。甚至有人直接用TS作为一个新的数值型变量来代替原来的类别型变量。重要的是,可以通过对TS数值型特征的阈值设置,基于对数损失、基尼系数或者均方差,得到一个对于训练集而言将类别一分为二的所有可能划分当中最优的那个。在LightGBM当中,类别型特征用每一步梯度提升时的梯度统计(Gradient Statistics,以下简称GS)来表示。虽然为建树提供了重要的信息,但是这种方法有以下两个缺点:
- 增加计算时间,因为需要对每一个类别型特征,在迭代的每一步,都需要对GS进行计算。
- 增加存储需求,对于一个类别型变量,需要存储每一次分离每个节点的类别。
为了克服这些缺点,LightGBM以损失部分信息为代价将所有的长尾类别归为一类,作者声称这样处理高基数类别型特征时比One-hot编码还是好不少。不过如果采用TS特征,那么对于每个类别只需要计算和存储一个数字。
因此,采用TS作为一个新的数值型特征是最有效、信息损失最小的处理类别型特征的方法。TS也被广泛应用在点击预测任务当中,这个场景当中的类别型特征有用户、地区、广告、广告发布者等。接下来我们着重讨论TS,暂时将One-hot编码和GS放一边。
目标变量统计
CatBoost算法的设计初衷是为了更好的处理GBDT特征中的categorical features。在处理 GBDT特征中的categorical features的时候,最简单的方法是用 categorical feature 对应的标签的平均值来替换。在决策树中,标签平均值将作为节点分裂的标准。这种方法被称为 Greedy Target-based Statistics , 简称 Greedy TS,用公式来表达就是:
这种方法有一个显而易见的缺陷,就是通常特征比标签包含更多的信息,如果强行用标签的平均值来表示特征的话,当训练数据集和测试数据集数据结构和分布不一样的时候会出条件偏移问题。
一个标准的改进Greedy TS方式都是添加先验分布项。这样可以减少噪声和低频率类别型数据对于数据分布的影响。
特征组合
CatBoost另外一种对类别特征处理方法的创新在于可以构建任意几个类别型特征的任意组合为新的特征。比如说用户ID和广告主题之间的联合信息。如果单纯地将二者转换为数值特征,二者之间的联合信息可能就会丢失掉。CatBoost则考虑将这两个分类特征进行组合构成新的分类特征。但组合的数量会随着数据集中类别型特征的数量成指数增长,因此不可能考虑所有的组合。
所以,CatBoost在构建新的分裂节点时,会采用贪心的策略考虑特征之间的组合。CatBoost将当前树的所有组合、类别型特征与数据集中的所有类别型特征相结合,并将新的类别组合型特征动态地转换为数值型特征。
预偏移和梯度提升
CatBoost另一大创新点在于提**出使用排序提升(Ordered Boosting)的方法解决预测偏移(Prediction Shift)**的问题
预测偏移
所谓预测偏移,即训练样本的分布与测试样本的分布之间产生的偏移。
CatBoost首次揭示了梯度提升中的预测偏移问题。认为预测偏移就像是TS处理方法一样,是由一种特殊的特征target leakage和梯度偏差造成的,我们来看一下在梯度提升过程中这种预测偏移是这么传递的。
假设前一轮训练得到强学习器为,当前损失函数为,则本轮迭代则要拟合的弱学习器为:
进一步的梯度表达为:
排序提升
CatBoost采用基于Ordered TS的Ordered Boosting方法来处理预测偏移问题。排序提升算法流程如下图所示。
对于训练数据,排序提升先生成一个随机排列,随机配列用于之后的模型训练,即在训练第个模型时,使用排列中前个样本进行训练。在迭代过程中,为得到第个样本的残差估计值,使用第个模型进行估计。
但是这种训练个模型的做法会大大增加内存消耗和时间复杂度,实际上可操性不强,因此,CatBoost在以决策树为基学习器的梯度提升算法的基础上,对这种排序提升算法进行了改进。
CatBoost提供了两种Boosting模式,Ordered和Plain。Plain就是在标准的GBDT算法上内置了排序TS操作。而Ordered模式则是则排序提升算法上做出了改进。
完整的Ordered模式描述如下:CatBoost对训练集产生个独立随机序列用来定义和评估树结构的分裂,用来计算分裂所得到叶子节点的值。CatBoost采用对称树作为基学习器,对称意味着在树的同一层,其分裂标准都是相同的。对称树具有平衡、不易过拟合并能够大大减少测试时间的特点。CatBoost构建树的算法流程如下图所示。
经验
- 先利用集成学习进行打比赛。慢慢的会将集成学习全部都研究彻底,将其全部都搞定都行啦的理由与打算。
- 会清楚的知道使用什么库去打比赛。
CatBoostClassifier参数详解
通用参数
- loss_function 损失函数,支持的有RMSE, Logloss, MAE, CrossEntropy, * *Quantile, LogLinQuantile, Multiclass, MultiClassOneVsAll, MAPE,Poisson。默认RMSE。
- custom_metric 训练过程中输出的度量值。这些功能未经优化,仅出于信息目的显示。默认None。
- eval_metric 用于过拟合检验(设置True)和最佳模型选择(设置True)loss function,用于优化。
- iterations 最大树数。默认1000。
- learning_rate 学习率。默认0.03。
random_seed 训练时候的随机种子 - l2_leaf_reg L2正则参数。默认3
- bootstrap_type 定义权重计算逻辑,可选参数:Poisson (supported for GPU only)/Bayesian/Bernoulli/No,默认为Bayesian
bagging_temperature 贝叶斯套袋控制强度,区间[0, 1]。默认1。
subsample 设置样本率,当bootstrap_type为Poisson或Bernoulli时使用,默认66 - sampling_frequency设置创建树时的采样频率,可选值PerTree/PerTreeLevel,默认为PerTreeLevel
- random_strength 分数标准差乘数。默认1。
use_best_model 设置此参数时,需要提供测试数据,树的个数通过训练参数和优化loss function获得。默认False。 - best_model_min_trees 最佳模型应该具有的树的最小数目。
depth 树深,最大16,建议在1到10之间。默认6。
ignored_features 忽略数据集中的某些特征。默认None。
one_hot_max_size 如果feature包含的不同值的数目超过了指定值,将feature转化为float。默认False - has_time 在将categorical features转化为numerical
features和选择树结构时,顺序选择输入数据。默认False(随机)
rsm 随机子空间(Random subspace method)。默认1。
nan_mode处理输入数据中缺失值的方法,包括Forbidden(禁止存在缺失),Min(用最小值补),Max(用最大值补)。默认Min。
fold_permutation_block_size数据集中的对象在随机排列之前按块分组。此参数定义块的大小。值越小,训练越慢。较大的值可能导致质量下降。
leaf_estimation_method 计算叶子值的方法,Newton/ Gradient。默认Gradient。 - leaf_estimation_iterations 计算叶子值时梯度步数。
leaf_estimation_backtracking 在梯度下降期间要使用的回溯类型。
fold_len_multiplier folds长度系数。设置大于1的参数,在参数较小时获得最佳结果。默认2。 - approx_on_full_history 计算近似值,False:使用1/fold_len_multiplier计算;True:使用fold中前面所有行计算。默认False。
class_weights 类别的权重。默认None。 - scale_pos_weight 二进制分类中class 1的权重。该值用作class 1中对象权重的乘数。
boosting_type 增压方案 - allow_const_label 使用它为所有对象训练具有相同标签值的数据集的模型。默认为False
默认参数
‘iterations’: 1000,
‘learning_rate’:0.03,
‘l2_leaf_reg’:3,
‘bagging_temperature’:1,
‘subsample’:0.66,
‘random_strength’:1,
‘depth’:6,
‘rsm’:1,
‘one_hot_max_size’:2
‘leaf_estimation_method’:’Gradient’,
‘fold_len_multiplier’:2,
‘border_count’:128,
性能参数
- thread_count=-1:训练时所用的cpu/gpu核数
- used_ram_limit=None:CTR问题,计算时的内存限制
- gpu_ram_part=None:GPU内存限制
参数调优
采用 G i r d S e a r c h C V 方法 GirdSearchCV方法 GirdSearchCV方法自动搜索最优参数。
经验
- 会将各种的集成学习全部都将其搞定,慢慢的研究一波都行啦的回事与打算。