目录
一、GBDT模型原理
1.1 GB(Gradient Boost)算法
1.2 GBDT模型
二、spark ML机器学习库中GBDT使用案例
三、GBDT与Boost算法比较
四、 GBDT与RF比较
GB算法直观理解,将损失函数的负梯度在当前模型的值,当做下个模型训练的目标函数(第3,4步)。沿着损失函数负梯度方向迭代,使得损失函数越来越小,模型偏差越来越小。
GBDT模型将决策树CART放入GB模型框架中,获得一个集成的模型。
回归问题:
解决回归问题时,采用损失函数为残差平方和:
损失函数负梯度为(残差和):
分类问题:
解决分类问题时,采用的损失函数为log损失函数:
损失函数负梯度为(残差和):
分类任务与回归任务的区别在于,分类任务的损失函数采用log损失函数
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会减少模型偏差,但相应的会增加过拟合概率,结合测试集进行验证,防止过拟合。
stepSize:学习率,若太小,模型收敛速度太慢;若太大,模型会不稳定,不能收敛。
maxDepth:树的深度。
maxBins:连续特征离散化的最大数量。
minInstancesPerNode:划分后的左右孩子节点最少的样本数量。
subsamplingRate:学习每颗决策树时采用的数据集比例。
利用网格搜索和交叉验证(训练集验证集划分验证),选择最优参数。根据参数对模型的影响成都决定参数遍历次序:首先遍历参数stepSize和maxIter,因为如果学习速率stepSize太小,需要较大的迭代次数maxIter才能获取最优值,较多的迭代次数在模型训练时消耗太多时间;其次遍历maxDepth和minInstancesPerNode;最后遍历参数maxBins。
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.evaluation import BinaryClassificationEvaluator
import pyspark.ml.classification as cl
from pyspark.ml.pipeline import Pipeline
import pyspark.ml.evaluation as ev
import pyspark.ml.tuning as tune
vf = VectorAssembler(inputCols=[‘c1’,’c2’,’c3’], outputCol="features")
pipeline = Pipeline(stages=[vf])
data_transformer = pipeline.fit(vf)
gbdt = cl.GBTClassifier(stepSize=0.1, subsamplingRate=0.8, maxDepth=5, maxBins=32, minInstancesPerNode=1, lossType='logistic')
grid = tune.ParamGridBuilder().addGrid(gbdt.maxIter, [20, 40, 60, 80, 100, 150]).build()
evaluator = ev.BinaryClassificationEvaluator(rawPredictionCol='probability', labelCol='label')
tvs = tune.TrainValidationSplit(estimator=gbdt, estimatorParamMaps=grid, evaluator=evaluator)
tvsModel = tvs.fit(data_transformer.transform(train))
#获取模型最优参数,若maxIter<20, 降低学习速率,进行参数遍历;若maxIter>100, 增加学习速率,进行参数遍历
tvsModel.bestModel
list(zip(tvsModel.validationMetrics, tvsModel.getEstimatorParamMaps()))
#模型预测结果
test_result = tvsModel.transform(data_transformer.transform(test))
print(evaluator.evaluate(test_result), {evaluator.metricName: 'areaUnderROC'})
print(evaluator.evaluate(test_result), {evaluator.metricName: 'areaUnderPR'})
Boos算法,开始为每个样本赋予相同的权重,在每一个模型训练结束后后,增加分错样本点的权重,减少预测正确的样本点权重,进行N次迭代后,将会得到N个简单的分类器,然后将这些分类器加权组合,最终得到一个强分类器。
GBDT算法,计算损失函数在当前模型的负梯度值,作为下一次模型训练的目标函数,每次迭代时沿着损失函数的负梯度方向移动,最终损失函数越来越小,得到越来越精确的模型。与Boost对错误样本加权有很大的区别。
1、RF每棵树相互独立训练,可以并行执行。GBDT每棵树的训练依赖于当前模型的结果,只能串行执行。
2、随着树的个数增加,RF的预测结果会更加稳定,模型精度和方差都会降低。而GBDT开始预测表现会随着树的数目增大变好,但到一定程度后,会随着树的数目增加而变差(过拟合)。
3、GBDT会选择更浅的树,RF会选择更深的树。RF并行地训练多个不同的分类器,目的是为了降低方差,所以对于每个基分类器来说,目标是如何降低偏差,因而会采用更深的决策树。GBDT每个模型都是在当前模型的基础上更加拟合原数据,可以保证偏差,对每个基分类器而言,需要选择方差更小的分类器,即更简单的分类器,所以选择深度较浅的决策树。
GBDT和RF共同的优点:
1、可以处理连续特征和离散特征。
2、对缺失值和高维特征有较高的稳健性。
3、可以得到变量的重要性排序。
参考资料:
https://blog.csdn.net/qq_34531825/article/details/52366265#t8
https://www.jianshu.com/p/005a4e6ac775
https://blog.csdn.net/qq_22238533/article/details/79192579
https://blog.csdn.net/qq_22238533/article/details/79185969
https://www.analyticsvidhya.com/blog/2016/02/complete-guide-parameter-tuning-gradient-boosting-gbm-python/