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


blendnig
<https://github.com/InsaneLife/MyPicture/blob/master/ensemble_blending.py>


stacking
<https://github.com/InsaneLife/MyPicture/blob/master/ensemble_stacking.py>


代码 <http://heamy.readthedocs.io/en/latest/usage.html>


模型融合接口 <http://rasbt.github.io/mlxtend/>


模型融合heamy <http://heamy.readthedocs.io/en/latest/>


常见的 Ensemble 方法有这么几种:

* Bagging:使用训练数据的不同随机子集来训练每个 Base Model,最后进行每个 Base Model 权重相同的 Vote。也即
Random Forest 的原理。
* Boosting:迭代地训练 Base Model,每次根据上一个迭代中预测错误的情况修改训练样本的权重。也即 Gradient Boosting
的原理。比 Bagging 效果好,但更容易 Overfit。
*
Bagging


1)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping(有放回)的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(我们这里假设k个训练集之间是相互独立的,事实上不是完全独立)


2)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。但是是同种模型。(注:,k个训练集虽然有重合不完全独立,训练出来的模型因为是同种模型也是不完全独立。这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)

3)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

对于Bagging需要注意的是,每次训练集可以取全部的特征进行训练,也可以随机选取部分特征训练,例如随机森林就是每次随机选取部分特征

讲完Boosting,Bagging,我们来总结下这两种框架算法的异同点: 
1)样本选择上: 
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。

Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

2)样例权重:

Bagging:使用均匀取样,每个样例的权重相等

Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

3)预测函数:

Bagging:所有预测函数的权重相等。

Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
5)bagging是减少variance,而boosting是减少bias 


* Blending:用不相交的数据训练不同的 Base Model,将它们的输出取(加权)平均。实现简单,但对训练数据利用少了。
* Stacking:接下来会详细介绍。
从理论上讲,Ensemble 要成功,有两个要素:

* Base Model 之间的相关性要尽可能的小。这就是为什么非 Tree-based Model 往往表现不是最好但还是要将它们包括在
Ensemble 里面的原因。Ensemble 的 Diversity 越大,最终 Model 的 Bias 就越低。
* Base Model 之间的性能表现不能差距太大。这其实是一个 Trade-off,在实际中很有可能表现相近的 Model
只有寥寥几个而且它们之间相关性还不低。但是实践告诉我们即使在这种情况下 Ensemble 还是能大幅提高成绩。

<https://dnc1994.com/2016/04/rank-10-percent-in-first-kaggle-competition/#Stacking>
Stacking

相比 Blending,Stacking 能更好地利用训练数据。以 5-Fold Stacking 为例,它的基本原理如图所示:

<http://7xlo8f.com1.z0.glb.clouddn.com/blog-diagram-stacking.jpg>

整个过程很像 Cross Validation。首先将训练数据分为 5 份,接下来一共 5 个迭代,每次迭代时,将 4 份数据作为 Training Set
对每个 Base Model 进行训练,然后在剩下一份 Hold-out Set 上进行预测。同时也要将其在测试数据上的预测保存下来。这样,每个 Base
Model 在每次迭代时会对训练数据的其中 1 份做出预测,对测试数据的全部做出预测。5 个迭代都完成以后我们就获得了一个 #训练数据行数 x #Base
Model 数量 的矩阵,这个矩阵接下来就作为第二层的 Model 的训练数据。当第二层的 Model 训练完以后,将之前保存的 Base Model
对测试数据的预测(因为每个 Base Model 被训练了 5 次,对测试数据的全体做了 5 次预测,所以对这 5
次求一个平均值,从而得到一个形状与第二层训练数据相同的矩阵)拿出来让它进行预测,就得到最后的输出。

补充:以上图为例,我们现在有训练集train_x,train_y,测试集test 
① 我们首先选择一种模型比如随机森林rf。(未经训练) 
②这里假设把训练集均分成5份,把其中四份作为小的训练集s_train_x,s_train_y另外一份作为小的测试集s_test,测试集test不变。 
③我们以s_train_x,s_train_y训练rf模型,训练出的模型预测s_test得出对应的s_pred,再预测test得出y_pred。 
④在训练集再选择另外一份作为小的测试集s_test_x,其他四份作为训练集训练模型rf。 
⑤重复②,③,④步骤五次。我们会得到五个s_pred和五个y_pred。 

五个s_pred作为一个train_X,原始的train_y作为train_Y训练模型得到模型G,五个y_pred取个平均值作为新的test_X,把test_X带入到模型G中得出预测结果。 

以上就是stacking的第一层,在第二层中,我们以第一层的输出train再结合其他的特征集再做一层stacking。不同的层数之间有各种交互,还有将经过不同的
Preprocessing 和不同的 Feature Engineering 的数据用 Ensemble 组合起来的做法。 
上面是以一种模型随机森林进行模型训练,当然可以分别用不同种的模型。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信