机器学习 | 详解GBDT在分类场景中的应用原理与公式推导
本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是机器学习专题的第31篇文章,我们一起继续来聊聊GBDT模型。
在上一篇文章当中,我们学习了GBDT这个模型在回归问题当中的原理。GBDT最大的特点就是对于损失函数的降低不是通过调整模型当中已有的参数实现的,若是通过训练新的CART决策树来逼近的。也就是说是通过增加参数而不是调整参数来逼近损失函数最低点。
如果对于这部分不是很理解的话,可以通过下方的链接回顾一下之前的内容:
机器学习 | 详解GBDT梯度提升树原理,看完再也不怕面试了
逻辑回归损失函数
在我们开始GBDT模型原理的讲解和推导之前,我们先来回顾一下逻辑回归当中的相关公式和概念。
首先,我们先来写出逻辑回归的预测函数:
\]
图像画出来是这样的,其中的\(h_{\theta}(x)\)表示表示了模型预测x这个样本属于类别1的概率。

在二分类问题当中,只有0和1两个类别, 两个类别的概率只和为1。所以我们可以得到\(P(y=0|x;\theta)=1 - h_{\theta}(x)\)。
我们希望模型在y=0的时候,使得\(1 - h_{\theta}(x)\)尽量大,否则则使得\(h_{\theta}(x)\)尽量大,我们用指数的形式把两者综合写出了它的损失函数L。
\]
这个值涉及到指数,计算起来不太方便,所以我们会对它求对数进行简化。等式两边都取对数之后,可以得到:
\]
这个就是逻辑回归损失函数的由来。
GBDT二分类
我们将GBDT模型应用在二分类的场景当中的原理其实和逻辑回归一样,只不过在逻辑回归当中\(h_{\theta}(x)\)是一个线性函数,而在GBDT当中,\(h_{\theta} = \sum_{m=1}^M f_m(x)\),是一个加法模型。
在GBDT的回归问题当中,\(h_{\theta}\)就是GBDT产出的最后结果,而在二分类问题当中,我们还需要对这个结果加上一个sigmoid函数。我们令上面的\(h_{\theta}\)为\(F_M(x)\),所以模型可以表达为:
\]
我们把这个式子带入逻辑回归的损失函数当中,可以得到:
L(x_i, y_i | F_M(x)) &= -y_i\log (\frac{1}{1 + e^{-F_M(x_i)}}) - (1 - y_i)\log (1 - \frac{1}{1 + e^{-F_M(x_i)}} )\\
&= y_i \log(1 + e^{-F_M(x_i)}) + (1 - y_i)[F_M(x_i) + \log (1 + e^{-F_M(x_i)})]
\end{aligned}
\]
我们对损失函数计算负梯度,也即计算\(L(x, y |F_M(X))\)对\(F_M(x)\)的偏导:
\]
这个负梯度也就是我们常说的残差,这个残差的结果和我们之前在回归问题当中的推导结果非常近似。它表示预测概率和真实概率的概率差,这个残差就是下一棵CART树的训练目标。
训练过程
我们再把模型训练的整个过程给整理一下,把所有的细节串联起来。
首先我们先明确几个参数,M表示决策树的数量。\(F_m(x_i)\)表示第m轮训练之后的整体,\(F_m(x_i)\)即为最终输出的GBDT模型。
初始化
首先,我们创建第一棵回归树即\(f_1(x)\),在二分类问题当中,它是先验信息,所以:
\[f_1(x) = \log \frac{p1}{1-p1}$$,p1表示**样本中类别1的比例**\]
i. 对于第2到第m棵回归树,我们要计算出每一棵树的训练目标, 也就是前面结果的残差:
\[r_{mi}=-[\frac{\partial L(y_i, f(x_i))}{\partial f(x_i)}]_{f(x) = f_{m-1}(x)}=y_i - \hat{y_i}
\]ii. 对于当前第m棵子树而言,我们需要遍历它的可行的切分点以及阈值,找到最优的预测值c对应的参数,使得尽可能逼近残差,我们来写出这段公式:
\[c_{mj}=\mathop{\arg\min}_{c} \ \ \ \sum_{x_i\in R_{mj}}L(y_i, f_{m-1}(x_i) + c)
\]这里的\(R_{mj}\)指的是第m棵子树所有的划分方法中叶子节点预测值的集合,也就是第m棵回归树可能达到的预测值。其中j的范围是1,2,3...J。
接着,我们更新\(f_m(x) = f_{m-1}(x) + \sum_{j=1}^J c_{mj}I(x \in R_{mj})\),这里的I是一个函数,如果样本落在了\(R_{mj}\)节点上,那么I=1,否则I=0。
我们得到
\[F_M(x) = f_M(x) = \sum_{m=1}^Mf_m(x)=\sum_{m=1}^M\sum_{j=1}^J c_{mj}I(x \in R_{mj})
\]某条样本类别为1的概率为:
\[P(x_i) = \frac{1}{1 + e^{-F_M(x_i)}}
\]
多分类问题
二分类的问题解决了,多分类也并不困难,其实也只是二分类的一个简单拓展。
我们假设样本的类别数量是k,那么我们需要k个不同的树集合来拟合每个类别的概率。我们写出类别q的概率的公式:
\]
softmax函数的损失函数为:\(L = -\sum y_i \log(P(y_i | x))\),虽然从公式里看这是一个求和值,但是对于多分类问题来说,只会有一个类别为1,其余均为0,所以只会有一项不为0,我们假设这一项为q。我们代入求出它的负梯度:
\]
可见在多分类问题当中,这k个树集合同样是拟合真实的样本标签与预测的概率的差值,本质上和二分类问题是一样的。
总结
到这里,关于GBDT在分类场景当中的原理我们也介绍完了。其实整篇推倒下来,无论是过程和结果都和回归问题大同小异。只不过由于分类问题用到了sigmoid函数,使得计算偏导以及残差的过程稍稍复杂了一些,其他并没有什么本质差别。
从今天的文章当中我们也可以看出来,GBDT模型适用的范围很广,回归、二分类以及多分类问题都可以适用,是一个非常强大的模型。也正因此,它在深度学习兴起之前一度非常流行,基于它也衍生出了许多的改进的版本和应用。比如XGboost,GBDT + LR等等。也因此在面试的时候经常会问到其中的问题,如果有准备面试的同学,建议一定要将原理吃透哦。
今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。
机器学习 | 详解GBDT在分类场景中的应用原理与公式推导的更多相关文章
- 机器学习 | 详解GBDT梯度提升树原理,看完再也不怕面试了
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第30篇文章,我们今天来聊一个机器学习时代可以说是最厉害的模型--GBDT. 虽然文无第一武无第二,在机器学习领域并没有 ...
- 详解BOM用途分类及在汽车企业中的应用
摘要:在整车企业中,信息系统的BOM是联系CAD.CAPP.PDM和ERP的纽带,按照用途划分产品要经过产品设计,工程设计.工艺制造设计.生产制造4个阶段,相应的在这4个过程中分别产生了名称十分相似但 ...
- 【机器学习详解】SMO算法剖析(转载)
[机器学习详解]SMO算法剖析 转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/51227754 CSDN−勿在浮沙筑高台 本文力 ...
- 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器
本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...
- 详解在Word文档中常见的各种公式编辑问题
正常情况下,我们在安装完成MathType之后会直接加载在Word文档中,Word文档中的MathType比较复杂,新手操作遇到麻烦也是常有的事,今天就来给大家详解下Word文档中常见的MathTyp ...
- 【PPT详解】曹欢欢:今日头条算法原理
[PPT详解]曹欢欢:今日头条算法原理 悟空智能科技 4月8日 公众号后台回复:“区块链”,获取区块链报告 公众号后台回复:“sq”,进入区块链分享社群 热文推荐: 1000位专家推荐,20本区块链必 ...
- 详解 QT 源码之 Qt 事件机制原理
QT 源码之 Qt 事件机制原理是本文要介绍的内容,在用Qt写Gui程序的时候,在main函数里面最后依据都是app.exec();很多书上对这句的解释是,使 Qt 程序进入消息循环.下面我们就到ex ...
- Android 网络框架之Retrofit2使用详解及从源码中解析原理
就目前来说Retrofit2使用的已相当的广泛,那么我们先来了解下两个问题: 1 . 什么是Retrofit? Retrofit是针对于Android/Java的.基于okHttp的.一种轻量级且安全 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
随机推荐
- springboot文件上传 流的方式 后台计算上传进度
//代码 public static void main(String[] args) throws Exception { String path = "f:/svn/t_dictiona ...
- 今天完成了deviceman的程序,压缩成deivceman.rar
目录在d:\android_projects\deviceman 压成了deviceman.rar 发送到了yzx3233@sina.com
- Java Web(5)-Servlet详解(下)
一.HttpServletRequest 类 1. HttpServletRequest 类作用? 每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解 ...
- Day08_商品规格管理
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...
- 每日一道 LeetCode (2):整数反转
题目:整数反转 题目来源:https://leetcode-cn.com/problems/reverse-integer 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示 ...
- MyBatis-Plus使用(4)-集成SpringBoot
我这里使用的MyBatis-Plus是当前最新的3.2.0版本, 1. 引入需要的jar,基础jar包括: <dependencies> <dependency> <gr ...
- 7月13日考试 题解(DFS序+期望+线段树优化建图)
T1 sign 题目大意:给出一棵 N 个节点的树,求所有起点为叶节点的有向路径,其 上每一条边权值和的和.N<=10000 水题.考试的时候毒瘤出题人(学长orz)把读入顺序改了一下,于是很多 ...
- Python Selenium 搭建Web UI自动化
Python搭建UI自动化环境 下载Python3 Python官网 PyCharm 环境配置 安装Python 勾选Add Python to PATH,一直下一步. 验证:CMD输入Python ...
- 29-main()的使用说明
* 1. main()方法作为程序的入口 * 2. main()方法也是一个普通的静态方法 * 3. main()方法可以作为我们与控制台交互的方式.(使用Scanner) 如何将控制台获取的数据传给 ...
- elasticsearch 高级搜索示例 es7.0
基础数据 创建索引 PUT mytest { "mappings": { "properties": { "title": { " ...