有的同学(小编自己)一看到陌生的看似高大上的词汇就觉得头晕,集成学习?又称为元学习?这又是什么鬼东东?当你鼓起勇气去了解它的时候,会发现……牺牲几个亿的脑细胞还是能搞懂的~
集成学习(ensemble)的基本思路其实就是:结合多个较弱的学习器来创建一个很强的学习器。愚以为就是统计学中的组合模型策略在机器学习领域的推广。基于这个思路,各种算法被开发出来,彼此之间的差异在于对如下两个问题的解决:
①如何选择或者构造那些较弱的学习模型?
②如何将这些较弱的学习模型的预测结果组合起来形成最终的预测?
集成学习方法都遵循如下流程图所示的模式:
首先输入训练数据用来建立很多个模型;接着分配函数决定每个模型接收完整的训练数据集还是某个抽样的样本;紧接着创建多个模型并获得一系列预测;然后,组合函数用以对预测中的不一致进行调解(例如:投票法、不同模型的投票数进行加权等);最终获得组合模型的预测值。
下面我们一起入门一下最受欢迎的三种集成学习方法:
(1)bagging
又称自助汇聚法。bagging对原始训练数据使用自助法抽样的方式产生很多个训练数据集,这些训练集使用单一的机器学习算法产生多个模型,然后使用投票(对于分类问题)或者平均(对于数值预测)的方法来组合预测值。
由此看来,bagging是一种相对简单的集成学习器,但是只要它使用相对不稳定的学习器就能得到很好的效果,不稳定学习器会随着数据发生的很小变化产生差别很大的模型。因而bagging经常和决策树一起使用,因为决策树倾向于随着数据的微小变化发生比较大的改变。
这里,首推caret添加包!其中的train( )函数可采用交叉验证(可参考本号之前的文章了解何为交叉验证
手把手教你做交叉验证
)的方法来建立bagging树并预测其未来的性能,默认设置用来投票的决策树数目是25。代码示例如下:
library(caret)
set.seed(20180905)
ctrl=trainControl(method="cv",number=10)
train(结局变量~.,data=数据集名,method="treebag",trControl=ctrl)
这里的method选项目前已经包括237种方法,相信总有一款是你喜欢的模型。
(2)boosting
又称AdaBoost或自适应boosting。对于一个二分类问题,如果我们瞎猜,也会有50%的机率猜对,那么现实中是有很多错误率小于50%的弱学习器。boosting的原作者Schapire和Freund发现可以通过简单地添加更多弱学习器的方式来将性能提升至任意的阈值。
类似于bagging,boosting也是在不同重抽样数据中训练模型并通过投票来决定最终的预测值。差异在于boosting中的重抽样数据集是专门构建用来产生互补的模型,而且每个模型的选票并不是同等重要。
从未加权的数据开始,第一个分类器尝试对结果建模。预测正确的样本出现在下一个分类器的训练集中的可能性比较小,相反地,难以分类的样本将会出现的更频繁,也就是说对难以分类的样本给予更大的权重。当下一轮的弱分类器被添加后,它们用来训练后面更难的样本。该过程持续迭代,直至达到要求的总误差或者性能不再提高。这时,每个分类器的票数会按照它们在建模数据集上的准确度进行加权。
将上述代码中的method设置为adaboost试一下吧小可爱们~
(3)随机森林
又称决策树森林,因为它只关注决策树的集成学习。该方法将bagging和随机特征选择结合起来,对决策树模型添加额外的多样性,在树的集成(森林)产生之后,亦采用投票的方法来组合预测结果。
R中有好几个创建随机森林的添加包,首推randomForest包,代码示例如下:
library(randomForest)
m=randomForest(train,class,ntree=500,mtry=sqrt(p))
p=predict(m,test,type="response")
ntree指定树的数目,mtry代表每次划分中随机选择的特征数目,默认是数据集中特征数开平方。这些参数是否合适取决于学习任务和训练数据的本质,一般来说,更复杂的问题和大量的数据使用大数量的树效果会更好。使用大数量的树的目的是使得每一个特征都有机会在多个模型中被充分训练。同样地,可以采用caret包中的train函数来评估随机森林的性能,将method设置为rf。评估的指标及其它选项的设置请自行查看帮助文档。
领取专属 10元无门槛券
私享最新 技术干货