scikit-learn 梯度提升树(GBDT)算法实战

本文使用GBDT回归类探讨了损失函数对训练数据的灵敏度,并介绍了参数调参实例。目录scikit-learnGBDT类库概述GBDT类库boost

前言

上一篇文章对GBDT算法原理进行了总结,本文使用GBDT回归类探讨了损失函数对训练数据的灵敏度,并介绍了参数调参实例。文末给出代码链接,欢迎下载。

目录


  1. scikit-learn GBDT类库概述
  2. GBDT类库boosting框架参数
  3. GBDT回归类损失函数的灵敏度探讨
  4. GBDT回归类的调参实例
  5. 总结

scikit-learn GBDT类库概述

GBDT类库包含了GradientBoostingClassifier分类类和GradientBoostingRegressor回归类,回归类和分类类除了损失函数参数不相同,其他参数大致相同。之前有boosting族Adaboosting分类类的实践,因此,本文重点介绍GradientBoostingRegressor回归类的使用。

GBDT类库boosting框架参数

GBDT类包含了boosting框架和弱学习器,GBDT类使用CART决策树作为弱学习器,

前面文章

有介绍决策树的相关参数,这里主要介绍boosting框架参数。

1)n_estimators:最大弱学习器个数。n_estimators过小容易欠拟合,模型处于高偏差状态;n_estimators过大容易过拟合,模型处于高方差状态。n_estimators常和learning_rate结合使用,默认值是100。

2)learning_rate:每个弱学习器的权重缩减系数v,相当于正则化参数。考虑权重系数v,那么GBDT模型的迭代公式为:

scikit-learn 梯度提升树(GBDT)算法实战

其中,f(x)代表学习器模型,G(x)代表每次迭代的弱学习器,v为权重缩减系数(0<v≤1)。系数 v的作用:达到相同的训练效果,含有权重缩减系数的模型需要更多的迭代次数,因此,通过设置 v 降低了模型的复杂度,防止过拟合。

3)subsample:从训练样本随机无放回的抽取一定比例的子样本集进行训练,达到降低模型方差的效果,但同时会增大模型偏差。

4)loss:GBDT算法的损失函数,分类模型和回归模型的损失函数是不同的。

分类模型:有对数损失函数”deviance“和指数损失函数”exponential”,默认是对数损失函数。一般用对数损失函数进行二元分类和多元分类。

回归模型:有均方差”ls“,绝对损失”lad“,Huber损失”huber“和分位数损失”quantile”。默认是均方差。如果训练数据较好,推荐使用 ls,训练数据含有噪声或异常点时,推荐使用抗噪音的损失函数“huber”。如果需要对训练集进行分段预测的时候,则采用损失函数”quantile“,表达式

可参考上文

5)alpha:这个参数只有GradientBoostingRegressor有,当我们使用Huber损失”huber”和分位数损失”quantile”时,需要制定分位数的值。默认是0.9,如果噪音较多,可以适当降低这个分位数的值。

GBDT回归类损失函数的灵敏度探讨

问题:当训练数据含有噪声或异常点时,对不同损失函数的GBDT回归模型影响有多大。

评价准则:均方差结果 。

数据类型:原始数据(org_data),数据含有随机噪声(noisy_data),数据含有异常值(outlier data)。

GBDT回归模型:损失函数分别为 ls,lad,huber,quantile,其他参数都是默认值。

下图为不同损失函数的回归模型对不同数据类型的预测误差情况:

scikit-learn 梯度提升树(GBDT)算法实战

上面四个图横坐标表示迭代次数,纵坐标表示预测值与实际值的均方差。

分析思路:比较同一模型对不同数据的均方差情况,就可以分析得到模型对噪声或异常值的敏感情况,异常值可以看成是加入了比较大的噪声。

结果分析:回归模型对加入噪声的数据不是很敏感,当数据加了一些异常值时,损失函数为huber的回归模型有最好的预测结果,因为均方差是最小的。因此,当你的数据有较大的噪声或异常值时,我建议你使用损失函数是huber的GBDT回归模型。

GBDT回归类的调参实例

前面有

一篇文章

介绍了boosting族的分类调参实例,因此本节介绍GBDT回归类的调参数实例,其他集成方法类的参数择优算法基本相同。

本节对损失函数的quantile的回归模型进行优化,如果参数都是默认值,训练数据的均方差情况:

scikit-learn 梯度提升树(GBDT)算法实战

scikit-learn 梯度提升树(GBDT)算法实战

输出结果:

scikit-learn 梯度提升树(GBDT)算法实战

使用sklearn.model_selection.GridSearchCV和sklearn.model_selection.cross_validate进行调参,本文采用GridSearchCV函数进行调参:

scikit-learn 梯度提升树(GBDT)算法实战

得到最佳参数:

scikit-learn 梯度提升树(GBDT)算法实战

用最佳参数拟合训练数据得到新模型,用该模型预测测试数据,得到均方差:

scikit-learn 梯度提升树(GBDT)算法实战

均方差结果:

scikit-learn 梯度提升树(GBDT)算法实战

参数优化后的均方差结果大大的降低了。仍可以使用GridSearchCV再次优化框架参数和决策树参数,因为均方差结果比较小了,本文就不继续优化参数了,感兴趣的童鞋可以继续优化。

总结

当训练数据含有较大的噪声或异常值时,建议选择损失函数为”huber“的GBDT回归模型,参数择优一般采用交叉验证的方法,重点是理解交叉验证的算法思想,若还有疑问,欢迎微信交流。

后台回复”GBDT”获取本文源码链接

参考:

https://www.cnblogs.com/pinard/p/6143927.html

推荐阅读

提升树算法原理小结

集成学习原理总结

比较全面的随机森林算法总结

比较全面的Adaboost算法总结


scikit-learn 梯度提升树(GBDT)算法实战

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/81327.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信