精华内容
下载资源
问答
  • catboost回归
    千次阅读
    2021-04-14 22:14:16

    ML之catboost:基于自定义数据集利用catboost 算法实现回归预测(训练采用CPU和GPU两种方式)

    目录

    基于自定义数据集利用catboost 算法实现回归预测(训练采用CPU和GPU两种方式)

    输出结果

    # T1、训练采用CPU

    # T2、训练采用GPU

    实现代码


    基于自定义数据集利用catboost 算法实现回归预测(训练采用CPU和GPU两种方式)

    输出结果

    # T1、训练采用CPU

    0:	learn: 7.9608417	total: 50.2ms	remaining: 1.46s
    1:	learn: 7.7618206	total: 50.5ms	remaining: 707ms
    2:	learn: 7.5879985	total: 50.9ms	remaining: 458ms
    3:	learn: 7.4148674	total: 51.4ms	remaining: 334ms
    4:	learn: 7.2488388	total: 51.6ms	remaining: 258ms
    5:	learn: 7.0676178	total: 51.8ms	remaining: 207ms
    6:	learn: 6.8909273	total: 51.9ms	remaining: 171ms
    7:	learn: 6.7186541	total: 52.1ms	remaining: 143ms
    8:	learn: 6.5506878	total: 52.3ms	remaining: 122ms
    9:	learn: 6.3869206	total: 52.4ms	remaining: 105ms
    10:	learn: 6.2272476	total: 52.6ms	remaining: 90.9ms
    11:	learn: 6.0715664	total: 52.8ms	remaining: 79.2ms
    12:	learn: 5.9197772	total: 52.9ms	remaining: 69.2ms
    13:	learn: 5.7717828	total: 53.1ms	remaining: 60.7ms
    14:	learn: 5.6274882	total: 53.2ms	remaining: 53.2ms
    15:	learn: 5.4868010	total: 53.4ms	remaining: 46.7ms
    16:	learn: 5.3496310	total: 53.6ms	remaining: 41ms
    17:	learn: 5.2158902	total: 53.7ms	remaining: 35.8ms
    18:	learn: 5.0854930	total: 53.9ms	remaining: 31.2ms
    19:	learn: 4.9583556	total: 54ms	remaining: 27ms
    20:	learn: 4.8343967	total: 54.2ms	remaining: 23.2ms
    21:	learn: 4.7135368	total: 54.4ms	remaining: 19.8ms
    22:	learn: 4.5956984	total: 54.5ms	remaining: 16.6ms
    23:	learn: 4.4808059	total: 54.7ms	remaining: 13.7ms
    24:	learn: 4.3687858	total: 54.9ms	remaining: 11ms
    25:	learn: 4.2595661	total: 55ms	remaining: 8.46ms
    26:	learn: 4.1530770	total: 55.2ms	remaining: 6.13ms
    27:	learn: 4.0492501	total: 55.3ms	remaining: 3.95ms
    28:	learn: 3.9480188	total: 55.5ms	remaining: 1.91ms
    29:	learn: 3.8493183	total: 55.7ms	remaining: 0us
    [14.72696421 19.90303684]
    

    # T2、训练采用GPU

    0:	learn: 7.9608417	total: 114ms	remaining: 3.29s
    1:	learn: 7.7618210	total: 118ms	remaining: 1.65s
    2:	learn: 7.5677758	total: 122ms	remaining: 1.1s
    3:	learn: 7.3785819	total: 125ms	remaining: 814ms
    4:	learn: 7.1941178	total: 128ms	remaining: 642ms
    5:	learn: 7.0142648	total: 132ms	remaining: 529ms
    6:	learn: 6.8389078	total: 136ms	remaining: 446ms
    7:	learn: 6.6679348	total: 140ms	remaining: 385ms
    8:	learn: 6.5012368	total: 143ms	remaining: 335ms
    9:	learn: 6.3387062	total: 149ms	remaining: 297ms
    10:	learn: 6.1802387	total: 153ms	remaining: 264ms
    11:	learn: 6.0257332	total: 156ms	remaining: 234ms
    12:	learn: 5.8750898	total: 162ms	remaining: 212ms
    13:	learn: 5.7282121	total: 166ms	remaining: 190ms
    14:	learn: 5.5850064	total: 171ms	remaining: 171ms
    15:	learn: 5.4453814	total: 175ms	remaining: 153ms
    16:	learn: 5.3092462	total: 180ms	remaining: 137ms
    17:	learn: 5.1765153	total: 184ms	remaining: 122ms
    18:	learn: 5.0471030	total: 188ms	remaining: 109ms
    19:	learn: 4.9209255	total: 193ms	remaining: 96.3ms
    20:	learn: 4.7979018	total: 196ms	remaining: 84.2ms
    21:	learn: 4.6779541	total: 200ms	remaining: 72.7ms
    22:	learn: 4.5610056	total: 204ms	remaining: 62.1ms
    23:	learn: 4.4469804	total: 208ms	remaining: 51.9ms
    24:	learn: 4.3358058	total: 212ms	remaining: 42.5ms
    25:	learn: 4.2274105	total: 218ms	remaining: 33.6ms
    26:	learn: 4.1217256	total: 223ms	remaining: 24.8ms
    27:	learn: 4.0186824	total: 227ms	remaining: 16.2ms
    28:	learn: 3.9182151	total: 230ms	remaining: 7.95ms
    29:	learn: 3.8202597	total: 235ms	remaining: 0us
    [14.67884178 20.        ]

    实现代码

    # ML之catboost:基于自定义数据集实现回归预测
    from catboost import CatBoostRegressor
    
    #1、定义数据集
    train_data = [[12, 14, 16, 18], 
                  [23, 25, 27, 29], 
                  [32, 34, 36, 38]]
    train_labels = [10, 20, 30]
    
    eval_data = [[2, 4, 6, 8], 
                 [20, 21, 24, 33]]
    
    #2、模型预测
    model_CatBR = CatBoostRegressor(iterations=30, learning_rate=0.1, depth=2)
    model_CatBR.fit(train_data, train_labels)
    preds = model_CatBR.predict(eval_data)
    print(preds)

    更多相关内容
  • Python实现Catboost回归模型(CatBoostRegressor算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。

     

    1.项目背景

    CatBoost是一种基于对称决策树(oblivious trees)为基学习器实现的参数较少、支持类别型变量和高准确性的GBDT框架,主要解决的痛点是高效合理地处理类别型特征,这一点从它的名字中可以看出来,CatBoost是由Categorical和Boosting组成。此外,CatBoost还解决了梯度偏差(Gradient Bias)以及预测偏移(Prediction shift)的问题,从而减少过拟合的发生,进而提高算法的准确性和泛化能力。本文使用CatBoostRegressor来解决回归问题。

    2.数据获取

    本次建模数据来源于网络(本项目撰写人整理而成),数据项统计如下:

    数据详情如下(部分展示):

    3.数据预处理

    3.1 用Pandas工具查看数据

    使用Pandas工具的head()方法查看前五行数据:

     从上图可以看到,总共有14个字段:参与机器学习的变量13个,其中id只是一个编号,建模时我们要去掉它。

    关键代码:

    3.2缺失值统计

    使用Pandas工具的info()方法统计每个特征缺失情况:

     从上图可以看到,数据不存在缺失值,总数据量为2400条。

    关键代码:

    3.3变量描述性统计分析

    通过Pandas工具的describe()方法来来统计变量的平均值、标准差、最大值、最小值、分位数等信息:

     关键代码如下:

    4.探索性数据分析

    4.1 spacegroup特征分布分析

    用Pandas工具的value_counts().plot()方法进行统计绘图,输出结果如下:

     

    图形化展示如下:

     从上面两个图中可以看到,分类为206的有490条,分类为33的有432条。

    4.2 number_of_total_atoms特征分布分析

     从上面两个图中可以看到,分类为80的有1410条,分类为40的有519条。

    4.3 相关性分析

    通过Pandas工具的corr()方法和seaborn工具的heatmap()方法绘制相关性热力图:

     从图中可以看到,正数为正相关,负数为负相关,绝对值越大相关性越强。

    4.4 变量的相关关系

    从图中可以看到,变量percent_atom_al和变量bandgap_energy_ev呈线性关系。

    4.5 bandgap_energy_ev变量直方图

    通过Matplotlib工具的hist()方法绘制直方图:

     从上图可以看到bandgap_energy_ev变量数据存在右偏现象。

    5.特征工程

    5.1 建立特征数据和标签数据

    bandgap_energy_ev为标签数据,除 id和bandgap_energy_ev之外的为特征数据。关键代码如下:

    5.2 数据集拆分

    数据集集拆分,分为训练集和测试集,80%训练集和20%测试集。关键代码如下:

    6.构建CatBoost回归模型

    主要使用CatBoostRegressor算法,用于目标回归。

    6.1模型参数

     关键代码如下:

    7.模型评估

    7.1评估指标及结果

    评估指标主要包括可解释方差值、平均绝对误差、均方误差、R方值等等。

     从上表可以看出,R方为93%  可解释方差值为93%,CatBoost回归模型比较优秀,效果非常好。

    关键代码如下:

    7.2 模型特征重要性

    特征重要性绘图展示:

    从上图可以看到特征变量对此模型的重要性依次为:

     

     7.3 真实值与预测值对比图

    从上图可以看出真实值和预测值波动基本一致,模型拟合效果非常棒。

    8.结论与展望

    综上所述,本文采用了CatBoost回归模型,最终证明了我们提出的模型效果良好。

     本次机器学习项目实战所需的资料,项目资源如下:

    项目说明:
    链接:https://pan.baidu.com/s/1dW3S1a6KGdUHK90W-lmA4w 
    提取码:bcbp

    网盘如果失效,可以添加博主微信:zy10178083

    展开全文
  • CatBoost回归分类模型

    本案例使用 CatBoost 创建一个员工流失模型,该模型将预测您哪些员工将在提交辞职信之前辞职。

    在人力资源分析领域,数据科学家现在正在使用其人力资源部门的员工数据来预测员工流失率。预测员工流失的技术与零售商用于预测客户流失的技术非常相似。

    在这个项目中,我将向您展示如何使用 CatBoost 算法创建一个简单的员工流失模型来预测您的哪些员工最有可能离职,并确定可能导致他们离职的因。

    模块安装:pip3 install catboost
    数据集下载:

    链接:https://pan.baidu.com/s/1aVvbZvDvl1DLnXU2fG-BIA?pwd=pmyc 
    提取码:pmyc
    

    数据如下:
    在这里插入图片描述
    数据说明:
    ‘satisfaction_level’: 在 0 到 1 的范围

    展开全文
  • 深入理解CatBoost

    千次阅读 多人点赞 2020-02-11 15:18:09
    CatBoost是一种基于对称决策树(oblivious trees)为基学习器实现的参数较少、支持类别型变量和高准确性的GBDT框架,主要解决的痛点是高效合理地处理类别型特征,这一点从它的名字中可以看出来,CatBoost是由...

    本文主要内容概览:
    在这里插入图片描述

    1.CatBoost简介

    CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,是Boosting族算法的一种。CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,都是在GBDT算法框架下的一种改进实现。XGBoost被广泛的应用于工业界,LightGBM有效的提升了GBDT的计算效率,而Yandex的CatBoost号称是比XGBoost和LightGBM在算法准确率等方面表现更为优秀的算法。

    CatBoost是一种基于对称决策树(oblivious trees)为基学习器实现的参数较少、支持类别型变量和高准确性的GBDT框架,主要解决的痛点是高效合理地处理类别型特征,这一点从它的名字中可以看出来,CatBoost是由Categorical和Boosting组成。此外,CatBoost还解决了梯度偏差(Gradient Bias)以及预测偏移(Prediction shift)的问题,从而减少过拟合的发生,进而提高算法的准确性和泛化能力。

    与XGBoost、LightGBM相比,CatBoost的创新点有:

    • 嵌入了自动将类别型特征处理为数值型特征的创新算法。首先对categorical features做一些统计,计算某个类别特征(category)出现的频率,之后加上超参数,生成新的数值型特征(numerical features)。
    • Catboost还使用了组合类别特征,可以利用到特征之间的联系,这极大的丰富了特征维度。
    • 采用排序提升的方法对抗训练集中的噪声点,从而避免梯度估计的偏差,进而解决预测偏移的问题。
    • 采用了完全对称树作为基模型。

    2. 类别型特征

    2.1 类别型特征的相关工作

    所谓类别型特征,即这类特征不是数值型特征,而是离散的集合,比如省份名(山东、山西、河北等),城市名(北京、上海、深圳等),学历(本科、硕士、博士等)。在梯度提升算法中,最常用的是将这些类别型特征转为数值型来处理,一般类别型特征会转化为一个或多个数值型特征。

    如果某个类别型特征基数比较低(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放一边。

    2.2 目标变量统计(Target Statistics)

    CatBoost算法的设计初衷是为了更好的处理GBDT特征中的categorical features。在处理 GBDT特征中的categorical features的时候,最简单的方法是用 categorical feature 对应的标签的平均值来替换。在决策树中,标签平均值将作为节点分裂的标准。这种方法被称为 Greedy Target-based Statistics , 简称 Greedy TS,用公式来表达就是:

    x ^ k i = ∑ j = 1 n [ x j , k = x i , k ] ⋅ Y i ∑ j = 1 n [ x j , k = x i , k ] \hat{x}_k^i=\frac{\sum_{j=1}^{n}[x_{j,k}=x_{i,k}]\cdot Y_i}{\sum_{j=1}^{n}[x_{j,k}=x_{i,k}]} \\ x^ki=j=1n[xj,k=xi,k]j=1n[xj,k=xi,k]Yi

    这种方法有一个显而易见的缺陷,就是通常特征比标签包含更多的信息,如果强行用标签的平均值来表示特征的话,当训练数据集和测试数据集数据结构和分布不一样的时候会出条件偏移问题。

    一个标准的改进 Greedy TS的方式是添加先验分布项,这样可以减少噪声和低频率类别型数据对于数据分布的影响:

    x ^ k i = ∑ j = 1 p − 1 [ x σ j , k = x σ p , k ] Y σ j + a ⋅ p ∑ j = 1 p − 1 [ x σ j , k = x σ p , k ] + a \hat{x}_k^i=\frac{\sum_{j=1}^{p-1}{[x_{\sigma_{j,k}}=x_{\sigma_{p,k}}]}Y_{\sigma_{j}}+a\cdot p}{\sum_{j=1}^{p-1}{[x_{\sigma_{j,k}}=x_{\sigma_{p,k}}]}+a} \\ x^ki=j=1p1[xσj,k=xσp,k]+aj=1p1[xσj,k=xσp,k]Yσj+ap

    其中 p p p 是添加的先验项, a a a 通常是大于 0 0 0 的权重系数。添加先验项是一个普遍做法,针对类别数较少的特征,它可以减少噪声数据。对于回归问题,一般情况下,先验项可取数据集label的均值。对于二分类,先验项是正例的先验概率。利用多个数据集排列也是有效的,但是,如果直接计算可能导致过拟合。CatBoost利用了一个比较新颖的计算叶子节点值的方法,这种方式(oblivious trees,对称树)可以避免多个数据集排列中直接计算会出现过拟合的问题。

    当然,在论文《CatBoost: unbiased boosting with categorical features》中,还提到了其它几种改进Greedy TS的方法,分别有:Holdout TS、Leave-one-out TS、Ordered TS。我这里就不再翻译论文中的这些方法了,感兴趣的同学可以自己翻看一下原论文。

    2.3 特征组合

    值得注意的是几个类别型特征的任意组合都可视为新的特征。例如,在音乐推荐应用中,我们有两个类别型特征:用户ID和音乐流派。如果有些用户更喜欢摇滚乐,将用户ID和音乐流派转换为数字特征时,根据上述这些信息就会丢失。结合这两个特征就可以解决这个问题,并且可以得到一个新的强大的特征。然而,组合的数量会随着数据集中类别型特征的数量成指数增长,因此不可能在算法中考虑所有组合。为当前树构造新的分割点时,CatBoost会采用贪婪的策略考虑组合。对于树的第一次分割,不考虑任何组合。对于下一个分割,CatBoost将当前树的所有组合、类别型特征与数据集中的所有类别型特征相结合,并将新的组合类别型特征动态地转换为数值型特征。CatBoost还通过以下方式生成数值型特征和类别型特征的组合:树中选定的所有分割点都被视为具有两个值的类别型特征,并像类别型特征一样被进行组合考虑。

    2.4 CatBoost处理Categorical features总结

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

    3. 克服梯度偏差

    对于学习CatBoost克服梯度偏差的内容,我提出了三个问题:

    • 为什么会有梯度偏差?
    • 梯度偏差造成了什么问题?
    • 如何解决梯度偏差?

    CatBoost和所有标准梯度提升算法一样,都是通过构建新树来拟合当前模型的梯度。然而,所有经典的提升算法都存在由有偏的点态梯度估计引起的过拟合问题。在每个步骤中使用的梯度都使用当前模型中的相同的数据点来估计,这导致估计梯度在特征空间的任何域中的分布与该域中梯度的真实分布相比发生了偏移,从而导致过拟合。为了解决这个问题,CatBoost对经典的梯度提升算法进行了一些改进,简要介绍如下。

    许多利用GBDT技术的算法(例如,XGBoost、LightGBM),构建下一棵树分为两个阶段:选择树结构和在树结构固定后计算叶子节点的值。为了选择最佳的树结构,算法通过枚举不同的分割,用这些分割构建树,对得到的叶子节点计算值,然后对得到的树计算评分,最后选择最佳的分割。两个阶段叶子节点的值都是被当做梯度或牛顿步长的近似值来计算。在CatBoost中,第一阶段采用梯度步长的无偏估计,第二阶段使用传统的GBDT方案执行。既然原来的梯度估计是有偏的,那么怎么能改成无偏估计呢?

    F i F_{i} Fi 为构建 i i i 棵树后的模型, g i ( X k , Y k ) g^i(X_k,Y_k) gi(Xk,Yk) 为构建 i i i 棵树后第 k k k 个训练样本上面的梯度值。为了使得 g i ( X k , Y k ) g^i(X_k,Y_k) gi(Xk,Yk) 无偏于模型 F i F_{i} Fi,我们需要在没有 X k X_k Xk 参与的情况下对模型 F i F_{i} Fi 进行训练。由于我们需要对所有训练样本计算无偏的梯度估计,乍看起来对于 F i F_{i} Fi 的训练不能使用任何样本,貌似无法实现的样子。我们运用下面这个技巧来处理这个问题:对于每一个样本 X k X_k Xk,我们训练一个单独的模型 M k M_k Mk ,且该模型从不使用基于该样本的梯度估计进行更新。我们使用 M k M_k Mk 来估计 X k X_{k} Xk 上的梯度,并使用这个估计对结果树进行评分。用伪码描述如下,其中 L o s s ( y j , a ) Loss(y_{j},a) Loss(yj,a) 是需要优化的损失函数, y y y 是标签值, a a a 是公式计算值。
    在这里插入图片描述

    4. 预测偏移和排序提升

    4.1 预测偏移

    对于学习预测偏移的内容,我提出了两个问题:

    • 什么是预测偏移?
    • 用什么办法解决预测偏移问题?

    预测偏移(Prediction shift)是由梯度偏差造成的。在GDBT的每一步迭代中, 损失函数使用相同的数据集求得当前模型的梯度, 然后训练得到基学习器, 但这会导致梯度估计偏差, 进而导致模型产生过拟合的问题。 CatBoost通过采用排序提升 (Ordered boosting) 的方式替换传统算法中梯度估计方法,进而减轻梯度估计的偏差,提高模型的泛化能力。下面我们对预测偏移进行详细的描述和分析。

    首先来看下GBDT的整体迭代过程:

    GBDT算法是通过一组分类器的串行迭代,最终得到一个强学习器,以此来进行更高精度的分类。它使用了前向分布算法,弱学习器使用分类回归树(CART)。

    假设前一轮迭代得到的强学习器是 F t − 1 ( x ) F^{t−1}(x) Ft1(x) , 损失函数是 L ( y , F t − 1 ( x ) ) L(y,{F^{t - 1}}(x)) L(y,Ft1(x)) ,则本轮迭代的目的是找到一个CART回归树模型的弱学习器 h t {h^t} ht ,让本轮的损失函数最小。式(1)表示的是本轮迭代的目标函数 h t {h^t} ht

    h t = arg ⁡ min ⁡ h ∈ H E L ( ( y , F t − 1 ( x ) + h ( x ) ) ) (1) {h^t} = \mathop {\arg \min }\limits_{h \in H} EL\left( {\left( {y,{F^{t - 1}}\left( x \right) + h\left( x \right)} \right)} \right) \tag{1} ht=hHargminEL((y,Ft1(x)+h(x)))(1)

    GBDT使用损失函数的负梯度来拟合每一轮的损失的近似值,式(2)中 g t ( x , y ) {g^t}(x,y) gt(x,y) 表示的是上述梯度。

    g t ( x , y ) = ∂ L ( y , s ) ∂ s ∣ s = F t − 1 ( x ) (2) {g^t}(x,y) = \frac{{\partial L(y,s)}}{{\partial s}}{|_{s = {F^{t - 1}}(x)}} \tag{2} gt(x,y)=sL(y,s)s=Ft1(x)(2)

    通常用式(3)近似拟合 h t {h^t} ht

    h t = arg ⁡ min ⁡ h ∈ H E ( − g t ( x , y ) − h ( x ) ) 2 (3) {h^t} = \mathop {\arg \min }\limits_{h \in H} E{( - {g^t}(x,y) - h(x))^2} \tag{3} ht=hHargminE(gt(x,y)h(x))2(3)

    最终得到本轮的强学习器,如式(4)所示:

    F t ( x ) = F t − 1 ( x ) + h t (4) {F^t}(x) = {F^{t - 1}}(x) + {h^t} \tag{4} Ft(x)=Ft1(x)+ht(4)

    在这个过程当中,偏移是这样发生的:

    根据 D \ { X k } \mathbb{D} \backslash \{X_k\} D\{Xk} 进行随机计算的条件分布 g t ( X k , y k ) ∣ X k g^t(X_k,y_k)|X_k gt(Xk,yk)Xk 与测试集的分布 g t ( X , y ) ∣ X g^t(X,y)|X gt(X,y)X 发生偏移,这样由公式(3)定义的基学习器 h t h^t ht 与公式(1)定义的产生偏差,最后影响模型 F t F^t Ft 的泛化能力。

    4.2 排序提升

    为了克服预测偏移问题,CatBoost提出了一种新的叫做Ordered boosting的算法。
    在这里插入图片描述
    由上图的Ordered boosting算法可知,为了得到无偏梯度估计, CatBoost对每一个样本 x i {x_i} xi 都会训练一个单独的模型 M i {M_i} Mi ,模型 M i {M_i} Mi 由使用不包含样本 x i {x_i} xi的训练集训练得到。我们使用 M i {M_i} Mi 来得到关于样本的梯度估计,并使用该梯度来训练基学习器并得到最终的模型。

    Ordered boosting算法好是好,但是在大部分的实际任务当中都不具备使用价值,因为需要训练 n n n 个不同的模型,大大增加的内存消耗和时间复杂度。在CatBoost当中,我们以决策树为基学习器的梯度提升算法的基础上,对该算法进行了改进。

    前面提到过,在传统的GBDT框架当中,构建下一棵树分为两个阶段:选择树结构和在树结构固定后计算叶子节点的值。CatBoost主要在第一阶段进行优化。在建树的阶段,CatBoost有两种提升模式,Ordered和Plain。Plain模式是采用内建的ordered TS对类别型特征进行转化后的标准GBDT算法。Ordered则是对Ordered boosting算法的优化。两种提升模式的具体介绍可以翻看论文《CatBoost: unbiased boosting with categorical features》。

    5. 快速评分

    CatBoost使用对称树(oblivious trees)作为基预测器。在这类树中,相同的分割准则在树的整个一层上使用。这种树是平衡的,不太容易过拟合。梯度提升对称树被成功地用于各种学习任务中。在对称树中,每个叶子节点的索引可以被编码为长度等于树深度的二进制向量。这在CatBoost模型评估器中得到了广泛的应用:我们首先将所有浮点特征、统计信息和独热编码特征进行二值化,然后使用二进制特征来计算模型预测值。

    6. 基于GPU实现快速训练

    • 密集的数值特征。 对于任何GBDT算法而言,最大的难点之一就是搜索最佳分割。尤其是对于密集的数值特征数据集来说,该步骤是建立决策树时的主要计算负担。CatBoost使用oblivious 决策树作为基模型,并将特征离散化到固定数量的箱子中以减少内存使用。就GPU内存使用而言,CatBoost至少与LightGBM一样有效。主要改进之处就是利用了一种不依赖于原子操作的直方图计算方法。
    • 类别型特征。 CatBoost实现了多种处理类别型特征的方法,并使用完美哈希来存储类别型特征的值,以减少内存使用。由于GPU内存的限制,在CPU RAM中存储按位压缩的完美哈希,以及要求的数据流、重叠计算和内存等操作。通过哈希来分组观察。在每个组中,我们需要计算一些统计量的前缀和。该统计量的计算使用分段扫描GPU图元实现。
    • 多GPU支持。 CatBoost中的GPU实现可支持多个GPU。分布式树学习可以通过数据或特征进行并行化。CatBoost采用多个学习数据集排列的计算方案,在训练期间计算类别型特征的统计数据。

    7. CatBoost的优缺点

    7.1 优点

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

    7.2 缺点

    • 对于类别型特征的处理需要大量的内存和时间;
    • 不同随机数的设定对于模型预测结果有一定的影响;

    8. CatBoost实例

    本篇文章所有数据集和代码均在我的GitHub中,地址:https://github.com/Microstrong0305/WeChat-zhihu-csdnblog-code/tree/master/Ensemble%20Learning/CatBoost

    8.1 安装CatBoost依赖包

    pip install catboost
    

    8.2 CatBoost分类

    (1)数据集

    这里我使用了 2015 年航班延误的 Kaggle 数据集,其中同时包含类别型变量和数值变量。这个数据集中一共有约 500 万条记录,我使用了 1% 的数据:5 万行记录。数据集官方地址:https://www.kaggle.com/usdot/flight-delays#flights.csv 。以下是建模使用的特征:

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

    实验说明: 在对 CatBoost 调参时,很难对类别型特征赋予指标。因此,同时给出了不传递类别型特征时的调参结果,并评估了两个模型:一个包含类别型特征,另一个不包含。如果未在cat_features参数中传递任何内容,CatBoost会将所有列视为数值变量。注意,如果某一列数据中包含字符串值,CatBoost 算法就会抛出错误。另外,带有默认值的 int 型变量也会默认被当成数值数据处理。在 CatBoost 中,必须对变量进行声明,才可以让算法将其作为类别型变量处理。

    (2)不加Categorical features选项的代码

    import pandas as pd, numpy as np
    from sklearn.model_selection import train_test_split, GridSearchCV
    from sklearn import metrics
    import catboost as cb
    
    # 一共有约 500 万条记录,我使用了 1% 的数据:5 万行记录
    # 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.to_csv("flight-delays/min_flights.csv")
    
    # 读取 5 万行记录
    data = pd.read_csv("flight-delays/min_flights.csv")
    print(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
    
    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)
    
    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, 500]}
    cb = cb.CatBoostClassifier()
    cb_model = GridSearchCV(cb, params, scoring="roc_auc", cv=3)
    cb_model.fit(train, y_train)
    # 查看最佳分数
    print(cb_model.best_score_)  # 0.7088001891107445
    # 查看最佳参数
    print(cb_model.best_params_)  # {'depth': 4, 'iterations': 500, 'l2_leaf_reg': 9, 'learning_rate': 0.15}
    
    # With Categorical features,用最优参数拟合数据
    clf = cb.CatBoostClassifier(eval_metric="AUC", depth=4, iterations=500, l2_leaf_reg=9,
                                learning_rate=0.15)
    
    clf.fit(train, y_train)
    
    print(auc(clf, train, test))  # (0.7809684655761157, 0.7104617034553192)
    

    (3)有Categorical features选项的代码

    import pandas as pd, numpy as np
    from sklearn.model_selection import train_test_split, GridSearchCV
    from sklearn import metrics
    import catboost as cb
    
    # 读取 5 万行记录
    data = pd.read_csv("flight-delays/min_flights.csv")
    print(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
    
    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)
    
    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]))
    
    
    # With Categorical features
    clf = cb.CatBoostClassifier(eval_metric="AUC", one_hot_max_size=31, depth=4, iterations=500, l2_leaf_reg=9,
                                learning_rate=0.15)
    clf.fit(train, y_train, cat_features=cat_features_index)
    
    print(auc(clf, train, test))  # (0.7817912095285117, 0.7152541135019913)
    

    8.3 CatBoost回归

    from catboost import CatBoostRegressor
    
    # Initialize data
    
    train_data = [[1, 4, 5, 6],
                  [4, 5, 6, 7],
                  [30, 40, 50, 60]]
    
    eval_data = [[2, 4, 6, 8],
                 [1, 4, 50, 60]]
    
    train_labels = [10, 20, 30]
    # Initialize CatBoostRegressor
    model = CatBoostRegressor(iterations=2,
                              learning_rate=1,
                              depth=2)
    # Fit model
    model.fit(train_data, train_labels)
    # Get predictions
    preds = model.predict(eval_data)
    print(preds)
    

    9. 关于CatBoost若干问题思考

    9.1 CatBoost与XGBoost、LightGBM的联系与区别?

    (1)2014年3月XGBoost算法首次被陈天奇提出,但是直到2016年才逐渐著名。2017年1月微软发布LightGBM第一个稳定版本。2017年4月Yandex开源CatBoost。自从XGBoost被提出之后,很多文章都在对其进行各种改进,CatBoost和LightGBM就是其中的两种。

    (2)CatBoost处理类别型特征十分灵活,可直接传入类别型特征的列标识,模型会自动将其使用One-hot编码,还可通过设置 one_hot_max_size参数来限制One-hot特征向量的长度。如果不传入类别型特征的列标识,那么CatBoost会把所有列视为数值特征。对于One-hot编码超过设定的one_hot_max_size值的特征来说,CatBoost将会使用一种高效的encoding方法,与mean encoding类似,但是会降低过拟合。处理过程如下:

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

    a v g _ t a r g e t = c o u n t I n C l a s s + p r i o r t o t a l C o u n t + 1 avg\_target = \frac{countInClass + prior}{totalCount + 1} \\ avg_target=totalCount+1countInClass+prior

    其中 countInClass 表示在当前类别型特征值中有多少样本的标记值是 1 1 1;prior 是分子的初始值,根据初始参数确定。totalCount 是在所有样本中(包含当前样本)和当前样本具有相同的类别型特征值的样本数量。

    LighGBM 和 CatBoost 类似,也可以通过使用特征名称的输入来处理类别型特征数据,它没有对数据进行独热编码,因此速度比独热编码快得多。LighGBM 使用了一个特殊的算法来确定属性特征的分割值。

    train_data = lgb.Dataset(data, label=label, feature_name=['c1', 'c2', 'c3'], categorical_feature=['c3'])
    

    注意,在建立适用于 LighGBM 的数据集之前,需要将类别型特征变量转化为整型变量,此算法不允许将字符串数据传给类别型变量参数。

    XGBoost 和 CatBoost、 LighGBM 算法不同,XGBoost 本身无法处理类别型特征,而是像随机森林一样,只接受数值数据。因此在将类别型特征数据传入 XGBoost 之前,必须通过各种编码方式:例如,序号编码、独热编码和二进制编码等对数据进行处理。

    10. Reference

    CatBoost论文解读:

    【1】Prokhorenkova L, Gusev G, Vorobev A, et al. CatBoost: unbiased boosting with categorical features[C]//Advances in Neural Information Processing Systems. 2018: 6638-6648.
    【2】Dorogush A V, Ershov V, Gulin A. CatBoost: gradient boosting with categorical features support[J]. arXiv preprint arXiv:1810.11363, 2018.
    【3】机器学习算法之Catboost,地址:https://www.biaodianfu.com/catboost.html
    【4】oblivious tree在机器学习中有什么用? - 李大猫的回答 - 知乎 https://www.zhihu.com/question/311641149/answer/593286799
    【5】CatBoost算法梳理,地址:http://datacruiser.io/2019/08/19/DataWhale-Workout-No-8-CatBoost-Summary/

    CatBoost算法讲解:

    【6】catboost完全指南,地址:https://zhuanlan.zhihu.com/p/102570430
    【7】CatBoost原理及实践 - Dukey的文章 - 知乎 https://zhuanlan.zhihu.com/p/37916954
    【8】 22(7).模型融合—CatBoost,地址:https://www.cnblogs.com/nxf-rabbit75/p/10923549.html#auto_id_0
    【9】catboost对类别特征处理的简单总结,地址:https://blog.csdn.net/weixin_42944192/article/details/102463796
    【10】Python3机器学习实践:集成学习之CatBoost - AnFany的文章 - 知乎 https://zhuanlan.zhihu.com/p/53591724

    CatBoost实战:

    【11】Catboost 一个超级简单实用的boost算法,地址:https://www.jianshu.com/p/49ab87122562
    【12】苗丰顺, 李岩, 高岑, 王美吉, 李冬梅. 基于CatBoost算法的糖尿病预测方法. 计算机系统应用, 2019, 28(9): 215-218.http://www.c-s-a.org.cn/1003-3254/7054.html
    【13】Battle of the Boosting Algos: LGB, XGB, Catboost,地址: https://www.kaggle.com/lavanyashukla01/battle-of-the-boosting-algos-lgb-xgb-catboost
    【14】Simple CatBoost,地址:https://www.kaggle.com/nicapotato/simple-catboost
    【15】CatBoost Usage examples,地址:https://catboost.ai/docs/concepts/python-usages-examples.html

    CatBoost的若干思考:

    【16】入门 | 从结构到性能,一文概述XGBoost、Light GBM和CatBoost的同与不同,地址:https://mp.weixin.qq.com/s/TD3RbdDidCrcL45oWpxNmw

    展开全文
  • CatBoost简介CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,是Boosting族算法的一种。CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,都是在GBDT算法框架下的一种改进实现。XGBoost被广泛的...
  • 详解 CatBoost 原理

    千次阅读 2022-04-07 15:47:34
    详解 CatBoost 原理 集成学习的两大准则:基学习器的准确性和多样性。 算法:串行的Boosting和并行的Bagging,前者通过错判训练样本重新赋权来重复训练,来提高基学习器的准确性,降低偏差!后者通过采样方法,训练出...
  • 特点 最准确 相对较慢 特征选择用法 CatBoost 通过 CatBoost 模型的 select_features 方法提供特征选择算法。一个简单的用法示例: model = CatBoost(params) summary = model.select_features( train_pool, #...
  • CatBoost讲解

    2022-03-16 17:06:17
    CatBoost三个特点 (1)“减少过度拟合”:这可以帮助你在训练计划中取得更好的成果。它基于一种构建模型的专有算法,这种算法与标准的梯度提升方案不同。 (2)“类别特征支持”:这将改善你的训练结果,同时允许你...
  • 最详细的Catboost参数详解与实例应用

    万次阅读 多人点赞 2020-12-16 12:39:22
    集成学习的两大准则:基学习器的准确性和多样性。 算法:串行的Boosting和...参数详解2.1通用参数:2.2默认参数2.3性能参数2.4参数调优3.CatBoost实战应用3.1回归案例3.2使用Pool加载数据集并进行预测3.3多分类案例..
  • catboost回归 catboost有一下三个的优点: 它自动采用特殊的方式处理类别型特征(categorical features)。首先对categorical features做一些统计,计算某个类别特征(category)出现的频率,之后加上超参数,生成...
  • catboost原理

    千次阅读 多人点赞 2020-02-20 21:32:24
    文章目录概述原理类别型特征类别型特征的相关工作目标变量统计(Target Statistics)CatBoost处理Categorical features总结梯度偏差/预测偏移为什么会有梯度偏差?梯度偏差造成了什么问题?如何解决梯度偏差/预测...
  • 【python 机器学习】机器学习算法之CatBoost

    千次阅读 多人点赞 2020-01-08 14:19:49
    五、CatBoost回归实战 六、CatBoost调参模块 七、CatBoost 参数详解 一、算法背景: 2017年俄罗斯的搜索巨头 Yandex 开源 Catboost 框架。Catboost(Categorical Features+Gradient Boosting)采用的策略...
  • CatBoost详解--原理

    千次阅读 2020-02-20 14:28:54
    CatBoost详解 CatBoost简介 CatBoost中处理类别特征的方法 算法实现 修正梯度偏差 快速评分 基于GPU快速学习 CatBoost的参数 CatBoost简介   CatBoost: 基本原理类似于常规的Gradient Boosting算法,只是在处理...
  • 我最近用一组数据用catboost进行回归模型训练,之前一直使用yellowbrick来绘制回归模型的残差图和预测误差图,但是好巧不巧,黄砖对xgboost和lightGBM都能识别,但是直接对cat却不能直接识别出来模型,后来搜索发现...
  • R语言构建catboost模型:构建catboost模型并基于网格搜索获取最优模型参数(Select hyperparameters)、计算特征重要度(feature importance) 目录 R语言构建catboost模型:构建catboost模型并基于网格搜索获取...
  • 本文主要参考Battle of the Boosting Algos: LGB, XGB, Catboost,结果与原文有出入。 文章目录1. 对比标准1.1 数据集1.2 规则1.3 版本2. 结果2.1 准确率2.2 训练时间和预测时间2.3 可解释性2.3.1 特征重要性2.3.2 ...
  • CatBoost参数解释

    万次阅读 2017-10-13 11:38:22
    CatBoost参数简单中文解释。
  • # coding:utf-8 import time notebookstart = time.time() import pandas as pd from sklearn import metrics from catboost import CatBoostRegressor ...catboost 回归简单实现 """ ######1.加载数据.
  • from sklearn.model_selection import StratifiedKFold from sklearn.metrics import roc_auc_score ## 数据降维处理的 from sklearn.model_selection import train_test_split from catboost import ...
  • CatBoost是一个快速,高性能的开放源代码库,可用于增强决策树的梯度。 这是一种具有大量应用程序的机器学习方法,包括针对Python,R,Java,C ++的排名,分类,回归和其他机器学习任务。 与许多数据集上的其他GBDT...
  • ML之catboostcatboost的CatBoostRegressor函数源代码简介、解读之详细攻略 目录 catboost的CatBoostRegressor函数源代码简介、解读 catboost的CatBoostRegressor函数源代码简介、解读 class ...
  • 从结构到性能,一文概述XGBoost、Light GBM和CatBoost的同与不同 决策树模型,XGBoost,LightGBM和CatBoost模型可视化 XGBoost、LightGBM和CatBoost 1、XGBoost XGBoost是陈天奇于2014年提出的一种算法,被称为...
  • GBDT的迭代使用了前向分布算法,弱学习器限定了只能使用CART回归树模型,每次迭代的目标是找到一个CART回归树模型的弱学习器使得损失函数最小。 GBDT与传统的Boosting区别较大,它的每一次计算都是为了减少上一次...
  • 一文理解CatBoost

    2020-04-05 11:24:43
    1. CatBoost简介CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,是Boosting族算法的一种。CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,都是在GBDT算法框架下的一种改进实现。XGBoost被广泛...
  • 我们知道,CatBoost可以很好地处理类别型数据。然而,它还具有大量的训练参数,可以更好地对类别型特征进行预处理。本文中,小猴子将和大家一起学习如何使用这些参数处理类别型特征的。CatBoost是一个开放源码的梯度...
  • CatBoost 总结 介绍 在集成学习中,目标是用多种学习算法最成功地训练模型。Bagging方法是一种集成学习方法,将多个模型并行应用于同一数据集的不同子样本。Boosting是另一种在实践中经常使用的方法,它不是并行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,618
精华内容 647
关键字:

catboost回归

友情链接: c_classroom_system.rar