提升树Boosting Tree算法实例详解_程大海的博客-CSDN博客
从提升树Boosting Tree过度到梯度提升Gradient Boosting_程大海的博客-CSDN博客
GBDT梯度提升之回归算法个人理解_程大海的博客-CSDN博客_梯度回归算法
GBDT梯度提升之二分类算法个人理解_程大海的博客-CSDN博客_gbdt二分类
GBDT梯度提升之多分类算法个人理解_程大海的博客-CSDN博客_gbdt可以多分类吗
XGBoost算法个人理解_程大海的博客-CSDN博客_xgboost 叶子节点权重
交叉熵损失与极大似然估计_程大海的博客-CSDN博客_极大似然估计和交叉熵
使用泰勒展开解释梯度下降方法参数更新过程_程大海的博客-CSDN博客
AdaBoost算法实例详解_程大海的博客-CSDN博客_adaboost算法实例
前面的文章中介绍了梯度提升方法,将梯度提升方法中的基学习器替换成CART回归树模型,梯度提升方法就变成了梯度提升回归树GBDT方法。
GBDT算法的思想与提升树算法类似,不同点在于残差的计算:
1、首先对于数据集初始化一个简单模型,对于回归问题,可以初始化一个树桩(只有一个根节点的树),树桩的值为所有样本的均值
2、计算损失函数对于函数的偏导数,以平方损失为例,损失函数关于的偏导数是计算
3、计算第二步得到的偏导数在当前函数模型的值,并将值乘以-1(也就是损失函数的负梯度)来近似模型的预测残差
4、然后使用残差作为新的训练集的标签值label, 继续训练新的回归树模型,得到本轮在残差上学习的回归树模型,每个叶子节点计算一个输出值c(对于MSE损失函数的最佳输出值就是叶子节点上样本的均值,并且是残差的均值),输出值c使得每个叶子节点的损失值最小
5、更新学习到的整体模型,其中表示新得到的回归树的叶子节点,表示样本落在回归树的第j个叶子结点上,是符号函数,当则取值为1,否则为0,表示回归树第j个叶子节点的预测输出,也就是说,如果样本x落在第j个叶子结点上,则预测结果就是,将学习到的多个模型结果相加得到最终模型。
6、回到步骤2再次计算损失函数的负梯度在当前的值作为残差,步骤3再次学习得到一个新的,步骤4继续更新
GBDT关键参数:
1、n_estimators: 基学习器的数量,也就是学习多少个弱学习器进行组合
2、learning_rate(也就是有些地方说的shrinkage): 用于控制每个模型对最终模型的贡献度,起到正则化的作用,防止过拟合,lr越小,对应的迭代次数 n_estimator 就要大一些,学习率的使用如下:
3、subsample:控制每次训练时使用的训练样本比例,如果取值小于1.0,表示每次只使用部分训练集训练弱学习器,这样得到的弱学习器过拟合的可能性就小,同样起到正则化的作用。通过偏差和方差解释就是,降低了方差(整体上打的离目标更准了),增大了偏差(具体到每个具体的目标,可能每个具体的目标打的都不如之前准了,比之前单个目标的准度稍微差了一丢丢)
4、还有一堆控制树的深度,叶子节点个数的参数,也就是控制树的复杂度,树越复杂,模型拟合越好,也约有可能过拟合,方差就可能越大,偏差就可能越小。
5、GBDT参数较多,最佳超参数可以使用GridSearch网格搜索来进行,网格搜索说白了就是排列组合的方式,通过交叉验证把所有的参数组合都试一遍,找到交叉验证结果最好的一组参数,可想而知学习过程的计算量那是相当的大,超级慢。
参考链接:深入理解GBDT回归算法
scikit-learn官网:sklearn.ensemble.GradientBoostingRegressor — scikit-learn 1.0.2 documentation