GBDT算法总结

GBDT算法基于负梯度拟合损失函数,适用于回归和分类问题。通过损失函数的不同选择,如指数、对数损失,解决不同类型问题。正则化方法包括学习率调整、子采样和树的剪枝。GBDT在处理各种数据类型、异常值以及在不需要大量调参的情况下,仍能保持高预测准确率,但并行训练受限。scikit-learn中的参数如n_estimators、learning_rate和subsample可调整模型性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

前向分布算法

 

负梯度拟合

在上一节中,我们介绍了GBDT的基本思路,但是没有解决损失函数拟合方法的问题。针对这个问题,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。第t轮的第i个样本的损失函数的负梯度表示为

                                      

    利用(xi,rti)(i=1,2,..m)(xi,rti)(i=1,2,..m),我们可以拟合一颗CART回归树,得到了第t颗回归树,其对应的叶节点区域Rtj,j=1,2,...,JRtj,j=1,2,...,J。其中J为叶子节点的个数。

    针对每一个叶子节点里的样本,我们求出使损失函数最小,也就是拟合叶子节点最好的的输出值ctjctj如下:

                                      

    这样我们就得到了本轮的决策树拟合函数如下:

                                              

    从而本轮最终得到的强学习器的表达式如下:

                                          

    通过损失函数的负梯度来拟合,我们找到了一种通用的拟合损失误差的办法,这样无轮是分类问题还是回归问题,我们通过其损失函数的负梯度的拟合,就可以用GBDT来解决我们的分类回归问题。区别仅仅在于损失函数不同导致的负梯度不同而已。

 

损失函数

 

在GBDT算法中,损失函数的选择十分重要。针对不同的问题,损失函数有不同的选择。

1.对于分类算法,其损失函数一般由对数损失函数和指数损失函数两种。

(1)指数损失函数表达式:

L(y,f(x))=e^{(-yf(x))}

(2)对数损失函数可分为二分类和多分类两种。

2.对于回归算法,常用损失函数有如下4种。

(1)平方损失函数

### GBDT算法的工作流程及详细步骤 #### 1. 算法概述 GBDT(Gradient Boosting Decision Tree)是一种基于决策树的集成学习方法,它通过迭代的方式构建一系列弱学习器(通常是CART回归树),并将这些弱学习器组合成一个强学习器。GBDT的核心思想是利用梯度下降优化目标函数,在每一轮迭代中拟合当前模型的残差。 #### 2. 初始化阶段 初始化时,通常设定初始预测值 \( F_0(x) \) 为常数值,这个常数可以通过最小化损失函数来确定: \[ F_0(x) = \arg\min_{\gamma}\sum_{i=1}^{N}L(y_i,\gamma) \] 其中,\( L(y_i, \hat{y}_i) \) 是损失函数,用于衡量真实值 \( y_i \) 和预测值 \( \hat{y}_i \) 之间的差异[^3]。 #### 3. 迭代过程 在第 \( m \) 轮迭代中,执行以下操作: ##### (1)计算负梯度 对于每一个样本 \( i \),计算其在当前位置上的负梯度作为伪残差: \[ r_{im} = -\left[\frac{\partial L(y_i,F(x_i))}{\partial F(x_i)}\right]_{F(x)=F_{m-1}(x)} \] 这一步骤的目标是找到当前模型无法很好地解释的部分,并将其视为新的目标变量[^4]。 ##### (2)拟合一棵回归树 使用训练数据集中的特征以及刚刚计算出的伪残差 \( r_{im} \),拟合一颗 CART 回归树。此树的作用是对伪残差进行建模,从而捕捉到未被现有模型覆盖的信息[^1]。 ##### (3)计算叶节点输出值 假设第 \( j \) 颗树有 \( J_m \) 个叶子节点,则每个叶子节点对应的输出值可通过以下公式获得: \[ c_{jm} = \arg\min_c\sum_{x_i\in R_{jm}}L(y_i,F_{m-1}(x_i)+c) \] 这里 \( R_{jm} \) 表示落入该叶子节点的所有样本集合[^2]。 ##### (4)更新模型 将新生成的树加入整体模型中,形成更强大的预测器: \[ F_m(x) = F_{m-1}(x) + \nu f_m(x) \] 其中 \( f_m(x) \) 即为本次迭代所建立的树;参数 \( \nu \)(也称为学习速率或收缩因子)控制每次增加量大小以防止过拟合[^3]。 #### 4. 输出最终模型 经过 M 次迭代之后,得到完整的 GBDT 模型表达形式如下所示: \[ F_M(x) = F_0(x) + \sum_{m=1}^M\nu f_m(x) \] --- ### 示例代码实现 以下是 Python 中使用 `sklearn` 库实现简单版 GBDT 的例子: ```python from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split from sklearn.ensemble import GradientBoostingRegressor # 创建模拟数据集 X, y = make_regression(n_samples=1000, n_features=10, noise=0.1) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义并训练GBDT模型 gbdt_model = GradientBoostingRegressor( loss='squared_error', # 使用平方误差作为损失函数 learning_rate=0.1, # 学习率 n_estimators=100, # 树的数量 max_depth=3 # 决策树最大深度 ) gbdt_model.fit(X_train, y_train) # 测试模型性能 score = gbdt_model.score(X_test, y_test) print(f"Model Score on Test Data: {score}") ``` --- ### 总结 综上所述,GBDT 的核心在于逐步减小由先前模型产生的误差,并通过不断调整权重使整个系统的泛化能力更强。这种方法不仅适用于解决复杂的非线性关系问题,而且还能有效应对高维稀疏数据场景下的挑战[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值