梯度提升树GBDT系列算法

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 在Boosting集成算法当中,我们逐一建立多个弱评估器(基本是决策树),并且下一个弱评估器的建立方式依赖于上一个弱评估器的评估结果,最终综合多个弱评估器的结果进行输出。

Boosting方法的基本元素与基本流程💫


在Boosting集成算法当中,我们逐一建立多个弱评估器(基本是决策树),并且下一个弱评估器的建立方式依赖于上一个弱评估器的评估结果,最终综合多个弱评估器的结果进行输出。


这个过程相当于有意地加重“难以被分类正确的样本”的权重,同时降低“容易被分类正确的样本”的权重,而将后续要建立的弱评估器的注意力引导到难以被分类正确的样本上。


不同的Boosting算法之间的核心区别就在于上一个弱评估器的结果具体如何影响下一个弱评估器的建立过程。此外,Boosting算法在结果输出方面表现得十分多样。早期的Boosting算法的输出一般是最后一个弱评估器的输出,当代Boosting算法的输出都会考虑整个集成模型中全部的弱评估器。一般来说,每个Boosting算法会其以独特的规则自定义集成输出的具体形式。


💥由此,我们可以确立任意boosting算法的三大基本元素以及boosting算法自适应建模的基本流程:


  • 损失函数L(x,y) :用以衡量模型预测结果与真实结果的差异
  • 弱评估器f(x) :(一般为)决策树,不同的boosting算法使用不同的建树过程
  • 综合集成结果H(x):即集成算法具体如何输出集成结果


几乎所有boosting算法的原理都围绕这三大元素构建。在此三大要素基础上,所有boosting算法都遵循以下流程进行建模:



💢正如之前所言,Boosting算法之间的不同之处就在于使用不同的方式来影响后续评估器的构建。无论boosting算法表现出复杂或简单的流程,其核心思想一定是围绕上面这个流程不变的。



梯度提升树GBDT的基本思想



梯度提升树(Gradient Boosting Decision Tree,GBDT)是提升法中的代表性算法,它即是当代强力的XGBoost、LGBM等算法的基石,也是工业界应用最多、在实际场景中表现最稳定的机器学习算法之一。在最初被提出来时,GBDT被写作梯度提升机器(Gradient Boosting Machine,GBM),它融合了Bagging与Boosting的思想、扬长避短,可以接受各类弱评估器作为输入,在后来弱评估器基本被定义为决策树后,才慢慢改名叫做梯度提升树。

作为一个Boosting算法,GBDT中自然也包含Boosting三要素,并且也遵循boosting算法的基本流程进行建模,不过需要注意的是,GBDT在整体建树过程中有几个关键点:

  • 弱评估器💯                      
  • GBDT的弱评估器输出类型不再与整体集成算法输出类型一致。对于基础的Bagging和Boosting算法来说,当集成算法执行的是回归任务时,弱评估器也是回归器,当集成算法执行分类任务时,弱评估器也是分类器。但对于GBDT而言,无论GBDT整体在执行回归/分类/排序任务,弱评估器一定是回归器。GBDT通过sigmoid或softmax函数输出具体的分类结果,但实际弱评估器一定是回归器。    
  • 损失函数💯


  • 在GBDT算法中,可以选择的损失函数非常多(‘deviance’, ‘exponential’),是因为这个算法从数学原理上做了改进——损失函数的范围不在局限于固定或者单一的某个损失函数,而是推广到了任意可微的函数。


  • GBDT分类器损失函数:‘deviance’, ‘exponential’

    GBDT回归器损失函数:‘squared_error’, ‘absolute_error’, ‘huber’, ‘quantile’


  • 拟合残差💯


GBDT依然自适应调整弱评估器的构建,但不再通过调整数据分布来间接影响后续弱评估器,而是通过修改后续弱评估器的拟合目标来直接影响后续弱评估器的结构。


具体地来说,在GBDT当中,我们不修改样本权重,但每次用于建立弱评估器的是样本以及当下集成输出与真实标签的差异()。这个差异在数学上被称之为残差(Residual),因此GBDT不修改样本权重,而是通过拟合残差来影响后续弱评估器结构。


GBDT加入了随机森林中随机抽样的思想,在每次建树之前,允许对样本和特征进行抽样来增大弱评估器之间的独立性(也因此可以有袋外数据集)。虽然Boosting算法不会大规模地依赖于类似于Bagging的方式来降低方差,但由于Boosting算法的输出结果是弱评估器结果的加权求和,因此Boosting原则上也可以获得由“平均”带来的小方差红利。当弱评估器表现不太稳定时,采用与随机森林相似的方式可以进一步增加Boosting算法的稳定性



梯度提升树GBDT的快速实现      



sklearn当中集成了GBDT分类与GBDT回归,我们使用如下两个类来调用它们:


  • class sklearn.ensemble.GradientBoostingClassifier
  • class sklearn.ensemble.GradientBoostingRegressor                      
  • GBDT算法的超参数看起来很多,但是仔细观察的话,你会发现GBDT回归器与GBDT分类器的超参数高度一致。并且所有超参数都给出了默认值,需要人为输入的参数为0。所以,就算是不了解参数的含义,我们依然可以直接使用sklearn库来调用GBDT算法。


使用GBDT完成分类任务


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
from sklearn.datasets import load_wine
from sklearn.ensemble import GradientBoostingClassifier as GBC
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
 
X,y = load_wine(return_X_y=True,as_frame=True)
 
# 切分训练集和测试集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=0)
 
# 使用GBDT完成对红酒数据集的预测
clf = GBC()    #实例化GBDT分类器,并使用默认参数
clf = clf.fit(Xtrain,Ytrain)
 
train_score = clf.score(Xtrain,Ytrain)
test_score = clf.score(Xtest,Ytest)
print(f"GBDT在训练集上的预测准确率为{train_score}")
print(f"GBDT在测试集上的预测准确率为{test_score}")


  • GBDT在训练集上的预测准确率为1.0
  • GBDT在测试集上的预测准确率为0.9629629629629629


梯度提升分类与其他算法的对比


dtc = DTC(random_state=0) #实例化单棵决策树
dtc = dtc.fit(Xtrain,Ytrain)
score_dtc = dtc.score(Xtest,Ytest)
 
rfc = RFC(random_state=0) #实例化随机森林
rfc = rfc.fit(Xtrain,Ytrain)
score_rfc = rfc.score(Xtest,Ytest)
 
gbc = GBC(random_state=0) #实例化GBDT
gbc = gbc.fit(Xtrain,Ytrain)
score_gbc = gbc.score(Xtest,Ytest)
# 默认使用准确度(accuracy)作为评分方式,即预测正确的样本数占总样本数的比例
 
print("决策树:{}".format(score_dtc))
print("随机森林:{}".format(score_rfc))
print("GBDT:{}".format(score_gbc))


  • 决策树:0.9444444444444444
  • 随机森林:0.9814814814814815
  • GBDT:0.9629629629629629


💥画出决策树、随机森林和GBDT在十组五折交叉验证下的效果对比


score_dtc = []
score_rfc = []
score_gbc = []
 
for i in range(10):
    dtc = DTC()
    cv1 = cross_val_score(dtc,X,y,cv=5)
    score_dtc.append(cv1.mean())
    
    rfc = RFC()
    cv2 = cross_val_score(rfc,X,y,cv=5)
    score_rfc.append(cv2.mean())
    
    gbc = GBC()
    cv3 = cross_val_score(gbc,X,y,cv=5)
    score_gbc.append(cv3.mean())
 
plt.plot(range(1,11),score_dtc,label = "DecisionTree")
plt.plot(range(1,11),score_rfc,label = "RandomForest")
plt.plot(range(1,11),score_gbc,label = "GBDT")
plt.legend(bbox_to_anchor=(1.4,1))
plt.show()



使用GBDT完成回归任务



X,y = fetch_california_housing(return_X_y=True,as_frame=True)
 
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=0)
 
# 使用GBDT完成对加利福尼亚房屋数据集的预测
 
gbr = GBR(random_state=0) #实例化GBDT
gbr = gbr.fit(Xtrain,Ytrain)
r2_gbdt = gbr.score(Xtest,Ytest) # 回归器默认评估指标为R2
r2_gbdt
# 0.7826346388949185
 
# 计算GBDT回归器的评估指标:均方误差MSE
from sklearn.metrics import mean_squared_error
pred = gbr.predict(Xtest)
MSE = mean_squared_error(Ytest,pred)
MSE
 
# 0.28979949770874125


梯度提升回归与其他算法的对比


import time
modelname = ["DecisionTree","RandomForest","GBDT","RF-D"]
models = [DTR(random_state=0)
          ,RFR(random_state=0)
          ,GBR(random_state=0)
          ,RFR(random_state=0,max_depth=3)]
 
for name,model in zip(modelname,models):
    start = time.time()
    result = cross_val_score(model,X,y,cv=5,scoring="neg_mean_squared_error").mean()
    end = time.time()-start
    print(name)
    print("\t MSE:{:.3f}".format(abs(result)))
    print("\t time:{:.2f}s".format(end))
    print("\n")


结果:


DecisionTree
     MSE:0.818
     time:0.66s
 
 
RandomForest
     MSE:0.425
     time:70.69s
 
 
GBDT
     MSE:0.412
     time:16.84s
 
 
RF-D
     MSE:0.639
     time:11.49s
 



对比决策树和随机森林来说,GBDT默认参数状态下已经能够达到很好的效果。


梯度提升树GBDT的重要参数和属性



由于GBDT超参数数量较多,因此我们可以将GBDT的参数分为以下5大类别,其他属性我们下次再进行分析验证💨


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
30天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
47 2
|
2月前
|
算法
PAI下面的gbdt、xgboost、ps-smart 算法如何优化?
设置gbdt 、xgboost等算法的样本和特征的采样率
81 2
|
3月前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
56 2
|
3月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
4月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
42 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
22天前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
22天前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
121 68
|
1月前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
1月前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真