集成把不同模型的预测结果结合起来,生成最终预测,集成的模型越多,效果就越好。另外,由于集成结合了不同的基线预测,它们的性能至少等同于最优的基线模型。集成使得我们几乎免费就获得了性能提升!
集成的基本概念:结合多个模型的预测,对特异性误差取平均,从而获得更好的整体预测结果。
stacking:stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为特征加入训练集进行再训练,从而得到完整的stacking模型。
不同的模型,是在不同的角度观察我们的数据集。
基本步骤:
①选择基模型。各种基本的机器学习算法。
②把训练集分成不交叉的若干份。
③将其中一份作为预测集,使用其它份进行建模,预测预测集,保留结果。
④把预测结果按照对应的位置填上,得到对整个数据集在第一个基模型上的一个stacking转换。
⑤在④的过程中,每个模型分别对测试集进行预测,并保留这五列结果,取平均值,作为该基模型对测试集数据的一个stacking转换。
⑥对其它基模型重复②-⑤步。
⑦一般使用LR作为第二层的模型进行建模预测。
整个过程比较耗时,尽量增加一些不同类型的模型。
下面实操一下吧,参考了[8]
问题是假设四个人扔187个飞镖。其中150个飞镖观察是谁扔的,扔到了哪里(训练数据)。剩下的作为测试数据,知道飞镖的位置。我们的学习任务是根据飞镖的位置,猜测是谁扔的。
先读取数据。
1 | import numpy as np |
这是有监督学习的分类问题,把能用的算法都用上看看吧。
先画图看看
1 | # 画图看看 |
可以看到四个人投掷的坐标还是有明显差别的。
下面就一个算法一个算法先试吧。
1 | from sklearn.linear_model import LogisticRegression #逻辑回归 |
结果如下:
用评分前五名的决策树,随机森林,KNN,朴素贝叶斯,支持向量机算法进行stacking。先计算各个模型对测试集预测的正确率。先写一个测试函数。
1 | # 用测试集检验模型预测的正确率 |
然后用五个模型分别预测。
1 | #分别测试 |
接着照[8]进行Stacking,却怎么也调不通。
[9]介绍了一个库vecstack,封装了stacking的第一步,试试。
1 | from sklearn.model_selection import cross_val_score, KFold, train_test_split |
换了一个二级模型,用逻辑回归模型
stacking的结果并不是最好的,跟选用的模型有很大关系。先熟悉流程吧。
本篇代码: https://github.com/zwdnet/MyQuant/tree/master/40
参考:
[1]https://zhuanlan.zhihu.com/p/32949396
[2]https://blog.csdn.net/wstcjf/article/details/77989963
[3] https://zhuanlan.zhihu.com/p/33589222
[4] https://zhuanlan.zhihu.com/p/32896968
[5] https://zhuanlan.zhihu.com/p/26890738
[6] https://zhuanlan.zhihu.com/p/75411512
[7] https://zhuanlan.zhihu.com/p/27493821
[8] https://www.cnblogs.com/yucaodie/p/7044737.html
[9] https://towardsdatascience.com/automate-stacking-in-python-fc3e7834772e
我发文章的三个地方,欢迎大家在朋友圈等地方分享,欢迎点“在看”。
我的个人博客地址:https://zwdnet.github.io
我的知乎文章地址: https://www.zhihu.com/people/zhao-you-min/posts
我的微信个人订阅号:赵瑜敏的口腔医学学习园地