梯度提升树GBDT模型原理及spark ML实现

时间:2024-04-13 17:54:48

目录

一、GBDT模型原理

1.1  GB(Gradient Boost)算法

1.2 GBDT模型

二、spark ML机器学习库中GBDT使用案例

三、GBDT与Boost算法比较

四、 GBDT与RF比较


一、GBDT模型原理

 

1.1  GB(Gradient Boost)算法

梯度提升树GBDT模型原理及spark ML实现

GB算法直观理解,将损失函数的负梯度在当前模型的值,当做下个模型训练的目标函数。沿着损失函数负梯度方向迭代,使得损失函数越来越小,模型偏差越来越小。

1.2 GBDT模型

       GBDT模型将决策树CART放入GB模型框架中,获得一个集成的模型。

 

      回归问题:

解决回归问题时,采用损失函数为残差平方和:

梯度提升树GBDT模型原理及spark ML实现

损失函数负梯度为(残差和):

梯度提升树GBDT模型原理及spark ML实现

梯度提升树GBDT模型原理及spark ML实现

   

分类问题:

解决分类问题时,采用的损失函数为log损失函数:

梯度提升树GBDT模型原理及spark ML实现

 损失函数负梯度为(残差和):

梯度提升树GBDT模型原理及spark ML实现

分类任务与回归任务的区别在于,分类任务的损失函数采用log损失函数

 

二、spark ML机器学习库中GBDT使用案例

pyspark.ml.classification.GBTClassifier(featuresCol='features', labelCol='label', predictionCol='prediction', maxDepth=5, maxBins=32, minInstancesPerNode=1, minInfoGain=0.0, maxMemoryInMB=256, cacheNodeIds=False, checkpointInterval=10, lossType='logistic', maxIter=20, stepSize=0.1, seed=None, subsamplingRate=1.0)

lossType:分类问题损失函数为logistic。回归问题可选择平方误差和绝对误差。

maxIter:迭代次数,每一次迭代将产生一棵树。增加maxiter会减少模型偏差,但相应的会增加过拟合概率,结合测试集进

             行验证,防止过拟合。

maxDepth:树的深度。

stepSize:学习率,若太小,模型收敛速度太慢;若太大,模型会不稳定,不能收敛。

利用网格搜索,对上述参数遍历:

from pyspark.ml.feature import VectorAssembler
from pyspark.ml.evaluation import BinaryClassificationEvaluator
import pyspark.ml.classification as cl 
from pyspark.ml.pipeline import Pipeline

vf = VectorAssembler(inputCols=[‘c1’,’c2’,’c3’], outputCol="features")
evas = []
for maxiter in [20,30,50,80,100]:
    for maxdepth in [1,3,4,5]:
        for stepsize in [0.05,0.1,0.3]:
            print(maxiter,maxdepth,stepsize)
            gbt = cl.GBTClassifier(maxIter=maxiter, maxDepth=maxdepth,stepSize=stepsize)
            gbt_pipeline = Pipeline(stages=[vf,gbt])
            gbt_model = gbt_pipeline.fit(train)
            gbt_test = gbt_model.transform(test)
            gbt_evaluator = BinaryClassificationEvaluator(rawPredictionCol='probability',labelCol='label')
            evas.append([maxiter,maxdepth,stepsize,gbt_evaluator.evaluate(gbt_test,{gbt_evaluator.metricName: 'areaUnderROC'}),gbt_evaluator.evaluate(gbt_test,{gbt_evaluator.metricName: 'areaUnderPR'})])

 

三、GBDT与Boost算法比较

Boos算法,开始为每个样本赋予相同的权重,在每一个模型训练结束后后,增加分错样本点的权重,减少预测正确的样本点权重,进行N次迭代后,将会得到N个简单的分类器,然后将这些分类器加权组合,最终得到一个强分类器。

GBDT算法,计算损失函数在当前模型的负梯度值,作为下一次模型训练的目标函数,每次迭代时沿着损失函数的负梯度方向移动,最终损失函数越来越小,得到越来越精确的模型。与Boost对错误样本加权有很大的区别。

 

四、 GBDT与RF比较

1、RF每棵树相互独立训练,可以并行执行。GBDT每棵树的训练依赖于当前模型的结果,只能串行执行。 

2、随着树的个数增加,RF的预测结果会更加稳定,模型精度和方差都会降低。而GBDT开始预测表现会随着树的数目增大变好,但到一定程度后,会随着树的数目增加而变差(过拟合)。

3、GBDT会选择更浅的树,RF会选择更深的树。RF并行地训练多个不同的分类器,目的是为了降低方差,所以对于每个基分类器来说,目标是如何降低偏差,因而会采用更深的决策树。GBDT每个模型都是在当前模型的基础上更加拟合原数据,可以保证偏差,对每个基分类器而言,需要选择方差更小的分类器,即更简单的分类器,所以选择深度较浅的决策树。

 

GBDT和RF共同的优点:

1、可以处理连续特征和离散特征。

2、对缺失值和高维特征有较高的稳健性。

3、可以得到变量的重要性排序。

 

参考资料:

https://blog.****.net/qq_34531825/article/details/52366265#t8

https://www.jianshu.com/p/005a4e6ac775

https://blog.****.net/qq_22238533/article/details/79192579

https://blog.****.net/qq_22238533/article/details/79185969