R 集成算法④ 梯度提升树
2018-01-18 本文已影响20人
柳叶刀与小鼠标
介绍
- Boosting是一类将弱学习器提升为强学习器的算法。这类算法的工作机制类似:先从初始训练集中训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注。 然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器的数目达到事先指定的值T,最终将这T个基学习器进行加权结合。
Boosting算法是在算法开始时,为每一个样本赋上一个相等的权重值,也就是说,最开始的时候,大家都是一样重要的。 在每一次训练中得到的模型,会使得数据点的估计有所差异,所以在每一步结束后,我们需要对权重值进行处理,而处理的方式就是通过增加错分点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就被赋上一个很高的权重。 然后等进行了N次迭代,将会得到N个简单的基分类器(basic learner),最后将它们组合起来,可以对它们进行加权(错误率越大的基分类器权重值越小,错误率越小的基分类器权重值越大)、或者让它们进行投票等得到一个最终的模型。
原理
- 梯度提升(gradient boosting)属于Boost算法的一种,也可以说是Boost算法的一种改进,它与传统的Boost有着很大的区别,它的每一次计算都是为了减少上一次的残差(residual),而为了减少这些残差,可以在残差减少的梯度(Gradient)方向上建立一个新模型。所以说,在Gradient Boost中,每个新模型的建立是为了使得先前模型残差往梯度方向减少, 与传统的Boost算法对正确、错误的样本进行加权有着极大的区别。
- 梯度提升算法的核心在于,每棵树是从先前所有树的残差中来学习。利用的是当前模型中损失函数的负梯度值作为提升树算法中的残差的近似值,进而拟合一棵回归(分类)树。
特点
- GBM优点:
- 可以和随机森林这样的高性能算法竞争
- 能保持可靠的预测表现,预测结果比简单模型差的情况非常罕见
- 常常被kaggle等竞赛的获胜者使用
- 能处理缺失数据
- 无需进行特征缩放
- 能处理的因子水平比随机森林高
- 没有已知的对特征变量数目的限制。
- 用于分类的提升方法包括三个参数:
收缩参数(shrinkage):一个小的正数,控制提升学习的速率,默认值为0.001.降低收缩系数能改善结果,但需要更多的树。
树的数量(n.trees):拟合树的总量。选择这个参数时要特别注意,因为这个值过大会造成过拟合
每棵树的分叉数目(interaction.depth):这个参数控制这提升集成的复杂程度。取值为1就有比较好的结果。
参数
setwd("E:\\Rwork")
library(gbm)
set.seed(1234)
data = iris
index <- sample(nrow(iris),0.75*nrow(iris))
train_data <- iris[index,]
test_data <- iris[-index,]
gbm1 <- gbm(Species~., distribution = "multinomial",
data = train_data, n.trees = 2000, shrinkage = 0.01)
gbm1
prediction <- predict.gbm(gbm1, test_data, type = "response", n.trees = 1000)
summary.gbm(gbm1)