梯度提升用于高效的分类与回归

devtools/2025/2/4 13:07:26/

 人工智能例子汇总:AI常见的算法和例子-CSDN博客 

使用 决策树(Decision Tree) 实现 梯度提升(Gradient Boosting) 主要是模拟 GBDT(Gradient Boosting Decision Trees) 的原理,即:

  1. 第一棵树拟合原始数据
  2. 计算残差(负梯度方向)
  3. 用新的树去拟合残差
  4. 累加所有树的预测值
  5. 重复步骤 2-4,直至达到指定轮数

下面是一个 纯 Python + PyTorch 实现 GBDT(梯度提升决策树) 的代码示例。

1. 纯 Python 实现梯度提升决策树

import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split# 生成数据
X, y = make_regression(n_samples=1000, n_features=5, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 参数
n_trees = 50   # 多少棵树
learning_rate = 0.1  # 学习率# 初始化预测值(全部为 0)
y_pred_train = np.zeros_like(y_train)
y_pred_test = np.zeros_like(y_test)# 训练梯度提升决策树
trees = []
for i in range(n_trees):residuals = y_train - y_pred_train  # 计算残差(负梯度方向)tree = DecisionTreeRegressor(max_depth=3)  # 这里使用较浅的树tree.fit(X_train, residuals)  # 让树学习残差trees.append(tree)# 更新预测值(累加弱学习器的结果)y_pred_train += learning_rate * tree.predict(X_train)y_pred_test += learning_rate * tree.predict(X_test)# 计算损失mse = mean_squared_error(y_train, y_pred_train)print(f"Iteration {i+1}: MSE = {mse:.4f}")# 计算最终测试集误差
final_mse = mean_squared_error(y_test, y_pred_test)
print(f"\nFinal Test MSE: {final_mse:.4f}")

代码解析

  • 第一步:构建一个基础决策树 DecisionTreeRegressor(max_depth=3)
  • 第二步:每棵树学习前面所有树的残差(负梯度方向)。
  • 第三步:训练 n_trees 棵树,每棵树的预测结果乘以 learning_rate 累加到最终预测值。
  • 第四步:每次迭代后更新预测值,减少误差。

2. 用 PyTorch 实现 GBDT

虽然 GBDT 主要基于决策树,但如果你希望用 PyTorch 计算梯度并模拟 GBDT,可以如下操作:

  • 用 PyTorch 计算 损失函数的梯度
  • sklearn.tree.DecisionTreeRegressor 拟合梯度
  • 用 PyTorch 计算最终误差
import torch
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split# 生成数据
X, y = make_regression(n_samples=1000, n_features=5, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 参数
n_trees = 50  # 多少棵树
learning_rate = 0.1  # 学习率# 转换数据为 PyTorch 张量
X_train_torch = torch.tensor(X_train, dtype=torch.float32)
y_train_torch = torch.tensor(y_train, dtype=torch.float32)# 初始化预测值
y_pred_train = torch.zeros_like(y_train_torch)# 训练 GBDT
trees = []
for i in range(n_trees):# 计算梯度(残差)residuals = y_train_torch - y_pred_train# 用决策树拟合梯度tree = DecisionTreeRegressor(max_depth=3)tree.fit(X_train, residuals.numpy())trees.append(tree)# 更新预测值y_pred_train += learning_rate * torch.tensor(tree.predict(X_train), dtype=torch.float32)# 计算损失mse = mean_squared_error(y_train, y_pred_train.numpy())print(f"Iteration {i+1}: MSE = {mse:.4f}")

PyTorch 实现的关键点

  1. y_train_torch - y_pred_train 计算 损失的梯度
  2. DecisionTreeRegressor 作为弱学习器,拟合梯度
  3. 预测值 += learning_rate * tree.predict(X_train)

3. 结合 PyTorch 和 XGBoost

如果你要 结合 PyTorch 和 GBDT,可以先用 XGBoost 训练 GBDT,再用 PyTorch 进行深度学习:

import xgboost as xgb
import torch.nn as nn
import torch.optim as optim
import torch
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split# 生成数据
X, y = make_regression(n_samples=1000, n_features=5, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练 XGBoost 作为特征提取器
xgb_model = xgb.XGBRegressor(n_estimators=50, max_depth=3, learning_rate=0.1)
xgb_model.fit(X_train, y_train)# 提取 XGBoost 叶子节点特征
X_train_leaves = xgb_model.apply(X_train)
X_test_leaves = xgb_model.apply(X_test)# 定义 PyTorch 神经网络
class NeuralNet(nn.Module):def __init__(self, input_size):super(NeuralNet, self).__init__()self.fc = nn.Linear(input_size, 1)def forward(self, x):return self.fc(x)# 训练 PyTorch 神经网络
model = NeuralNet(X_train_leaves.shape[1])
optimizer = optim.Adam(model.parameters(), lr=0.01)
loss_fn = nn.MSELoss()X_train_tensor = torch.tensor(X_train_leaves, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)for epoch in range(100):optimizer.zero_grad()output = model(X_train_tensor)loss = loss_fn(output, y_train_tensor)loss.backward()optimizer.step()print("Training complete!")

结论

方法适用场景备注
纯 Python GBDT适合小规模数据使用 sklearn.tree.DecisionTreeRegressor
PyTorch 计算梯度 + GBDT适合梯度优化实验计算梯度后用 DecisionTreeRegressor 训练
XGBoost + PyTorch适合大规模数据先用 XGBoost 提取特征,再用 PyTorch 训练

如果你的数据是结构化的(如 表格数据),建议 直接使用 XGBoost/LightGBM,再结合 PyTorch 进行特征工程或后处理。


http://www.ppmy.cn/devtools/156011.html

相关文章

攻防世界_php_rce(ThinkPHP框架)

打开靶场 点链接,发现是广告,没什么特别的,再看题目php.rce,查一下RCE是什么 RCE(Remote Command Execution)远程命令执行,是一种严重的网络安全漏洞。 RCE指攻击者能通过网络远程控制目标系统&…

深入理解linux中的文件(上)

1.前置知识: (1)文章 内容 属性 (2)访问文件之前,都必须打开它(打开文件,等价于把文件加载到内存中) 如果不打开文件,文件就在磁盘中 (3&am…

Hive:窗口函数[ntile, first_value,row_number() ,rank(),dens_rank()]和自定义函数

ntile 分组 它把有序的数据集合 平均分配 到 指定的数量(num )个桶中 , 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差1。 被称作窗口函数、序列函数或分析函数, 本质上是一种…

Windows编译FreeRDP步骤

1. **安装必要工具** powershell # 安装 Visual Studio 2022 (勾选"C桌面开发"组件) # 安装 CMake: https://cmake.org/download/ # 安装 Git: https://git-scm.com/ 2. **安装依赖项** powershell # 使用vcpkg包管理 git clone https://github.com/Microsoft/vcpk…

【MySQL】MySQL客户端连接用 localhost和127.0.0.1的区别

# systemctl status mysqld # ss -tan | grep 3306 # mysql -V localhost与127.0.0.1的区别是什么? 相信有人会说是本地IP,曾有人说,用127.0.0.1比localhost好,可以减少一次解析。 看来这个入门问题还有人不清楚,其实…

javascript-es6(三)

解构赋值 解构赋值是一种快速为变量赋值的简洁语法,本质上仍然是为变量赋值 数组解构 数组解构是将数组的单元值快速批量赋值给一系列变量的简洁语法 基本语法: 1. 赋值运算符 左侧的 [] 用于批量声明变量,右侧数组的单元值将被赋值给左…

DOM 操作入门:HTML 元素操作与页面事件处理

DOM 操作入门:HTML 元素操作与页面事件处理 DOM 操作入门:HTML 元素操作与页面事件处理什么是 DOM?1. 如何操作 HTML 元素?1.1 使用 `document.getElementById()` 获取单个元素1.2 使用 `document.querySelector()` 和 `document.querySelectorAll()` 获取多个元素1.3 创建…

opencv实现边缘模板匹配

在OpenCV中使用C进行模板匹配时&#xff0c;如果你想利用边缘特征来提高匹配的鲁棒性&#xff0c;可以结合边缘检测算法&#xff08;如Canny&#xff09;来提取图像和模板的边缘信息&#xff0c;然后在这些边缘图像上进行模板匹配 #include <opencv2/opencv.hpp> #inclu…