机器学习之Stacking——模型融合

“特征提取决定模型上限,模型的选择就是不断接近这个上限。”

在特征已经提取好的情况下,也选择好了机器学习模型算法,如何进一步提高模型的表现呢?

Stacking方法就是一个可以帮助模型进一步提高的算法。

1、(大白话)概念

类似于深度学习NNs,Stacking一般有两层机器学习模型,第一层机器学习模型群可以被看成NNs中的神经元,对原始的(处理好的)数据集进行训练,输出新的特征,给下一层的机器学习模型使用;第二层机器学习模型的学习‘材料’就是上一层的输出,第二层的输出是最后的预测结果。

多个模型的集合,相当于NNs中的深层次的特征提取,因此,Stacking往往能够进一步提高预测结果的准确性。

2、实现过程

主要过程是下图:

图中分两层:第一层的输入是原始的Train data和Test data,输出经过五折交叉验证输出的Predictors的纵向叠加(叠加成和Train data相同的行数),以及对Test data的预测结果取平均的值。第二层的输入是 经过五折交叉验证输出的Predictors作为训练集,而对Test data的预测结果取平均的值作为测试集,输出的是最后的预测结果。

图中有些许问题,正确的图应该是下面:

 (电脑上用鼠标画的,很抽象,别骂了哈哈哈)

与上图的 区别就是,第一层1st只表示了一个model1,上面还有别的模型M2,M3,说明第一层的五折交叉验证其实是一个模型中的内容,而不是分别的五个模型。第二层2nd中使用Mnext来表示。

假设Model1 输出 PTrain1和PTest1。那么其余的Model2(这里的Model2不是图中第二层的Model2,还是属于第一层的模型)、Model3会输出PTrain2和PTest2、PTrain3和PTest3。

那么,给下一层Mnext的训练集就为:Train =  PTrain1 +  PTrain2 +  PTrain3;测试集为: Test = PTest1 + PTest2 + PTest3。(横向拼接,作为不同的特征,DataFrame很常见的形式)

用矩阵来表示就是:

 以防有人还是看不懂,这里还有一个图,结合前文,应该能轻松读懂。Stacking可以由下图清晰表示出来:

3、Python代码实现

def get_oof(clf, x_train, y_train, x_test):
 oof_train = np.zeros((ntrain,))  
 oof_test = np.zeros((ntest,))
 oof_test_skf = np.empty((NFOLDS, ntest))  #NFOLDS行,ntest列的二维array
 for i, (train_index, test_index) in enumerate(kf): #循环NFOLDS次
     x_tr = x_train[train_index]
     y_tr = y_train[train_index]
     x_te = x_train[test_index]
     clf.fit(x_tr, y_tr)
     oof_train[test_index] = clf.predict(x_te)
     oof_test_skf[i, :] = clf.predict(x_test)  #固定行填充,循环一次,填充一行
 oof_test[:] = oof_test_skf.mean(axis=0)  #axis=0,按列求平均,最后保留一行
 return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1)  #转置,从一行变为一列

4、理论以及注意事项

1. 为什么Stacking可以提高性能呢?

结合NNs,我们可以理解为:“因为第一层模型提取了更深层,和结果更有相关性的特征”,所以第二层的输出会更好。

2. 为什么要用交叉验证?

k折交叉验证是为了防止过拟合。我们知道,如果不断地对原始训练集进行特征提取和训练,那么就比较容易造成过拟合,特别是两层机器学习的情况下。其实结合NNs中的dropout机制就更能理解其内涵了。

3. Stacking的注意事项

        3.1 模型有强有弱,第一层应该选用强模型,第二层选用弱模型(线性模型LR)(进一步避免过拟合);

        3.2 第一层的模型应该尽量选用不同类型的模型,以实现多方面的特征提取。第一层的基模型必须准而不同"

欢迎留言和讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值