模型融合方案Stacking原理与实现

机器学习是基于统计学原理的一门技术。今天,我将给各位献上stacking模型融合方案原理简介与实现。首先,在此介绍几个前置概念。

1.数据K折交叉验证(K-FOLD)

图1 数据K折交叉

如上图所示,我们在获得一个完整数据集后,将数据分为K份(图中设置K为5),每次遍历数据取其中1份作为测试集,其余K-1份作为训练集。同时,对于任意一个基础机器学习模型而言,将会重复K次对数据进行处理的过程,这即为k-fold机制。

2.基模型
Stacking中的对数据K折交叉验证处理过程中,用到的机器学习模型。

3.stacking原理

图2 Stacking原理图

Stacking原理如上图所示。下面我将结合具体数据维度,来对该机制进行说明。
假设我得到训练集Train_data,维度为:mn,同时测试集Test_data维度为a(n-1)。同时假设使用Train_data中所有特征进行训练,则从中取出一列label列表,其长度为m,此时Train_data维度变为(m*(n-1))。之后,设置K个机器学习模型作为基模型(本案例中所设置数字为5)。之后,我们分别取这K个模型中,每一个模型进行训练集上K折交叉处理。在一次迭代中,将数据的第K份作为测试集,其他K-1份作为训练集,从而一次迭代生成维度为(m/k,(n-1)/k)的矩阵。将每一次生成的矩阵拼接起来,则对于一个模型而言,完整K次遍历数据后,将生成维度为(m,n-1)的矩阵。则K个模型而言,我们将这些矩阵横向拼接起来,得到最终超特征矩阵new_train,维度为(m,kn-k)。

除此外,对于测试集Test_data而言,我们也在基模型每次遍历测试集并训练出模型时,对测试集进行预测。每个模型每次遍历得到的测试数据集矩阵维度为(a,n-1),则
k次遍历后,最终的到的矩阵维度为(a,kn-k).此时为了保证维度统一,我们对该矩阵进行按行求取均值,将其维度变为(a,n-1)。对于K个模型而言,最终经过上述处理过程后,得到新的测试集上的超特征矩阵new_test,其维度为(a,kn-k)。

上述过程即为stacking第一层处理过程。之后第二层处理过程中,我们将new_train作为训练集,将第一层得到的label集合作为标签进行训练,得到最终训练出的模型,从而对new_test进行预测即可。

4.stacking扩展

在kaggle的比赛上,有的团队在经过第一层处理后得到的new_train矩阵基础上,与原始的train_data矩阵进行横向拼接。同时,对new_test也做此处理。从而选取K个机器学习模型,继续对新数据进行K-fold处理。后续操作与上述同理。但一般经过三层即可结束了。

5.stacking代码实践

代码已经上传至git仓库,请点击查看

我用此机制跑了跑某比赛,在没有调参的情况下,与第一名指标相差不是很大,还是较为满意的。

图3 跑分图