前面几次课分别给大家介绍了逻辑回归、决策树、随机森林和SVM几种常用的分类模型,不知道大家还有没有印象?本节课将给大家介绍Kaggle竞赛大杀器--融合模型!
那么到底什么是融合模型呢?它跟我们之前说过的集成学习模型(例如随机森林)有什么不同呢?其实融合模型也是集成学习的一种,但它与随机森林这种集成学习算法又有一定的区别。首先集成学习主要有以下几种常见的类型:
1、Voting
Voting可以说是一种最为简单的模型融合方式。对于一个二分类模型,假设共有3个分类器(模型),我们采取投票的方式决定,票数最多者作为最终结果输出。俗话说,三个臭皮匠赛过一个诸葛亮!
2、Bagging
Bagging的思想是利用Bootstrap方法,即有放回的重复随机抽样,从而生成不同的数据集,进而训练得到不同的模型,将这些模型的输出结果综合(投票或平均的方式)得到最终的结果。Bagging本质上是利用了模型的多样性,改善算法整体的效果。其中随机森林就是Bagging算法的优化版,不同于Bagging算法的是,Bagging产生不同数据集的方式只是对样本进行有放回的随机抽样,而随机森林不仅对样本进行随机有放回抽样,还会对特征进行随机抽样从而得到不同的数据集。
3、Boosting
Boosting是一种提升算法,其思想是在算法迭代过程中,每次迭代构建新的分类器,重点关注被之前分类器分类错误的样本,依次迭代,最终加权平均所有分类器的结果,从而提升分类精度。Boosting与Bagging最大的区别就是Boosting是串行的,而Bagging中所有的分类器是可以同时生成的(分类器之间无依赖关系),而Boosting中则必须先生成第一个分类器,然后依次往后生成其他分类器。其核心思想是通过改变训练集进行有针对性的学习,通过每次更新迭代,重点关注分错样本。总而言之就是知错就改,逐渐变好。Boosting中较典型的代表有Adaboost、GBDT和Xgboost。
4、Stacking
接下来我们重点介绍Stacking,Stacking的基本思想是使用多种基分类器,然后使用其中一种或其他新的分类器来作为次级分类器来融合基分类器的预测结果,主要目的是降低泛化误差。Stacking算法通常分为两级,第一级是用不同的算法形成N个基础分类器,同时产生一个与原数据集大小相同的新数据集,利用这个新数据集和新的算法来得到第二级的分类器。在训练第二级分类器时采用各基础分类器的输出作为输入,第二级分类器的作用就是对基础分类器的输出进行集成。但是由于Stacking模型复杂度过高,比较容易造成过拟合,所以在模型融合过程中通常会做交叉验证。假设现在我们有训练数据train_data1000行;测试数据test_data300行。具体流程图如下所示:

注:model1、model2表示其中一种分类器算法
如图所示,我们现在用5折交叉验证来训练数据,即model1要做5次不同的训练和预测。
第一次,model1拿train_data的800行做训练集,200行做验证集,然后预测出200行的数据a1。
第二次,model1拿train_data的800行做训练集,200行做验证集,然后预测出200行的数据a2。
第三次,model1拿train_data的800行做训练集,200行做验证集,然后预测出200行的数据a3。
第四次,model1拿train_data的800行做训练集,200行做验证集,然后预测出200行的数据a4。
第五次,model1拿train_data的800行做训练集,200行做验证集,然后预测出200行的数据a5。
然后将a1到a5拼接起来,最后得到一列,共1000行的数据。注:若有多个基本类器,其他基分类器按以上这种方法依次进行训练和预测。
针对测试集,用前面5折交叉验证训练出来的5个model1去做预测,一共得到5次300行的数据,然后做平均,最终得到一列300行的数据。假设有5个基模型,那么根据train_data会得到一个包含5列数据(特征)的新的训练集meta_train,同理test_data也会得到一个新的测试集meta_test,最后,用meta_train和meta_test放到次级分类器中,训练和预测得到最终的结果。
ok,我们还是以泰坦尼克号数据集,用逻辑回归、决策树、随机森林来作为初级分类器,逻辑回归作为次级分类器,看看stacking算法是不是比单个模型效果更好呢?我们先分别看下模型融合过程及代码

融合模型部分代码如下

可以看到,stacking最终得到的auc为0.97,之前逻辑回归auc只有0.96,总的来说auc大约提升了0.01个百分点,还是证明了stacking经过模型融合后是有效果的!
有些同学可能会说,老shi这个stacking
只带来了0.01的auc提升,好像提升效果不明显啊?在这里可能确实提升不够明显,但同学们别忘了,在kaggle比赛中哪怕只有0.01个百分点的效果提升都可以超越多少人了!所以,stacking在这里效果还是很不错的,当然如果想要让效果有更明显的提升可以尝试用更多更牛逼的基分类器和次级分类器算法,特征工程以及特征选择都可以有更好的尝试,这里我只是为了方便(toulan)用了几个比较常用的基分类器算法,数据集和特征没有做进一步的加工处理,同学们可以多多去尝试,实践出真知!
本次融合模型的代码包括前几次课的相关代码和数据集都已经放到我的github上了,有需要的同学请自取https://github.com/YANGYOUYUN/ML-learning。本节课到此,下次课给大家带来CTR广告点击预估中的常用的利器——XGBoost,敬请期待!