r语言 stack r语言stacking融合_灰色预测模型代码


前记

Blending和stacking是两种类似的模型融合的方法(ensembling),在开始之前我强烈推荐


https://mlwave.com/kaggle-ensembling-guide/mlwave.com

阅读这篇文章,它非常易于理解,非常适合入门;

孔多塞陪审团定理(1784)某种程度是描述模型融合的;该定理主要阐述了,如果每个陪审员都是独立做决断的,当每个陪审员的对问题决断都是’正’且概率超过0.5,那么所有陪审员的结果合起来‘正’的概率会得到提升,并且会趋近于1;相反的如果每个陪审员决断概率都是’负’且小于0.5,那么所有陪审员的结果合起来‘负’的概率就会提升,结果会趋于0;换句话说,每个人有每个人的特质,观察问题,当我们观察一个人的判断时,他总会有一定的某方面的偏见,当我们综合多个人的意见的时候这种偏见就会被弱化,就会总结出一种’集体智慧’;

所以模型融合的总的来说讲的就是:弱化偏见和综合智慧的思路;

几类融合

1)多种预测结果

模型融合多数情况下都是训练多个模型,然后融合,期望这个融合的模型最终的效果可以打败单个模型的效果;而这个融和的规则方法主要是以下几类:投票(少数服从多数),平均值,最大值,最小值;其中平均值是最为常见的方法规则;


r语言 stack r语言stacking融合_建模_02

平均融合模型


2)stacking

Stacking是利用多个模型的预测结果来构建一个新的模型,以期这个构建的新的模型的表现能够超过历史的模型;这里两个注意点,一是这个构建的新的模型一般是简单的模型,所谓简单的模型比如是逻辑回归等这样的线性模型,二是多个模型这个多一般需要比较多才会有比较好比如20个以上;

当然具体操作的时候stacking可能会有些麻烦,整体是思路是构建多个N折的模型,并利用每折的模型分别预测验证集和测试集,最后N折模型预测的N个验证集预测首尾拼接,N个测试集的预测计算平均,得到多个这样的训练预测和测试预测后 ,分别作为训练测试特征输入到一个简单的模型。下面具体一步一步伪代码阐述这个过程;

1. 首先需要依次构建多个单个模型

构建模型应该不难,但是模型构建完输出什么给后续的模型用呢?如下图所示首先将数据分为5分,每次利用其中1份当作验证集,剩余4份当作训练集,训练4份数据得到一个特模型,然后利用这个模型分别预测验证集和测试集;


r语言 stack r语言stacking融合_r语言 stack_03

每折预测,fold拼接,test平均加总

一个字段;当构建完多个模型这样的预测后;每个预测结果都是独立预测的;所以此处用逻辑回归最后再对这个多个模型的预测进行建模就是第二层常用的策略;


r语言 stack r语言stacking融合_stacking模型融合_04

每折预测首尾拼接,测试平均加总

其实不难看出这样的结构很类似于神经网络,一个子模型就类似一个神经元,而最后一层就是输出层sigmoid函数;那么其实我们可以以此对这个思路进行改造升级;如下图所示多层的stacking模型


r语言 stack r语言stacking融合_stacking模型融合_05

多层stacking

彩蛋

其实整合说来说去其实还是在前记中说到的总结性的观点:弱化偏见和综合智慧

或者说就是相互弥补弱点,所以这种程度上理解,当给我们几个模型,我们分别都明白他们的各自的优缺点。那么此时根据前面这种取长补短的思想,我们模型的融合是不是应该还是有新的思路呢?以科大讯飞为例:当很显著的catboost完击败了lgb,在cate很多的场景下,那么是不是说意味着这里的lgb就没啥用呢?


r语言 stack r语言stacking融合_灰色预测模型代码_06

catboost预测的双边分布

融合思路1:灰色地带相濡以沫

误伤(当你把1的样本预测成0,或者0的样本预测为1都是一种误伤)的概率相对较低,而中间地带其实是灰色地带,在这里误伤的主要来源,对于模型来说,这些样本是他无法确定的,所以才大多数落在了这里面;那么有什么办法把这里的样本弄清楚?其实复赛的时候大家比较清楚的一点是lgb跟catboost融合的效果不在那么好,因为lgb线上还是比较差的,而且即使你给lgb很低的融合比例,线上也永远不是提升的;这是因为这两边都是catboost非常精准的地带了,再带入新的模型融合只有干扰可言,不会有 任何收益;所以这里参考的思路是,中间地带概率融合;我认为这样即使一个垃圾的模型也能一定程度给与收益;

融合思路2:双边召回策略

双边召回策略;双边召回的思路是降低误伤,如果A模型,B模型线上差不多的分数,两者模型又有差异,那么我相信差异的地方多数是再中间地带,那么此时的思路是;灰色地带样本集是A,两个模型分别对这部分样本进行预测,若结果存在一个非常高(0.2以下或者0.8以上的概率)的跳出灰色地带的预测,那么这个预测就非常有信心把这个样本带出灰色地带,这就是一种召回策略;