梯度提升树(Gradient Boosting Trees)

数学模型和推导

梯度提升树(Gradient Boosting Trees, GBT)是一种提升方法,将多个弱学习器(通常是决策树)组合成一个强学习器。其基本思想是通过迭代地添加新树来逐步减少预测误差。下面是详细的数学推导过程:

目标函数

模型初始化

初始模型通常为一个常数:

逐步添加树模型

损失函数的梯度下降

将损失函数关于当前模型的预测值进行一阶泰勒展开,得到损失函数的梯度:

通过最小化残差的平方和来拟合新的决策树:

学习率和正则化

通过调整学习率 \gamma _{m}​ 和树的复杂度(如最大深度)来防止过拟合。

实施步骤与参数解读

  1. 数据准备:准备训练数据集和测试数据集。
  2. 特征标准化:对数据进行标准化处理(如果需要)。
  3. 设置参数
    • n_estimators: 弱学习器(决策树)的数量。
    • learning_rate: 学习率,控制每个弱学习器对最终模型的贡献。
    • max_depth: 决策树的最大深度,控制模型的复杂度。
    • subsample: 每棵树使用的样本比例。
    • min_samples_split: 内部节点再划分所需最小样本数。
    • min_samples_leaf: 叶节点所需最小样本数。
  4. 模型训练:使用训练数据训练 GBT 模型。
  5. 模型优化:通过交叉验证选择最优的参数。
  6. 模型预测:使用测试数据进行预测,并计算模型性能。

模型

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import GridSearchCV

# 设置全局字体为楷体,并设置字体回退机制以避免缺少字体导致的问题
plt.rcParams['font.sans-serif'] = ['KaiTi', 'SimHei', 'Arial']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 数据准备
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.3, random_state=42)

# 模型训练(未优化)
model = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
model.fit(X_train, y_train)

# 模型预测(未优化)
y_pred = model.predict(X_test)

# 计算误差(未优化)
mse = mean_squared_error(y_test, y_pred)
print(f"未优化模型的均方误差: {mse}")

# 可视化结果(未优化)
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred)
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.title('未优化模型')
plt.show()

# 参数优化
param_grid = {
    'n_estimators': [100, 200, 300],
    'learning_rate': [0.01, 0.1, 0.2],
    'max_depth': [3, 4, 5],
    'subsample': [0.8, 0.9, 1.0],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4]
}
grid = GridSearchCV(GradientBoostingRegressor(random_state=42), param_grid, cv=5, scoring='neg_mean_squared_error')
grid.fit(X_train, y_train)

# 最优参数
print("最优参数: ", grid.best_params_)

# 使用最优参数训练模型
best_model = grid.best_estimator_
best_model.fit(X_train, y_train)

# 模型预测(优化后)
y_pred_optimized = best_model.predict(X_test)

# 计算误差(优化后)
mse_optimized = mean_squared_error(y_test, y_pred_optimized)
print(f"优化后模型的均方误差: {mse_optimized}")

# 可视化结果(优化后)
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred_optimized)
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.title('优化后模型')
plt.show()

结果解释

  1. 未优化模型:使用默认的参数训练模型,均方误差较大,说明模型对数据的拟合效果不够好。
  2. 优化后的模型:通过网格搜索优化参数,得到最优的参数组合,均方误差显著降低,说明模型对数据的拟合效果有了明显提升。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值