当前位置: 首页 > article >正文

梯度提升决策树树(GBDT)公式推导

### 逻辑回归的损失函数

逻辑回归模型用于分类问题,其输出是一个概率值。对于二分类问题,逻辑回归模型的输出可以表示为:

\[ P(y = 1 | x) = \frac{1}{1 + e^{-F(x)}} \]

其中 \( F(x) \) 是一个线性组合函数,通常表示为:

\[ F(x) = \sum_{m=0}^{M} h_m(x) \]

这里的 \( h_m(x) \) 是学习到的决策树。

### 损失函数的推导

对于单个样本 \((x_i, y_i)\),逻辑回归的损失函数通常采用对数似然损失(也称为交叉熵损失),定义如下:

\[ \text{loss}(x_i, y_i) = -y_i \log \hat{y}_i - (1 - y_i) \log (1 - \hat{y}_i) \]

其中:
- \( \hat{y}_i \) 是模型预测的概率。
- \( y_i \) 是实际的标签(0 或 1)。

### GBDT 中的损失函数

在 GBDT 中,我们假设第 \( k \) 步迭代之后当前学习器为 \( F(x) \),则损失函数可以写为:

\[ \text{loss}(x_i, y_i | F(x)) = y_i \log \left(1 + e^{-F(x_i)}\right) + (1 - y_i) \left[F(x_i) + \log \left(1 + e^{-F(x_i)}\right)\right] \]

### 推导步骤

1. **定义预测概率**:
   \[ \hat{y}_i = \frac{1}{1 + e^{-F(x_i)}} \]

2. **代入损失函数**:
   \[ \text{loss}(x_i, y_i) = -y_i \log \hat{y}_i - (1 - y_i) \log (1 - \hat{y}_i) \]
   \[ = -y_i \log \left(\frac{1}{1 + e^{-F(x_i)}}\right) - (1 - y_i) \log \left(1 - \frac{1}{1 + e^{-F(x_i)}}\right) \]

3. **简化表达式**:
   \[ \text{loss}(x_i, y_i) = -y_i \log \left(\frac{1}{1 + e^{-F(x_i)}}\right) - (1 - y_i) \log \left(\frac{e^{-F(x_i)}}{1 + e^{-F(x_i)}}\right) \]
   \[ = -y_i \log \left(\frac{1}{1 + e^{-F(x_i)}}\right) - (1 - y_i) \left[\log(e^{-F(x_i)}) - \log(1 + e^{-F(x_i)})\right] \]
   \[ = -y_i \log \left(\frac{1}{1 + e^{-F(x_i)}}\right) - (1 - y_i) \left[-F(x_i) - \log(1 + e^{-F(x_i)})\right] \]
   \[ = y_i \log \left(1 + e^{-F(x_i)}\right) + (1 - y_i) \left[F(x_i) + \log \left(1 + e^{-F(x_i)}\right)\right] \]

求梯度

为了求出给定损失函数的梯度,我们需要对损失函数关于 \( F(x_i) \) 求导。给定的损失函数是:

\[
\text{loss}(x_i, y_i | F(x)) = y_i \log \left(1 + e^{-F(x_i)}\right) + (1 - y_i) \left[F(x_i) + \log \left(1 + e^{-F(x_i)}\right)\right]
\]

我们分两部分来计算梯度:

1. 对于第一部分 \( y_i \log \left(1 + e^{-F(x_i)}\right) \)
2. 对于第二部分 \( (1 - y_i) \left[F(x_i) + \log \left(1 + e^{-F(x_i)}\right)\right] \)

### 第一部分的梯度

对于 \( y_i \log \left(1 + e^{-F(x_i)}\right) \),我们对其求导:

\[
\frac{\partial}{\partial F(x_i)} \left[ y_i \log \left(1 + e^{-F(x_i)}\right) \right]
\]

使用链式法则:

\[
\frac{\partial}{\partial F(x_i)} \left[ y_i \log \left(1 + e^{-F(x_i)}\right) \right] = y_i \cdot \frac{\partial}{\partial F(x_i)} \left[ \log \left(1 + e^{-F(x_i)}\right) \right]
\]

\[
= y_i \cdot \frac{1}{1 + e^{-F(x_i)}} \cdot (-e^{-F(x_i)})
\]

\[
= y_i \cdot \frac{-e^{-F(x_i)}}{1 + e^{-F(x_i)}}
\]

\[
= -y_i \cdot \frac{e^{-F(x_i)}}{1 + e^{-F(x_i)}}
\]

### 第二部分的梯度

对于 \( (1 - y_i) \left[F(x_i) + \log \left(1 + e^{-F(x_i)}\right)\right] \),我们对其求导:

\[
\frac{\partial}{\partial F(x_i)} \left[ (1 - y_i) \left(F(x_i) + \log \left(1 + e^{-F(x_i)}\right)\right) \right]
\]

\[
= (1 - y_i) \cdot \left[ \frac{\partial}{\partial F(x_i)} F(x_i) + \frac{\partial}{\partial F(x_i)} \log \left(1 + e^{-F(x_i)}\right) \right]
\]

\[
= (1 - y_i) \cdot \left[ 1 + \frac{1}{1 + e^{-F(x_i)}} \cdot (-e^{-F(x_i)}) \right]
\]

\[
= (1 - y_i) \cdot \left[ 1 - \frac{e^{-F(x_i)}}{1 + e^{-F(x_i)}} \right]
\]

\[
= (1 - y_i) \cdot \left[ \frac{1 + e^{-F(x_i)} - e^{-F(x_i)}}{1 + e^{-F(x_i)}} \right]
\]

\[
= (1 - y_i) \cdot \left[ \frac{1}{1 + e^{-F(x_i)}} \right]
\]

### 合并两部分

将两部分合并起来:

\[
\frac{\partial}{\partial F(x_i)} \left[ y_i \log \left(1 + e^{-F(x_i)}\right) + (1 - y_i) \left[F(x_i) + \log \left(1 + e^{-F(x_i)}\right)\right] \right]
\]

\[
= -y_i \cdot \frac{e^{-F(x_i)}}{1 + e^{-F(x_i)}} + (1 - y_i) \cdot \frac{1}{1 + e^{-F(x_i)}}
\]

\[
= -y_i \cdot \frac{e^{-F(x_i)}}{1 + e^{-F(x_i)}} + \frac{1 - y_i}{1 + e^{-F(x_i)}}
\]

\[
= \frac{-y_i e^{-F(x_i)} + 1 - y_i}{1 + e^{-F(x_i)}}
\]

\[
= \frac{1 - y_i - y_i e^{-F(x_i)}}{1 + e^{-F(x_i)}}
\]

\[
= \frac{1 - y_i - y_i e^{-F(x_i)}}{1 + e^{-F(x_i)}}
\]

最终得到的梯度为:

\[
\frac{\partial \text{loss}}{\partial F(x_i)} = \frac{1 - y_i - y_i e^{-F(x_i)}}{1 + e^{-F(x_i)}}
\]

简化

\[
\frac{\partial \text{loss}}{\partial F(x_i)} = \frac{1}{1 + e^{-F(x_i)}} - y_i
\]

### 总结

通过上述推导,我们可以看到逻辑回归的损失函数如何被应用于 GBDT 中。在每一步迭代中,GBDT 会根据当前模型的预测和实际标签之间的差异来更新新的弱学习器(通常是决策树),从而逐步减少损失函数的值。

这个过程确保了模型能够逐步逼近最优解,同时通过负梯度方向进行参数更新,有效地减少了损失函数的值。


http://www.kler.cn/a/511751.html

相关文章:

  • Spring Security 6.X + JWT + RBAC 权限管理实战教程(上)
  • 将IDLE里面python环境pyqt5配置的vscode
  • 庄小焱——2024年博文总结与展望
  • SpringBoot多级配置文件
  • Linux 操作二:文件映射与文件状态
  • 20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识
  • 【面试题】JVM部分[2025/1/13 ~ 2025/1/19]
  • pytest+playwright落地实战大纲
  • leetcode242-有效字母异位词
  • RoCE网络及其协议栈详解(没有中间商赚差价的网络)
  • 快速排序练习
  • Linux:生产者消费者模型
  • 第 3 章 核心处理层(上)
  • Bash 中 nohup 与 的区别及用法解析
  • leetcode416.分割等和子集
  • nginx作为下载服务器配置
  • Python人脸识别库DeepFace使用教程及源码解析
  • imbinarize函数用法详解与示例
  • python 基础类json和csv
  • 深入剖析iOS网络优化策略,提升App性能
  • 【LC】2239. 找到最接近 0 的数字
  • Node.js 写一个登录中间件
  • 排序算法学习小结
  • 如何确保Python爬虫不违反微店规定
  • Elixir语言的软件开发工具
  • 切面Aop的了解和使用