stacking原理

1. stacking原理

这里以2层stacking为例进行介绍 
假设有3个基模型M1,M2, M3, 
数据集: D={(x1→,y1),(x2→,y2),...,(xn→,yn)}D={(x1→,y1),(x2→,y2),...,(xn→,yn)}

  • 划分数据集 
    这里写图片描述
  • 第一层模型训练 
    这里写图片描述
    为了防止过拟合,第一层采用k折验证得到第二层的输入,上图所示是五折交叉验证生成新的特征的过程,将训练集分成5份,每次选取其中4份使用模型M1进行学习,训练出的模型对另外1份进行预测得到predictipredicti,同时用改模型对测试集进行预测,其结果为 y1i^y1i^。进行五次训练之后,将五次得到的predictipredicti组成完整的对训练集的预测结果,记为P1→P1→,对五次获得的测试集预测结果取平均得到新的测试集预测结果,记为T1→=15∑5i=1y1i^T1→=15∑i=15y1i^ 
    以此类推,对模型M2,模型M3使用同样的方法生成新的训练特征和测试特征P2→P2→,T2→T2→;P3→P3→,T3→T3→
  • 生成新的训练集和测试集

    将P1→P1→,P2→P2→,P3→P3→以及T1→T1→,T2→T2→,T3→T3→合并,得到新的训练集和测试集 
    P1→P1→,P2→P2→,P3→P3→ —>(P1→P1→,P2→P2→,P3→P3→), 
    T1→T1→,T2→T2→,T3→T3→ —>(T1→T1→,T2→T2→,T3→T3→)

  • 第二层模型训练

    使用第二层的模型M4对新的训练集进行学习,得到的模型对测试集进行预测,从而可以验证结果的准确性。

2. 代码实现

2.1 朴素代码

import numpy as np
from sklearn.model_selection import KFold
ntrain = train.shape[0]
ntest = test.shape[0]
kf = KFold(n_splits=5, random_state=2017)
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((5,ntest))
    for i, (train_index, test_index) in enumerate(kf.split(x_train)):
        kf_x_train = x_train[train_index]
        kf_y_train = y_train[train_index]
        kf_x_test = x_train[test_index]
        clf.train(kf_x_train, kf_y_train)
        oof_train[test_index] = clf.predict(kf_x_test)
        oof_test_skf[i,:] = clf.predict(x_test)
    oof_test[:] = oof_test_skf.mean(axis=0)
    return oof_train.reshape(-1,1),oof_test.reshape(-1,1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.2 使用mlxtend库

from sklearn import datasets
iris = datasets.load_iris()
X,y = iris.data[:,1:3],iris.target
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import StackingClassifier


clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = GaussianNB()
lr = LogisticRegression()
sclf = StackingClassifier(classifiers=[clf1,clf2,clf3],meta_classifier=lr)
print('3-fold cross validation: \n')
for clf, label in zip([clf1,clf2,clf3,sclf],
                ['knn','random forest','naive bayes','stacking classifier']):
    scores = model_selection.cross_val_score(clf, X, y, cv=3,scoring='accuracy')
    print("Accuracy: %0.2f (+/- %0.2f) [%s]" %(scores.mean(),scores.std(), label)) 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值