GBDT 如何用于分类问题
❝
因为用树模型太习以为常了,以至于看到这个标题很容易觉得这很显然。但越简单的东西越容易出现知识盲区,仔细想一下好像确实有点疑问:GBDT 用的是回归树,是如何做的分类呢?
- 作者:1直在路上1
- https://www.cnblogs.com/always-fight/p/9400346.html
编辑:阿泽的学习笔记
❞
一 简介
GBDT 在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一,在前几年深度学习还没有大行其道之前,GBDT 在各种竞赛是大放异彩。原因大概有几个
效果确实挺不错;
既可以用于分类也可以用于回归;
可以筛选特征。
这三点实在是太吸引人了,导致在面试的时候大家也非常喜欢问这个算法。
GBDT 是通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法。
GBDT 通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度。
二 GBDT如何用于分类的
第一步:「训练的时候,是针对样本 X 每个可能的类都训练一个分类回归树」。如目前的训练集共有三类,即 K = 3,样本 x 属于第二类,那么针对样本x的分类结果,我们可以用一个三维向量 [0,1,0] 来表示,0 表示不属于该类,1 表示属于该类,由于样本已经属于第二类了,所以第二类对应的向量维度为 1,其他位置为 0。
针对样本有三类的情况,我们实质上是在每轮的训练的时候是同时训练三颗树。第一颗树针对样本 x 的第一类,输入是
,第二颗树针对样本x的第二类,输入是 ,第三颗树针对样本x的第三类,输入是 。
在对样本 x 训练后产生三颗树,对 x 类别的预测值分别是
,那么在此类训练中,样本 x 属于第一类,第二类,第三类的概率分别是:
然后可以求出针对第一类,第二类,第三类的残差分别是:
然后开始第二轮训练,针对第一类输入为
,针对第二类输入为 ,针对第三类输入为 ,继续训练出三颗树。一直迭代M轮,每轮构建三棵树当训练完毕以后,新来一个样本 ,我们需要预测该样本的类别的时候,便产生三个值 ,则样本属于某个类别 c 的概率为:
三 GBDT多分类举例说明
下面以 Iris 数据集的六个数据为例来展示 GBDT 多分类的过程
具体应用到 gbdt 多分类算法。我们用一个三维向量来标志样本的 label,[1,0,0] 表示样本属于山鸢尾,[0,1,0] 表示样本属于杂色鸢尾,[0,0,1] 表示属于维吉尼亚鸢尾。
gbdt 的多分类是针对每个类都独立训练一个 CART Tree。所以这里,我们将针对山鸢尾类别训练一个 CART Tree 1。杂色鸢尾训练一个 CART Tree 2 。维吉尼亚鸢尾训练一个CART Tree 3,这三个树相互独立。
我们以样本 1 为例:
针对 CART Tree1 的训练样本是 [5.1,3.5,1.4,0.2],label 是 1,模型输入为 [5.1, 3.5, 1.4, 0.2, 1]
针对 CART Tree2 的训练样本是 [5.1,3.5,1.4,0.2],label 是 0,模型输入为 [5.1, 3.5, 1.4, 0.2, 0]
针对 CART Tree3 的训练样本是 [5.1,3.5,1.4,0.2],label 是 0,模型输入为[5.1, 3.5, 1.4, 0.2, 0]
下面我们来看 CART Tree1 是如何生成的,其他树 CART Tree2 , CART Tree 3 的生成方式是一样的。CART Tree 的生成过程是从这四个特征中找一个特征做为 CART Tree1 的节点。
比如花萼长度做为节点。6 个样本当中花萼长度大于等于 5.1 cm 的就是 A 类,小于 5.1 cm 的是 B 类。生成的过程其实非常简单,问题
是哪个特征最合适?
是这个特征的什么特征值作为切分点?
即使我们已经确定了花萼长度做为节点。花萼长度本身也有很多值。在这里我们的方式是遍历所有的可能性,找到一个最好的特征和它对应的最优特征值可以让当前式子的值最小:
我们以第一个特征的第一个特征值为例。R1 为所有样本中花萼长度小于 5.1cm 的样本集合,R2 为所有样本中花萼长度大于等于 5.1cm 的样本集合,所以
。
为 R1 所有样本label的均值:, 为 R2 所有样本 label 的均值:
下面计算损失函数的值,采用平方误差,分别计算 R1 和 R2 的误差平方和,样本 2 属于 R1 的误差:
,样本 1,3,4,5,6 属于 R2 的误差和:
接着我们计算第一个特征的第二个特征值,即 R1 为所有样本中花萼长度小于 4.9 cm 的样本集合,R2 为所有样本当中花萼长度大于等于 4.9 cm 的样本集合,
, 为 R1 所有样本 label 的均值:0, 为 R2 所有样本 label 的均值:
计算所有样本的损失值,样本 1 和 2 属于 R2,损失值为:
,样本 3,4,5,6 也属于 R2,损失值为:,两组损失值和为 2.222,大于特征一的第一个特征值的损失值,所以我们不取这个特征的特征值。
「继续,这里有四个特征,每个特征有六个特征值,所有需要 6*4=24 个损失值的计算,我们选取值最小的分量的分界点作为最佳划分点,这里我们就不一一计算了,直接给出最小的特征花萼长度,特征值为 5.1 cm。这个时候损失函数最小为 0.8。于是我们的预测函数此时也可以得到:」
「此例子中 ,训练完以后的最终式子为:」
由这个式子,我们得到对样本属于类别 1 的预测值:
,同理我们可以得到对样本属于类别 2,3 的预测值 ,样本属于类别 1 的概率:
下载一:中文版!学习TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!后台回复【五件套】
下载二:南大模式识别PPT后台回复【南大模式识别】
说个正事哈
由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:
(1)点击页面最上方“深度学习自然语言处理”,进入公众号主页。
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
感谢支持,比心。
投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。
方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。
记得备注呦
推荐两个专辑给大家:
专辑 | 李宏毅人类语言处理2020笔记
专辑 | NLP论文解读
专辑 | 情感分析
整理不易,还望给个在看!
GBDT 如何用于分类问题相关推荐
- GBDT 算法如何用于分类问题
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:1直在路上1,来源:阿泽的学习笔记 ❝ 因为用树模型太习以为常了, ...
- 【AI面试题】GBDT原理、如何用于分类、常用损失函数
1. 简述GBDT原理 2. GBDT如何用于分类 3. GBDT常用损失函数 回归问题:
- Keras构建用于分类任务的Transformer(Vision Transformer/VIT)
文章目录 一.Vision Transformer (ViT)详细信息 二.Vision Transformer结构 三.Keras实现 3.1 相关包 3.2 数据读取 3.3 声明超参数 3.4 ...
- 【ML】自动编码器结合逻辑回归用于分类预测(数据+代码详细教程)
自动编码器(aotoencoder)是一种神经网络,可用于学习原始数据的压缩表征.一种自动编码器由编码器(encoder)和解码器(decoder)两个子模型组成.编码器压缩输入,解码器尝试从编码器提 ...
- Pytorch总结三之 softmax回归用于分类问题
Pytorch总结三之 softmax回归用于分类问题 上篇博文Pytorch总结二之线性回归算法原理与实现介绍的线性回归模型适⽤于输出为连续值的情景. 在另⼀类情景中,模型输出可以是⼀个像图像类别这 ...
- ImageNet 数据集准备(用于分类)
ImageNet 数据集准备(用于分类) 主要内容 改存储 解压 图片预处理 常用命令 常见BUG 文件传输出现`No space left on device`问题(如下) torch导入数据时出现 ...
- 图半监督极限学习机用于分类
0.前言 前期博文适用于小样本时间序列预测的图半监督学习方法介绍了图半监督方法,本博文先将图半监督方法与ELM结合用于分类,检验图半监督学习方法的有效性.后期博文将复现博文适用于小样本时间序列预测的图 ...
- sklearn实现GBDT算法(分类)
阿喽哈~小天才们,今天我们聊一聊GBDT 上一篇文章我们详细地说了GBDT算法原理,包括为什么拟合负梯度.负梯度为何可以替代残差.二分类GBDT算法公式和实例演算,感兴趣的童鞋请移步GBDT算法详解& ...
- matlab 神经网络ann用于分类方法
matlab关于ann的分类方法讲解了一个例子,Fishr集上鸢尾花(Iris)的分类,学习了这个方法可以套用在个人项目上使用,万变不离其宗, 1.Fishr集上鸢尾花Iris数据集的分类 ①iris ...
- python分类时特征选择_关于python:是否有可用于分类数据输入的特征选择算法?...
我正在训练一个具有10个左右分类输入的神经网络. 在对这些分类输入进行一次热编码之后,我最终将大约500个输入馈入网络. 我希望能够确定我每个分类输入的重要性. Scikit-learn具有许多功能重 ...
最新文章
- 【Scala-spark.mlib】稠密矩阵和稀疏矩阵的创建及操作
- Codeforces Round #630 (Div. 2) A~D【思维,数论,字符串,位运算】
- VSCODE常用开发环境配置----保存
- js正则验证特殊字符
- 特斯拉的三季度:车卖很多、车主很烦、股价很魔幻
- 聊聊 MySql 索引那些事儿
- 基于TableStore的海量气象格点数据解决方案实战
- tensorflow RNN循环神经网络 (分类例子)-【老鱼学tensorflow】
- Intellij idea 出现错误 error:java: 无效的源发行版: 11解决方法
- 用ShopEx网上开店之安装Zend插件
- Strut2页面传参跳转 --Struts2
- 周鸿祎,会是下一个“贾跃亭”吗?
- php 改变页面元素,动态更改网页HTML元素(对象)内容_经验交流
- vs中未能找到list.cs_意甲7-29 03:45国际米兰vs那不勒斯,国际米兰主场十拿九稳
- Linux多线程编程-线程间参数传递
- 用电子签章实现企业招投标安全高效,流程一体化
- 毕向东 Java学习 笔记一
- 使用ARKit编写测量应用程序代码:交互和测量
- 物联网的体系结构和关键技术
- 使用 腾讯云搭建一个个人博客
热门文章
- ideal使用eclipse快捷键
- Win10系列:VC++绘制几何图形2
- FuisonInsight Hadoop中新增用户和Hbase授权
- MySQL 服务无法启动。服务没有报告任何错误。
- java-设计模式(行为型)-【命令模式】
- spin_lock amp; mutex_lock的差别?
- 地方税务局行政效能管理(行政审批)整体解决方案
- 【leetcode】面试题 03.03. 堆盘子vector_stack的使用
- hightcharts 如何修改legend图例的样式
- JAVA基础--JAVA中的反射机制详解(转)