catboost介绍

article/2025/10/3 2:12:20

一、Catboost简介

  • 全称:Gradient Boosting(梯度提升) + Categorical Features(类别型特征)
  • 作者:俄罗斯的搜索巨头Yandex
  • 官方地址
  • 论文链接 | 项目地址 
  • 文档地址
  • 视频

二、Catboost的特点

  一般来说,Gradient Boosting(GB)方法适用于异质化数据。即,若你的数据集全由图片数据构成或者全由视频数据构成之类的,我们称其为同质化数据,这时使用神经网络往往会有更好的表现。但对于异质化数据,比如说数据集中有user gender,user age,也有content data等等的情况,GB方法的表现往往更好。GB方法比神经网络的入门门槛更低,使用起来也更简单。

  NN和GB方法可以结合起来使用,并常常有很好的表现。我们可以使用NN方法学习embedding feature,并且和其他一些特征结合起来,再过GBDT。

  Catboost具有一些和其他类似的库不同的特征:

1.类别型特征

  对于可取值的数量比独热最大量还要大的分类变量,CatBoost 使用了一个非常有效的编码方法,这种方法和均值编码类似,但可以降低过拟合情况。它的具体实现方法如下:

  • 将输入样本集随机排序,并生成多组随机排列的情况。
  • 将浮点型或属性值标记转化为整数。
  • 将所有的分类特征值结果都根据以下公式,转化为数值结果。

  其中 CountInClass 表示在当前分类特征值中,有多少样本的标记值是「1」;Prior 是分子的初始值,根据初始参数确定。TotalCount 是在所有样本中(包含当前样本),和当前样本具有相同的分类特征值的样本数量。可以用下面的数学公式表示:

特征组合

其次,它用特殊的方式处理categorical features。首先他们会计算一些数据的statistics。计算某个category出现的频率,加上超参数,生成新的numerical features。这一策略要求同一标签数据不能排列在一起(即先全是0之后全是1这种方式),训练之前需要打乱数据集。第二,使用数据的不同排列(实际上是4个)。在每一轮建立树之前,先扔一轮骰子,决定使用哪个排列来生成树。第三,考虑使用categorical features的不同组合。例如颜色和种类组合起来,可以构成类似于blue dog这样的feature。当需要组合的categorical features变多时,catboost只考虑一部分combinations。在选择第一个节点时,只考虑选择一个feature,例如A。在生成第二个节点时,考虑A和任意一个categorical feature的组合,选择其中最好的。就这样使用贪心算法生成combinations。第四,除非向gender这种维数很小的情况,不建议自己生成one-hot vectors,最好交给算法来处理。

2.克服梯度偏差

catboost和其他算法计算leaf-value的方法不同。传统的boosting使用平均数,但这个估计是有偏的,会导致过拟合。而Catboost则采用另外的计算方法。

CatBoost,和所有标准梯度提升算法一样,都是通过构建新树来拟合当前模型的梯度。然而,所有经典的提升算法都存在由有偏的点态梯度估计引起的过拟合问题。许多利用GBDT技术的算法(例如,XGBoost、LightGBM),构建一棵树分为两个阶段:选择树结构和在树结构固定后计算叶子节点的值。为了选择最佳的树结构,算法通过枚举不同的分割,用这些分割构建树,对得到的叶子节点中计算值,然后对得到的树计算评分,最后选择最佳的分割。两个阶段叶子节点的值都是被当做梯度[8]或牛顿步长的近似值来计算。CatBoost第一阶段采用梯度步长的无偏估计,第二阶段使用传统的GBDT方案执行。

3.快速评分

Catboost使用对称树。XGboost一层一层地建立节点,lightGBM一个一个地建立节点,而Catboost总是使用完全二叉树。它的节点是镜像的。Catboost称对称树有利于避免overfit,增加可靠性,并且能大大加速预测等等。

  CatBoost使用oblivious树作为基本预测器,这种树是平衡的,不太容易过拟合。oblivious树中,每个叶子节点的索引可以被编码为长度等于树深度的二进制向量。CatBoost首先将所有浮点特征、统计信息和独热编码特征进行二值化,然后使用二进制特征来计算模型预测值。

4.基于GPU实现快速学习

  • 密集的数值特征

  任何GBDT算法,对于密集的数值特征数据集来说,搜索最佳分割是建立决策树时的主要计算负担。CatBoost利用oblivious决策树作为基础模型,并将特征离散化到固定数量的箱子中以减少内存使用。就GPU内存使用而言,CatBoost至少与LightGBM一样有效。主要改进之处就是利用了一种不依赖于原子操作的直方图计算方法。

  • 类别型特征

  CatBoost使用完美哈希来存储类别特征的值,以减少内存使用。由于GPU内存的限制,在CPU RAM中存储按位压缩的完美哈希,以及要求的数据流、重叠计算和内存等操作。通过哈希来分组观察。在每个组中,我们需要计算一些统计量的前缀和。该统计量的计算使用分段扫描GPU图元实现。

  • 多GPU支持

  CatBoost中的GPU实现可支持多个GPU。分布式树学习可以通过数据或特征进行并行化。CatBoost采用多个学习数据集排列的计算方案,在训练期间计算分类特征的统计数据。

三、与xgboost、lightgbm的对比

参数对比:

数据集:

在这里,我使用了 2015 年航班延误的 Kaggle 数据集,其中同时包含分类变量和数值变量。这个数据集中一共有约 500 万条记录,因此很适合用来同时评估比较三种 boosting 算法的训练速度和准确度。我使用了 1% 的数据:5 万行记录。

以下是建模使用的特征:

月、日、星期:整型数据
航线或航班号:整型数据
出发、到达机场:数值数据
出发时间:浮点数据
到达延误情况:这个特征作为预测目标,并转为二值变量:航班是否延误超过 10 分钟
距离和飞行时间:浮点数据

import pandas as pd, numpy as np, time
from sklearn.model_selection import train_test_split

data = pd.read_csv(“flight-delays/flights.csv”)
data = data.sample(frac = 0.1, random_state=10)#500->50

data = data.sample(frac = 0.1, random_state=10)#50->5

data.shape#(58191, 31)

data = data[[“MONTH”,“DAY”,“DAY_OF_WEEK”,“AIRLINE”,“FLIGHT_NUMBER”,“DESTINATION_AIRPORT”,
“ORIGIN_AIRPORT”,“AIR_TIME”, “DEPARTURE_TIME”,“DISTANCE”,“ARRIVAL_DELAY”]]
data.dropna(inplace=True)

data[“ARRIVAL_DELAY”] = (data[“ARRIVAL_DELAY”]>10)*1
#data.head()

cols = [“AIRLINE”,“FLIGHT_NUMBER”,“DESTINATION_AIRPORT”,“ORIGIN_AIRPORT”]
for item in cols:
data[item] = data[item].astype(“category”).cat.codes +1

train, test, y_train, y_test = train_test_split(data.drop([“ARRIVAL_DELAY”], axis=1), data[“ARRIVAL_DELAY”],
random_state=10, test_size=0.25)

 最终的数据集大概长这个样子:

1.xgboost

  和 CatBoost 以及 LGBM 算法不同,XGBoost 本身无法处理分类变量,而是像随机森林一样,只接受数值数据。因此在将分类数据传入 XGBoost 之前,必须通过各种编码方式:例如标记编码、均值编码或独热编码对数据进行处理。

import xgboost as xgb
from sklearn.grid_search import GridSearchCV
from sklearn import metrics

def auc(m, train, test):
return (metrics.roc_auc_score(y_train,m.predict_proba(train)[:,1]),
metrics.roc_auc_score(y_test,m.predict_proba(test)[:,1]))

Parameter Tuning
model = xgb.XGBClassifier()
param_dist = {“max_depth”: [10,30,50],
“min_child_weight” : [1],
“n_estimators”: [200],
“learning_rate”: [0.16],}
grid_search = GridSearchCV(model, param_grid=param_dist, cv = 3,
verbose=10, n_jobs=-1)
grid_search.fit(train, y_train)

grid_search.best_estimator_

model = xgb.XGBClassifier(max_depth=10, min_child_weight=1, n_estimators=200,
n_jobs=-1 , verbose=1,learning_rate=0.16)

train.shape,y_train.shape#((42855, 10), (42855,))

model.fit(train,y_train)

auc(model,train,test)#过拟合 (1.0, 0.6990888367179413)

  

2.Light GBM

  和 CatBoost 类似,LighGBM 也可以通过使用特征名称的输入来处理属性数据;它没有对数据进行独热编码,因此速度比独热编码快得多。LGBM 使用了一个特殊的算法来确定属性特征的分割值。注意,在建立适用于 LGBM 的数据集之前,需要将分类变量转化为整型变量;此算法不允许将字符串数据传给分类变量参数。

(1)不加categorical_feature 选项

import lightgbm as lgb
from sklearn import metrics

def auc2(m, train, test):
return (metrics.roc_auc_score(y_train,m.predict(train)),
metrics.roc_auc_score(y_test,m.predict(test)))

lg = lgb.LGBMClassifier(silent=False)
param_dist = {“max_depth”: [25,50, 75],
“learning_rate” : [0.01,0.05,0.1],
“num_leaves”: [300,900,1200],
“n_estimators”: [200]
}
grid_search = GridSearchCV(lg, n_jobs=-1, param_grid=param_dist, cv = 3, scoring=“roc_auc”, verbose=5)
grid_search.fit(train,y_train)
grid_search.best_estimator_

d_train = lgb.Dataset(train, label=y_train)
params = {“max_depth”: 50, “learning_rate” : 0.1, “num_leaves”: 900, “n_estimators”: 300}

Without Categorical Features

model2 = lgb.train(params, d_train)

auc2(model2, train, test)#(1.0, 0.6813950368358092)

(2)加categorical_feature 选项

#With Catgeorical Features
cate_features_name = ["MONTH","DAY","DAY_OF_WEEK","AIRLINE","DESTINATION_AIRPORT","ORIGIN_AIRPORT"]

d_train = lgb.Dataset(train, label=y_train)

model2 = lgb.train(params, d_train, categorical_feature = cate_features_name)

auc2(model2, train, test)#(1.0, 0.6781812538027399)

  

3. CatBoost

  在对 CatBoost 调参时,很难对分类特征赋予指标。因此,同时给出了不传递分类特征时的调参结果,并评估了两个模型:一个包含分类特征,另一个不包含。我单独调整了独热最大量,因为它并不会影响其他参数。

  如果未在cat_features参数中传递任何内容,CatBoost会将所有列视为数值变量。注意,如果某一列数据中包含字符串值,CatBoost 算法就会抛出错误。另外,带有默认值的 int 型变量也会默认被当成数值数据处理。在 CatBoost 中,必须对变量进行声明,才可以让算法将其作为分类变量处理。

(1)不加Categorical features选项

import catboost as cb
cat_features_index = [0,1,2,3,4,5,6]

def auc(m, train, test):
return (metrics.roc_auc_score(y_train,m.predict_proba(train)[:,1]),
metrics.roc_auc_score(y_test,m.predict_proba(test)[:,1]))

params = {‘depth’: [4, 7, 10],
‘learning_rate’ : [0.03, 0.1, 0.15],
‘l2_leaf_reg’: [1,4,9],
‘iterations’: [300]}
cb = cb.CatBoostClassifier()
cb_model = GridSearchCV(cb, params, scoring=“roc_auc”, cv = 3)
cb_model.fit(train, y_train)

With Categorical features

clf = cb.CatBoostClassifier(eval_metric=“AUC”, depth=10, iterations= 500, l2_leaf_reg= 9,
learning_rate= 0.15)
%timeit clf.fit(train,y_train)

auc(clf, train, test)#(0.7994405189483305, 0.7097991233818941)

 (2)有Categorical features选项

# With Categorical features
clf = cb.CatBoostClassifier(eval_metric="AUC",one_hot_max_size=31, \depth=10, iterations= 500, l2_leaf_reg= 9, learning_rate= 0.15)
clf.fit(train,y_train, cat_features= cat_features_index)

auc(clf, train, test)#(0.7937591249216596, 0.7167802198229718)

  


   请记住,CatBoost 在测试集上表现得最好,测试集的准确度最高(0.716)、过拟合程度最小(在训练集和测试集上的准确度很接近)以及最小的预测和调试时间。但这个表现仅仅在有分类特征,而且调节了独热最大量时才会出现。如果不利用 CatBoost 算法在这些特征上的优势,它的表现效果就会变成最差的:仅有 0.709 的准确度。因此我们认为,只有在数据中包含分类变量,同时我们适当地调节了这些变量时,CatBoost 才会表现很好。

  第二个使用的是 XGBoost,它的表现也相当不错。即使不考虑数据集包含有转换成数值变量之后能使用的分类变量,它的准确率也和 CatBoost 非常接近了。但是,XGBoost 唯一的问题是:它太慢了。尤其是对它进行调参,非常令人崩溃。更好的选择是分别调参,而不是使用 GridSearchCV。

  最后一个模型是 LightGBM,这里需要注意的一点是,在使用 CatBoost 特征时,LightGBM 在训练速度和准确度上的表现都非常差。我认为这是因为它在分类数据中使用了一些修正的均值编码方法,进而导致了过拟合(训练集准确率非常高:1.0,尤其是和测试集准确率相比之下)。但如果我们像使用 XGBoost 一样正常使用 LightGBM,它会比 XGBoost 更快地获得相似的准确度,如果不是更高的话(LGBM—0.681, XGBoost—0.699)。

  最后必须指出,这些结论在这个特定的数据集下成立,在其他数据集中,它们可能正确,也可能并不正确。但在大多数情况下,XGBoost 都比另外两个算法慢。

四、优缺点

优点:

  • 性能卓越:在性能方面可以匹敌任何先进的机器学习算法;
  • 鲁棒性/强健性:它减少了对很多超参数调优的需求,并降低了过度拟合的机会,这也使得模型变得更加具有通用性;
  • 易于使用:提供与scikit集成的Python接口,以及R和命令行界面;
  • 实用:可以处理类别型、数值型特征;可扩展:支持自定义损失函数




 

参考文献:

【1】从结构到性能,一文概述XGBoost、Light GBM和CatBoost的同与不同

【2】CatBoost vs. Light GBM vs. XGBoost

【3】Catboost学习笔记

【4】机器学习算法之Catboost

【5】github:https://github.com/catboost/catboost/tree/master/catboost/tutorials

【6】Python3机器学习实践:集成学习之CatBoost


http://chatgpt.dhexx.cn/article/oYPxyon5.shtml

相关文章

nb模块不能接收公网消息_nb模块不能接收公网消息_4G模块Cat1与Cat4的区别究竟在哪里呢?它又为何吸引众多Cat4用户的眼光呢?......

Cat1突然火了,众多行业大佬为其背书。 Cat1凭借其低成本、低功耗等优势与NB-IoT一同扛起了中低速率物联网市场大旗。 与此同时,Cat1也引来众多Cat4用户关注。 那Cat1与Cat4的区别究竟在哪里呢?它又为何吸引众多Cat4用户的眼光呢? 成本优势 1…

【内网学习笔记】20、Hashcat 的使用

1、介绍 Hashcat 是一款用于破解密码的工具,据说是世界上最快最高级的密码破解工具,支持 LM 哈希、MD5、SHA 等系列的密码破解,同时也支持 Linux、Mac、Windows 平台。 工具地址:https://hashcat.net 项目地址:http…

Cat.1和Cat.4的区别

Cat.1 Cat.4 NB-LOT 1.比较2.Cat.1和Cat.4 介绍 1.比较 2.Cat.1和Cat.4 介绍 要区别Cat.1和Cat.4,首先我们要知道Cat是什么。Cat 是 Category 的缩写,中文意思是“类别,种类”。Cat 后面的数字即代表不同的种类,3GPP 将不同种类的…

CAT1 与CAT4 区别与应用

要区别Cat.1和Cat.4,首先我们要知道Cat是什么。Cat 是 Category 的缩写,中文意思是“类别,种类”。Cat 后面的数字即代表不同的种类,3GPP 将不同种类的网络用 “Cat.X” 格式命名。根据 3GPP Release 定义,Cat.X 是用来…

生活网络常识—CAT1与CAT4的区别

大家好,今天给大家讲讲CAT1与CAT4的区别; 给出一张图片让大家生动地看到它们之前的差距与不同; 什么是Cat1与Cat4? 通俗来说我们可以理解为4G网络(LTE)的种类,分别代表UE的接入能力等级&#…

CAT1和CAT4的区别

现今,CAT1的发展势头一直很迅猛,那为什么CAT4不能替代CAT1的地位呢?,我们来看下面几点: 成本 1. 网络建设方面,Cat1可以无缝接入现有LTE网络当中,无需针对基站进行软硬件升级,网络…

Cat.1、Cat.4、4G之间的区别

什么是Cat.1? Cat.1的全称是LTEUE-Category1,其中UE指的是用户设备,它是LTE网络下用户终端设备的无线性能的分类。根据3GPP的定义,UE类别以1-15分为15个等级。Cat.1,可以称为“低配版”的 4G 终端,上行峰值…

Cat.1和Cat4的应用场景有什么区别

Cat.1是4G通信LTE网络下用户终端类别的一个标准。随着2G网络的承载能力进一步减弱,在新部署的物联网连接中NB-IoT、4G会逐步替代2G模组。相比NB-IoT,Cat.1在网络覆盖、速度和延时上均有优势;相比传统的LTE Cat.4模组则拥有低成本和低功耗优势。 Cat.1与C…

4G通信模块CAT1和CAT4的区别

简介 LTE CAT全名LTEUE-Category,拆开来解释:LTE指的是4GLTE网络、UE是指用户设备、Category翻译为等级。通顺解释就是用户设备能够支持的4GLTE网络传输速率的等级,也可以说成是4G网络速度的一个技术标准。所以LTE CAT1/CAT4就是指用户设备LTE网络接入能…

Python软件编程等级考试一级——20220618

Python软件编程等级考试一级——20220618 理论单选题判断题 实操第一题计算长方形的面积 画图题 Python软件编程等级考试一级——20220618——真题解析 理论 单选题 1、在Python编辑器中写好程序代码后,在Run菜单中,下列哪个命令可以用来执行程序&…

全国青少年编程等级考试python一级真题2021年3月(含题库答题软件账号)

对青少年编程等级考试Python真题答题考试系统关注的请点击 https://blog.csdn.net/zhengzyx2040/article/details/119329247 青少年软件编程(Python)等级考试试卷(一级) 分数:100 题数:37 一、单选题(…

全国计算机二级考试python考试流程

考试和未来教育的系统是基本完全一致的。可以用来练习。 但考试的时候没有pycharm这种智能一点的编译器。后面有介绍怎么打开。 做完选择题就必须要提交了。 这里有个小tip:其实选择题的后半部分(就是出现代码的那些题目),和后面大…

青少年python一级考试试题,青少年python一级考试

全国青少年软件编程等级考试是怎么样的? 一、组织机构:主办单位:中国电子学会承办单位:中国电子学会普及工作委员会、全国青少年电子信息科普创新联盟;经授权的地方教育主管部门、行业组织、科技馆、青少年宫、中小学…

计算机等级考试Python二级

文章目录 1.算法杂度1.1算法的特性1.2算法的基本要素1.3.1算法的控制结构1.3.2时间和空间复杂度 2.数据结构基本概念2.1数据结构的表示2.2线性表的顺序存储结构2.3线性链表2.4循环链表2.5栈和队列循环队列的计算 2.6树和二叉树二叉树的三序列辨别 2.7查找2.8排序2.8.1交换类排序…

大学考试Python考题

给你分享一下我自己亲身经历过的python考试题 记得点个关注~ 你可以参考下面的题进行练习,考试题换汤不换药,希望对你有帮助~ 一、选择题 1.下列哪个语句在Python中是非法的?( B ) A、x y z 1 B、x …

大学Python考试考什么题?

给你分享一下我自己亲身经历过的python考试题 记得点个关注~ 你可以参考下面的题进行练习,考试题换汤不换药,希望对你有帮助~ 一、选择题 1.下列哪个语句在Python中是非法的?( B ) A、x y z 1 B、x …

程序员如何备战全国计算机二级(Python)考试?

我于1979年考上大学,读的是自动控制专业,当时对计算机产生了浓厚的兴趣,记得那时学的语言是机器语言、汇编语言和Basic语言。大学毕业之后,一直在管理岗位工作,全国计算机等级考试首次于1994年开考,我取得了…

全国青少年编程等级考试python一级真题2020年9月(含题库答题软件账号)

对青少年编程等级考试Python真题答题考试系统关注的请点击 https://blog.csdn.net/zhengzyx2040/article/details/119329247 青少年软件编程(Python)等级考试试卷(一级A卷) 2020年9月 分数:100 题数&#xff1a…

全国计算机二级Python考试题型

导语 哈喽吖铁汁萌!有没有报Python的计算机二级等级考试涅?如果有,那么下面的内容很可能就对你有所帮助,如果没有报也没关系,我们继续看下去,总有一天也会用上的! 想领取更多完整源码跟Python学习资料可…

Python各种考试题库(考生回忆版)速来查看!

前言 给你分享一下我自己亲身经历过的python考试题 记得点个关注~ 你可以参考下面的题进行练习,考试题换汤不换药,希望对你有帮助~ 一、选择题 1.下列哪个语句在Python中是非法的?( B ) A、x y z 1 …