前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数学推导+纯Python实现机器学习算法19:CatBoost

数学推导+纯Python实现机器学习算法19:CatBoost

作者头像
石晓文
发布于 2020-07-16 06:36:07
发布于 2020-07-16 06:36:07
1.9K00
代码可运行
举报
文章被收录于专栏:小小挖掘机小小挖掘机
运行总次数:0
代码可运行

Author:louwill

Machine Learning Lab

本文介绍GBDT系列的最后一个强大的工程实现模型——CatBoost。CatBoost与XGBoost、LightGBM并称为GBDT框架下三大主流模型。CatBoost是俄罗斯搜索巨头公司Yandex于2017年开源出来的一款GBDT计算框架,因其能够高效处理数据中的类别特征而取名为CatBoost(Categorical+Boosting)。相较于XGBoost和LightGBM,CatBoost的主要创新点在于类别特征处理和排序提升(Ordered Boosting)。

处理类别型特征

对于类别特征的处理是CatBoost的一大特点,这也是其命名的由来。CatBoost通过对常规的目标变量统计方法添加先验项来对其进行改进。除此之外,CatBoost还考虑使用类别特征的不同组合来扩大数据集特征维度。

通用处理方法

类别型特征在结构化数据集中是一个非常普遍的特征。这类特征区别于常见的数值型特征,它是一个离散的集合,比如说性别(男、女),学历(本科、硕士、博士等),地点(杭州、北京、上海等),有些时候我们还会碰到几十上百个取值的类别特征。

对于类别型特征,以往最通用的方法就是one-hot编码,如果类别型特征取值数目较少的话,one-hot编码不失为一种比较高效的方法。但当类别型特征取值数目较多的话,one-hot编码就不划算了,它会产生大量冗余特征,试想一下一个类别数目为100个的类别型特征,one-hot编码会产生100个稀疏特征,茫茫零海中的一个1,这对训练算法本身而言就是个累赘。

所以,对于特征取值数目较多的类别型特征,一种折中的方法是将类别数目进行重新归类,使其类别数目降到较少数目再进行one-hot编码。另一种最常用的方法则是目标变量统计(Target Statisitics,TS),TS计算每个类别对于的目标变量的期望值并将类别特征转换为新的数值特征。CatBoost在常规TS方法上做了改进。

目标变量统计

CatBoost算法设计一个最大的目的就是要更好的处理GBDT特征中的类别特征。常规的TS方法最直接的做法就是将类别对应的标签平均值来进行替换。在GBDT构建决策树的过程中,替换后的类别标签平均值作为节点分裂的标准,这种做法也被称为Greedy Target-based Statistics , 简称Greedy TS,其计算公式可表示为:

Greedy TS一个比较明显的缺陷就是当特征比标签包含更多信息时,统一用标签平均值来代替分类特征表达的话,训练集和测试集可能会因为数据分布不一样而产生条件偏移问题。CatBoost对Greedy TS方法的改进就是添加先验分布项,用以减少噪声和低频类别型数据对于数据分布的影响。改进后的Greedy TS方法数学表达如下:

其中为添加的先验项,为大于的权重系数。

除了上述方法之外,CatBoost还提供了Holdout TS、Leave-one-out TS、Ordered TS等几种改进的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构建树的算法流程如下图所示。

在Ordered模式学习过程中:

  • 我们训练了一个模型,其中表示在序列中前个样本学习得到的模型对于第个样本的预测。
  • 在每一次迭代中,算法从中抽样一个序列,并基于此构建第步的学习树。
  • 基于计算对应梯度。
  • 使用余弦相似度来近似梯度,对于每个样本,取梯度。
  • 在评估候选分裂节点过程中,第个样本的叶子节点值由与同属一个叶子的的所有样本的前个样本的梯度值求平均得到。
  • 当第步迭代的树结构确定以后,便可用其来提升所有模型。

注:这一段比较晦涩难懂,笔者也没有完全深入理解,建议各位读者一定去读一下CatBoost论文原文。

基于构建树算法的完整CatBoost算法流程如下图所示。

除了类别特征处理和排序提升以外,CatBoost还有许多其他亮点。比如说基于对称树(Oblivious Trees)的基学习器,提供多GPU训练加速支持等。

CatBoost与XGBoost、LightGBM对比

CatBoost与LightGBM开源前后时间相差不到3个月,二者都是在XGBoost基础上做出的改进和优化。除了算法整体性能上的差异之外,基于CatBoost最主要的类别型特征处理特色,三者的主要差异如下:

  • CatBoost支持最全面的类别型特征处理,可直接传入类别型特征所在列标识然后进行自动化处理。
  • LightGBM同样也支持对类别型特征的快速处理,训练时传入类别型特征列所在标识符即可。但LightGBM对于类别特征只是采用直接的硬编码处理,虽然速度较快但不如CatBoost的处理方法细致。
  • XGBoost作为最早的GBDT工程实现,其本身并不支持处理类别型特征,只能传入数值型数据。所以一般都需要手动对类别型特征进行one-hot等预处理。

CatBoost论文也给出了在多个开源数据集上与XGBoost和LightGBM性能对比。如下图所示。

CatBoost算法实现

手动实现一个CatBoost系统过于复杂,限于时间精力这里笔者选择放弃。CatBoost源 码可参考:

https://github.com/catboost/catboost

CatBoost官方为我们提供相关的开源实现库catboost,直接pip安装即可。

下面以catboost一个分类例子作为演示。完整的catboost用法文档参考:

https://catboost.ai/docs/concepts/tutorials.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
import catboost as cb
from sklearn.metrics import f1_score

# 读取数据
data = pd.read_csv('./adult.data', header=None)
# 变量重命名
data.columns = ['age', 'workclass', 'fnlwgt', 'education', 'education-num', 
                'marital-status', 'occupation', 'relationship', 'race', 'sex', 
                'capital-gain', 'capital-loss', 'hours-per-week', 'native-country', 'income']
# 标签转换
data['income'] = data['income'].astype("category").cat.codes
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(data.drop(['income'], axis=1), data['income'],
                                                    random_state=10, test_size=0.3)
# 配置训练参数
clf = cb.CatBoostClassifier(eval_metric="AUC", depth=4, iterations=500, l2_leaf_reg=1,
                            learning_rate=0.1)
# 类别特征索引
cat_features_index = [1, 3, 5, 6, 7, 8, 9, 13]
# 训练
clf.fit(X_train, y_train, cat_features=cat_features_index)
# 预测
y_pred = clf.predict(X_test)
# 测试集f1得分
print(f1_score(y_test, y_pred))

参考资料:

https://catboost.ai/

CatBoost: unbiased boosting with categorical features

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小小挖掘机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解CatBoost
CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,是Boosting族算法的一种。CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,都是在GBDT算法框架下的一种改进实现。XGBoost被广泛的应用于工业界,LightGBM有效的提升了GBDT的计算效率,而Yandex的CatBoost号称是比XGBoost和LightGBM在算法准确率等方面表现更为优秀的算法。
Datawhale
2020/02/21
2.7K0
一文速学-CatBoost算法模型实现贷款违约预测
此篇文章为整个Boost(提升方法)集成算法模型的终章,前几篇文章依次结合详细项目案例讲解了AdaBoost、GBDT、XGBoost、LightGBT共四个常用的集成算法模型,每一篇文章都包含实战项目以及可运行代码。仅通过看一遍文章不去实践是很难掌握集成算法模型的,其中很多思想和优化参数的方法需要长期使用才能掌握,集成学习的方法在全球各大机器学习、数据挖掘竞赛中使用的非常广泛,其概念和思想也是风靡学术界和工业界,所以有此需求的朋友推荐细读实践。
fanstuck
2025/01/01
3420
一文速学-CatBoost算法模型实现贷款违约预测
【ML】一文详尽系列之CatBoost
CatBoost是俄罗斯的搜索巨头Y andex在2017年开源的机器学习库,也是Boosting族算法的一种,同前面介绍过的XGBoost和LightGBM类似,依然是在GBDT算法框架下的一种改进实现,是一种基于对称决策树(oblivious trees)算法的参数少、支持类别型变量和高准确性的GBDT框架,主要说解决的痛点是高效合理地处理类别型特征,这个从它的名字就可以看得出来,CatBoost是由catgorical和boost组成,另外是处理梯度偏差(Gradient bias)以及预测偏移(Prediction shift)问题,提高算法的准确性和泛化能力。
yuquanle
2019/12/03
3K0
【ML】一文详尽系列之CatBoost
30分钟学会CatBoost
CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,都是在GBDT算法框架下的一种改进实现。
lyhue1991
2022/01/24
2K0
30分钟学会CatBoost
一文详尽系列之CatBoost
CatBoost是俄罗斯的搜索巨头Y andex在2017年开源的机器学习库,也是Boosting族算法的一种,同前面介绍过的XGBoost和LightGBM类似,依然是在GBDT算法框架下的一种改进实现,是一种基于对称决策树(oblivious trees)算法的参数少、支持类别型变量和高准确性的GBDT框架,主要说解决的痛点是高效合理地处理类别型特征,这个从它的名字就可以看得出来,CatBoost是由catgorical和boost组成,另外是处理梯度偏差(Gradient bias)以及预测偏移(Prediction shift)问题,提高算法的准确性和泛化能力。
Datawhale
2019/11/23
2.2K0
​100天搞定机器学习|Day63 彻底掌握 LightGBM
LightGBM 全称为轻量的梯度提升机(Light Gradient Boosting Machine),由微软于2017年开源出来的一款SOTA Boosting算法框架。
Ai学习的老章
2021/11/16
1.5K0
机器学习|LightGBM
上文中我们了解了一下XGBoost的原理,本文再来了解一下GBDT的另一个进化算法LightGBM,从原理上来说它和GBDT及XGBoost类似,都采用损失函数的负梯度作为当前决策树的残差近似值,去拟合新的决策树。
数据山谷
2020/07/21
8840
机器学习|LightGBM
CatBoost(一):与同类算法的差异对比
导读:在机器学习领域,处理类别型特征一直是个棘手的问题。传统的GBDT算法在这一领域的表现并不尽如人意,直到CatBoost的出现。今天,我们就来聊聊CatBoost是如何优雅地解决这一难题的,以及它在实际应用中的强大之处。
三猫
2024/07/30
3610
CatBoost(一):与同类算法的差异对比
人工智能|LightGBM模型详解
LightGBM 是微软开发的 boosting 集成模型,和 XGBoost 一样是对 GBDT 的优化和高效实现,原理有一些相似之处,但它很多方面比 XGBoost 有着更为优秀的表现。官方给出的这个工具库模型的优势如下:
陆勤_数据人网
2022/12/22
2.2K0
人工智能|LightGBM模型详解
树模型遇上类别型特征(Python)
在数据挖掘项目的数据中,数据类型可以分为两种:有序的连续数值 和 无序的类别型特征。
算法进阶
2022/06/02
1.3K0
树模型遇上类别型特征(Python)
关于XGBoost、GBDT、Lightgbm的17个问题
9.lightgbm和xgboost有什么区别?他们的loss一样么?算法层面有什么区别?
Ai学习的老章
2019/10/22
5.3K0
关于XGBoost、GBDT、Lightgbm的17个问题
大战三回合:XGBoost、LightGBM和Catboost一决高低 | 程序员硬核算法评测
【导读】XGBoost、LightGBM 和 Catboost 是三个基于 GBDT(Gradient Boosting Decision Tree)代表性的算法实现,今天,我们将在三轮 Battle 中,根据训练和预测的时间、预测得分和可解释性等评测指标,让三个算法一决高下!
AI科技大本营
2019/07/11
3K0
大战三回合:XGBoost、LightGBM和Catboost一决高低 | 程序员硬核算法评测
【机器学习基础】XGBoost、LightGBM与CatBoost算法对比与调参
虽然现在深度学习大行其道,但以XGBoost、LightGBM和CatBoost为代表的Boosting算法仍有其广阔的用武之地。抛开深度学习适用的图像、文本、语音和视频等非结构化的数据应用,Boosting算法对于训练样本较少的结构化数据领域仍然是第一选择。本文先对前述章节的三大Boosting的联系与区别进行简单阐述,并一个实际数据案例来对三大算法进行对比。然后对常用的Boosting算法超参数调优方法进行介绍,包括随机调参法、网格搜索法和贝叶斯调参法,并给出相应的代码示例。
黄博的机器学习圈子
2021/04/16
7.7K0
【机器学习基础】XGBoost、LightGBM与CatBoost算法对比与调参
一张图介绍机器学习中的集成学习算法
机器学习在当下早已成为一项热门的技术,在众多机器学习算法中,除去深度学习和强化学习等最新发展方向,若是谈及经典机器学习算法,那么集成学习算法无论是在效果上还是热度上都是当之无愧的焦点。今天本文就来简要介绍那些经典的集成学习算法。
luanhz
2021/07/23
1.2K0
一张图介绍机器学习中的集成学习算法
CatBoost, XGBoost, AdaBoost, LightBoost,各种Boost的介绍和对比
在集成学习中,目标是用多种学习算法最成功地训练模型。Bagging方法是一种集成学习方法,将多个模型并行应用于同一数据集的不同子样本。Boosting是另一种在实践中经常使用的方法,它不是并行构建的,而是按顺序构建的,目的是训练算法和模型。弱算法先对模型进行训练,然后根据训练结果对模型进行重组,使模型更容易学习。然后将修改后的模型发送给下一个算法,第二个算法比第一个算法学习起来更容易。本文包含了不同的增强方法,从不同的角度解释了这些方法并进行了简单的测试。
deephub
2021/08/20
2.4K0
终于有人把XGBoost 和 LightGBM 讲明白了,项目中最主流的集成算法!
本文是决策树的第三篇,主要介绍基于 Boosting 框架的主流集成算法,包括 XGBoost 和 LightGBM。
Datawhale
2019/11/07
5.2K1
【白话机器学习】算法理论+实战之LightGBM算法
如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法:
石晓文
2020/06/28
7.5K0
图解机器学习 | LightGBM模型详解
教程地址:http://www.showmeai.tech/tutorials/34
ShowMeAI
2022/03/10
2.6K0
图解机器学习 | LightGBM模型详解
入门 | 从结构到性能,一文概述XGBoost、Light GBM和CatBoost的同与不同
选自Medium 机器之心编译 参与:刘天赐、黄小天 尽管近年来神经网络复兴并大为流行,但是 boosting 算法在训练样本量有限、所需训练时间较短、缺乏调参知识等场景依然有其不可或缺的优势。本文从算法结构差异、每个算法的分类变量时的处理、算法在数据集上的实现等多个方面对 3 种代表性的 boosting 算法 CatBoost、Light GBM 和 XGBoost 进行了对比;虽然本文结论依据于特定的数据集,但通常情况下,XGBoost 都比另外两个算法慢。 最近,我参加了 kaggle 竞赛 WID
机器之心
2018/05/09
2.3K0
入门 | 从结构到性能,一文概述XGBoost、Light GBM和CatBoost的同与不同
机器学习8:集成学习--LightGBM
LightGBM相关知识模块:Histogram VS pre-sorted,leaf-wiseVS level-wise,特征并行和数据并行,顺序访问梯度,支持类别特征, CatBoost(了解)。
用户5473628
2019/08/08
1.7K0
相关推荐
深入理解CatBoost
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验