gbdt详解

20220117

https://blog.csdn.net/xixiaoyaoww/article/details/105182792
gtbd分类

20210201

梯度下降从来都是拟合负梯度,GBDT平方损失只是恰好等于残差
李航的直接计算每种划分对应的最小损失和利用梯度下降计算会得到类似的结果
https://mp.weixin.qq.com/s/F4YHEpfa280cpR4tgL0Maw
AI面试题之GBDT梯度提升树

https://mp.weixin.qq.com/s/D31xz6oR68J8GM20EFGWYw
决策树与迭代决策树(GBDT) 重点
GBDT同随机森林一样,不容易陷入过拟合,而且能够得到很高的精度

https://mp.weixin.qq.com/s/NBHF-se8UmDEGy9cKX_VQQ
GBDT算法原理以及实例理解

https://mp.weixin.qq.com/s/9SrciKW-nJJMA2BbTs5CLg
GBDT算法原理以及代码实现

目录:

GBDT分类算法简介
GBDT二分类算法
2.1 逻辑回归的对数损失函数
2.2 GBDT二分类原理
GBDT二分类算法实例
手撕GBDT二分类算法
4.1 用Python3实现GBDT二分类算法
4.2 用sklearn实现GBDT二分类算法
GBDT分类任务常见的损失函数
总结
Reference
本文的主要内容概览

在这里插入图片描述
1 GBDT分类算法简介

GBDT无论用于分类还是回归,一直使用的是CART回归树。GBDT不会因为我们所选择的任务是分类任务就选用分类树,这里的核心原因是GBDT每轮的训练是在上一轮训练模型的负梯度值基础之上训练的。这就要求每轮迭代的时候,真实标签减去弱分类器的输出结果是有意义的,即残差是有意义的。如果选用的弱分类器是分类树,类别相减是没有意义的。对于这样的问题,可以采用两种方法来解决:
采用指数损失函数,这样GBDT就退化成了Adaboost,能够解决分类的问题;
使用类似于逻辑回归的对数似然损失函数,如此可以通过结果的概率值与真实概率值的差距当做残差来拟合;
下面我们就通过二分类问题,去看看GBDT究竟是如何做分类的。

2 GBDT二分类算法
2.1 逻辑回归的对数损失函数
逻辑回归的预测函数为:

在这里插入图片描述
在这里插入图片描述
F(x)带入的时候没看懂
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3 GBDT二分类算法实例

3.1 数据集介绍
训练集如下表所示,一组数据的特征有年龄和体重,把身高大于1.5米作为分类边界,身高大于1.5米的令标签为1,身高小于等于1.5米的令标签为0,共有4组数据。

在这里插入图片描述
测试数据如下表所示,只有一组数据,年龄为25、体重为65,我们用在训练集上训练好的GBDT模型预测该组数据的身高是否大于1.5米?

在这里插入图片描述
3.2 模型训练阶段
参数设置:

学习率:learning_rate = 0.1
迭代次数:n_trees = 5
树的深度:max_depth = 3
在这里插入图片描述
上式公式 yi 取值为0或者1
F(xi) 为初始 F0(x)=0
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
平方损失是如何计算的 就是负梯度?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面将展示每棵树最终的结构,这些图都是我GitHub上的代码生成的,感兴趣的同学可以去运行一下代码。
https://github.com/Microstrong0305/WeChat-zhihu-csdnblog-code/tree/master/Ensemble%20Learning/GBDT_GradientBoostingBinaryClassifier

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4 手撕GBDT二分类算法
本篇文章所有数据集和代码均在GitHub中,地址:https://github.com/Microstrong0305/WeChat-zhihu-csdnblog-code/tree/master/Ensemble%20Learning

4.1 用Python3实现GBDT二分类算法
需要的Python库:

pandas、PIL、pydotplus、matplotlib
br

其中pydotplus库会自动调用Graphviz,所以需要去Graphviz官网下载graphviz-2.38.msi安装,再将安装目录下的bin添加到系统环境变量,最后重启计算机。
由于用Python3实现GBDT二分类算法代码量比较多,我这里就不列出详细代码了,感兴趣的同学可以去GitHub中看一下,地址:https://github.com/Microstrong0305/WeChat-zhihu-csdnblog-code/tree/master/Ensemble%20Learning/GBDT_GradientBoostingBinaryClassifier

4.2 用sklearn实现GBDT二分类算法

import numpy as np
from sklearn.ensemble import GradientBoostingClassifier

'''
调参:
loss:损失函数。有deviance和exponential两种。deviance是采用对数似然,exponential是指数损失,后者相当于AdaBoost。
n_estimators:最大弱学习器个数,默认是100,调参时要注意过拟合或欠拟合,一般和learning_rate一起考虑。
learning_rate:步长,即每个弱学习器的权重缩减系数,默认为0.1,取值范围0-1,当取值为1时,相当于权重不缩减。较小的learning_rate相当于更多的迭代次数。
subsample:子采样,默认为1,取值范围(0,1],当取值为1时,相当于没有采样。小于1时,即进行采样,按比例采样得到的样本去构建弱学习器。这样做可以防止过拟合,但是值不能太低,会造成高方差。
init:初始化弱学习器。不使用的话就是第一轮迭代构建的弱学习器.如果没有先验的话就可以不用管

由于GBDT使用CART回归决策树。以下参数用于调优弱学习器,主要都是为了防止过拟合
max_feature:树分裂时考虑的最大特征数,默认为None,也就是考虑所有特征。可以取值有:log2,auto,sqrt
max_depth:CART最大深度,默认为None
min_sample_split:划分节点时需要保留的样本数。当某节点的样本数小于某个值时,就当做叶子节点,不允许再分裂。默认是2
min_sample_leaf:叶子节点最少样本数。如果某个叶子节点数量少于某个值,会同它的兄弟节点一起被剪枝。默认是1
min_weight_fraction_leaf:叶子节点最小的样本权重和。如果小于某个值,会同它的兄弟节点一起被剪枝。一般用于权重变化的样本。默认是0
min_leaf_nodes:最大叶子节点数
'''

gbdt = GradientBoostingClassifier(loss='deviance', learning_rate=0.1, n_estimators=5, subsample=1
                                  , min_samples_split=2, min_samples_leaf=1, max_depth=3
                                  , init=None, random_state=None, max_features=None
                                  , verbose=0, max_leaf_nodes=None, warm_start=False
                                  )

train_feat = np.array([[1, 5, 20],
                       [2, 7, 30],
                       [3, 21, 70],
                       [4, 30, 60],
                       ])
train_label = np.array([[0], [0], [1], [1]]).ravel()

test_feat = np.array([[5, 25, 65]])
test_label = np.array([[1]])
print(train_feat.shape, train_label.shape, test_feat.shape, test_label.shape)

gbdt.fit(train_feat, train_label)
pred = gbdt.predict(test_feat)

total_err = 0
for i in range(pred.shape[0]):
    print(pred[i], test_label[i])
    err = (pred[i] - test_label[i]) / test_label[i]
    total_err += err * err
print(total_err / pred.shape[0])

用sklearn中的GBDT库实现GBDT二分类算法的难点在于如何更好的调节下列参数:

在这里插入图片描述
用sklearn实现GBDT二分类算法的GitHub地址:https://github.com/Microstrong0305/WeChat-zhihu-csdnblog-code/tree/master/Ensemble%20Learning/GBDT_Classification_sklearn

5 GBDT分类任务常见损失函数

在这里插入图片描述
6 总结
在本文中,我们首先简单介绍了如何把GBDT回归算法变成分类算法的思路;然后从逻辑回归的对数损失函数推导出GBDT的二分类算法原理;其次不仅用Python3实现GBDT二分类算法,还用sklearn实现GBDT二分类算法;最后介绍了GBDT分类任务中常见的损失函数。GBDT可以完美的解决二分类任务,那么它对多分类任务是否有效呢?如果有效,GBDT是如何做多分类呢?这些问题都需要我们不停的探索和挖掘GBDT的深层原理。让我们期待一下GBDT在多分类任务中的表现吧!

20210115
gbdt 论文
https://www.cnblogs.com/bentuwuying/p/6667267.html
https://xueshu.baidu.com/usercenter/paper/show?paperid=ab7165108163edc94b30781e51819e0c&site=xueshu_se

https://mp.weixin.qq.com/s?src=11&timestamp=1610677071&ver=2829&signature=f9wQHmE-ilDSLKj1dXgx5c4YpLF4mPxsIPyaNQTxfIV2D9QmFAcLhe9lyIzdZWBhqUD0hj45YOBdIYDDyX2wIKCwTLxyzh6Ox9KwEa48gead3ooFcywmk7EpIO9N1K&new=1
【务实基础】梯度提升树GBDT 其中基尼系数比较详细
推导的公式的各个符号说明的也比较详细

https://blog.csdn.net/zpalyq110/article/details/79527653
案列
还得再看 第二轮的平方损失是怎么计算的 也是所有的标签的平均?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值