基于前面对Blending集成学习算法的讨论,我们知道:Blending在集成的过程中只会用到验证集的数据,对数据实际上是一个很大的浪费。为了解决这个问题,我们详细分析下Blending到底哪里出现问题并如何改进。在Blending中(Blending文章链接
),我们产生验证集的方式是使用分割的方式,产生一组训练集和一组验证集,这让我们联想到交叉验证的方式。顺着这个思路,延伸出了stacking这种模型的方案。
1.Stacking简介
stacking严格来说并不是一种算法,而是精美且又复杂的,是对模型集成的一种策略。 先来一张美图看一下,不懂得话没关系,看完整片文章就感觉这个图棒棒哒。
2.Stacking流程
- 首先我们会得到两组数据:训练集和测试集。将训练集分成5份:train1,train2,train3,train4,train5。
- 选定基模型。这里假定我们选择了xgboost, lightgbm 和 randomforest这三种作为基模型。比如xgboost模型部分:依次用train1,train2,train3,train4,train5作为验证集,其余4份作为训练集,进行5折交叉验证进行模型训练;再在测试集上进行预测。这样会得到在训练集上由xgboost模型训练出来的5份predictions,和在测试集上的1份预测值B1。将这五份纵向重叠合并起来得到A1。lightgbm和randomforest模型部分同理。
- 三个基模型训练完毕后,将三个模型在训练集上的预测值作为分别作为3个"特征"A1,A2,A3,使用LR模型进行训练,建立LR模型。
- 使用训练好的LR模型,在三个基模型之前在测试集上的预测值所构建的三个"特征"的值(B1,B2,B3)上,进行预测,得出最终的预测类别或概率。
做stacking,首先需要安装mlxtend库。安装方法:进入Anaconda Prompt 或者 cmd,输入命令 pip install mlxtend 即可。
3.实例讲解
- 首先将所有数据集生成测试集和训练集(假如训练集为10000,测试集为2500行),那么上层会进行5折交叉检验,使用训练集中的8000条作为喂养集,剩余2000行作为验证集(彩色框)。
- 每次验证相当于使用了白色的8000条数据训练出一个模型,使用模型对验证集进行验证得到2000条数据,并对测试集进行预测,得到2500条数据,这样经过5次交叉检验,可以得到中间的彩色的5X2000条验证集的结果(相当于每条数据的预测结果),5X2500条测试集的预测结果。
- 接下来会将验证集的52000条预测结果拼接