GBRT 要点理解

本文详细解释了Gradient Boosting Regression Trees (GBRT)的工作原理及其关键步骤,包括损失函数的选择、迭代过程及如何通过梯度下降减少残差。此外还讨论了GBRT的优点、缺点以及重要的超参数。

 

1. 首先要理解Boost和Gradient Boost。 前者是在算法开始时候,,为每一个样本赋上一个相等的权重值,也就是说,最开始的时候,大家都是一样重要的。在每一次训练中得到的模型,会使得数据点的估计有所差异,所以在每一步结束后,我们需要对权重值进行处理,而处理的方式就是通过增加错分类点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就被赋上一个很高的权重。然后等进行了N次迭代(由用户指定),将会得到N个简单的基分类器(basic learner),最后将它们组合起来,可以对它们进行加权(错误率越大的基分类器权重值越小,错误率越小的基分类器权重值越大)、或者让它们进行投票等得到一个最终的模型。

Gradient Boost与传统的Boost有着很大的区别,它的每一次计算都是为了减少上一次的残差(residual),而为了减少这些残差,可以在残差减少的梯度(Gradient)方向上建立一个新模型。所以说,在Gradient Boost中,每个新模型的建立是为了使得先前模型残差往梯度方向减少,与传统的Boost算法对正确、错误的样本进行加权有着极大的区别。 它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向。损失函数(loss function)描述的是模型的不靠谱程度,损失函数越大,则说明模型越容易出错(其实这里有一个方差、偏差均衡的问题,但是这里假设损失函数越大,模型越容易出错)。如果我们的模型能够让损失函数持续的下降,则说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上下降。

2. 要理解Gradient Boost有以下几个步骤,

首先,我们需要有训练集,损失函数和迭代次数。损失函数事实上是可以任意的,如果是平方损失函数,则对其求导就是残差。损失函数是可以任意的。如使用指数损失函数,则可以对错分样本放大来boost。 

其次,初始化第一颗树后,我们需要计算损失函数在现有模型上的梯度方向,这个向量就是算法下面的,这个向量怎么计算呢,对于平方损失函数来说,其求导就是残差值,对其他损失函数,也可以根据求导函数求的

然后,根据这个梯度向量,以及 之前的样本点,组成一个训练集 ,根据这个训练集,训练一个较弱的分类器,这个分类器可以是tree,于是就成了GBRT,也可以是其他分类器,记做 

再然后,我们需要知道在第m次迭代后这个新的基分类器在整个模型中的权重,为了找到最佳权重,将新的基分类器加入到原来的整个模型组合中,记做,为了获得h前的权重参数,利用 line search的方法,将其放入损失函数中,寻找最优的

最后,更新总体模型,至此一个循环结束 

 

算法流程如下:

 

需要注意几点:

a. 每次迭代获得的base learner,可以是树也可以是其他分类器。 这个分类器前的权重,可以是针对一整颗树的,也可以针对那颗树的每个叶子节点的,如果是针对叶子节点的,则可以写成:,其中J是叶子节点个数

b. 叶子节点的数目限制了base learner的大小,一般建议每颗树的叶子节点在4-8 个内

c. 为了避免 过拟合的问题,通常会设置一个收敛参数 Shrinkage,这个参数在每次基分类器加入到整体模型时候起作用,简单的说,就是 

d. 当GBRT用来解决分类问题的时候,其中的梯度向量事实上转变成了概率梯度向量,即各分类的概率梯度方向,算法可以更新如下,通常损失函数可以定义为负的log似然

 

 

 3. GBRT的优缺点和参数

优点: 非线性变换比较多,表达能力强,而且不需要做复杂的特征工程和特征变换,防止过拟合

缺点:迭代树有时序性,并行化比较困难且效果不佳

参数主要有:

1. 树个数 (迭代次数 M)
2. 树深度 
3. 缩放因子 
4. 损失函数 (通常是平方损失函数)
5. 数据采样比 
6. 特征采样比

 

转载于:https://www.cnblogs.com/datawang/p/6362016.html

05-27
### GBRT算法介绍 Gradient Boosted Regression Trees (GBRT),也被称为 Gradient Boosting Decision Trees (GBDT) 或 Multiple Additive Regression Tree (MART),是一种基于决策树的集成学习方法。该算法通过逐步优化的方式构建一系列弱学习器(通常是回归树),并将它们的预测结果加权累加起来形成最终的强大模型[^1]。 GBRT的核心思想是利用前向分步策略来最小化损失函数。具体来说,在每一轮迭代过程中,新加入的一棵树会专注于拟合之前所有树所未能很好地捕捉到的部分——即残差误差[^2]。这种方法不仅提高了单个模型的表现力,还增强了整体系统的鲁棒性和泛化性能。 #### GBDT 的工作原理 GBDT 结果是由多颗决策树预测值累积而成,这些树依次被训练出来以修正前面树木产生的错误。对于每一个新的基分类器而言,其目标是最小化剩余未解释部分的数据分布差异。因此,每次新增一棵树时都会重新评估数据集中每个实例的重要性,并据此调整后续建模过程中的关注重点[^2]。 另外值得注意的是虽然原始版本主要是针对数值型输出设计用于解决连续变量估计问题,但是经过适当转换之后也可以扩展应用于二元或多类别标签识别场景下作为分类工具使用[^3]。 --- ### Java 实现概述 尽管 Python 是目前最流行的机器学习开发环境之一,但在某些特定领域或者企业内部系统架构中可能更倾向于采用 Java 来完成相应功能模块部署需求。下面给出一个简化版关于如何用Java实现GBRT框架思路: 首先定义好基本结构单元类 `TreeNode` 和整个树形表示对象 `DecisionTree`, 它们分别负责存储节点属性以及管理整棵子树逻辑关系;接着创建接口形式的服务层组件比如 IFitter 接口用来封装不同类型的适应操作细节以便灵活切换适配机制;最后编写具体的业务流程控制代码片段如下所示: ```java public class TreeNode { private double threshold; private int featureIndex; public boolean isLeaf() { /*...*/ } } public interface IFitter { void fit(double[] X, double[] y); } ``` 以上仅为概念性描述,实际工程实践中还需要考虑更多因素如并行计算支持、内存管理和异常处理等方面的内容才能确保生产环境下稳定运行效果良好。 --- ### 示例代码展示 以下是基于伪代码风格的一个简单例子演示了如何构造一颗基础CART回归树并通过多次循环调用达到完整的GBRT体系搭建目的: ```java // 构造单一CART回归树 class CARTRegressor implements IFitter { @Override public void fit(double[][] data, double[] labels){ // ... 训练逻辑 ... } public double predict(double[] sample){ // ... 预测逻辑 ... return 0.0; } } // 主程序入口 List<CARTRegressor> trees = new ArrayList<>(); for(int i=0;i<numTrees;i++){ CARTRegressor tree = new CARTRegressor(); tree.fit(X_train,y_residual); y_pred += learningRate * tree.predict(X_test); updateResiduals(y_true, y_pred); trees.add(tree); } ``` 此段代码展示了如何逐次增加新的回归树至现有集合当中去逼近真实值的过程。每一次更新都需要依据当前总和预估值与实际观测值得差距来进行参数调节直至满足收敛条件为止。 --- ### 总结 综上所述,GBRT作为一种高效的监督学习技术广泛适用于各类复杂模式挖掘任务之中。无论是理论层面还是实践应用方面都展现出了卓越的优势特性。然而与此同时我们也应该意识到任何强大的武器都有其局限所在,在选用此类高级别解决方案之前务必充分理解自身面临的具体挑战特点再做决定最为明智之举。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值