1.Stacking是什么?
Stacking简单理解就是讲几个简单的模型,一般采用将它们进行K折交叉验证输出预测结果,然后将每个模型输出的预测结果合并为新的特征,并使用新的模型加以训练。

Stacking模型本质上是一种分层的结构,这里简单起见,只分析二级Stacking.假设我们有3个基模型M1、M2、M3。

基模型M1,对训练集train训练,然后用于预测train和test的标签列,分别是P1,T1

2.Stacking的好处在哪里?

做大数据的比赛的一般是是使用单一模型进行预测,或者是多个模型进行比较,选出最合适的模型,我们所做的交叉验证主要是多个模型的加权平均。我们使用单个模型进行交叉验证,一般是使用K-fold交叉验证,来降低模型的过拟合风险,提高模型的准确度。

from sklearn.model_selection import KFold
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits
import numpy as np
from sklearn.svm import SVC
from sklearn import metrics
from sklearn.ensemble import RandomForestClassifier
from sklearn import preprocessing
import pandas as pd# 导入数据集切割训练与测试数据data = load_digits()
data_D = preprocessing.StandardScaler().fit_transform(data.data)
data_L = data.target
data_train, data_test, label_train, label_test = train_test_split(data_D,data_L,random_state=1,test_size=0.7)def SelectModel(modelname):if modelname == "SVM":from sklearn.svm import SVCmodel = SVC(kernel='rbf', C=16, gamma=0.125,probability=True)elif modelname == "GBDT":from sklearn.ensemble import GradientBoostingClassifiermodel = GradientBoostingClassifier()elif modelname == "RF":from sklearn.ensemble import RandomForestClassifiermodel = RandomForestClassifier()elif modelname == "XGBOOST":import xgboost as xgbmodel = xgb()elif modelname == "KNN":from sklearn.neighbors import KNeighborsClassifier as knnmodel = knn()else:passreturn modeldef get_oof(clf,n_folds,X_train,y_train,X_test):ntrain = X_train.shape[0]ntest =  X_test.shape[0]classnum = len(np.unique(y_train))kf = KFold(n_splits=n_folds,random_state=1)oof_train = np.zeros((ntrain,classnum))oof_test = np.zeros((ntest,classnum))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]  # k-fold的验证集clf.fit(kf_X_train, kf_y_train)oof_train[test_index] = clf.predict_proba(kf_X_test)oof_test += clf.predict_proba(X_test)oof_test = oof_test/float(n_folds)return oof_train, oof_test# 单纯使用一个分类器的时候
clf_second = RandomForestClassifier()
clf_second.fit(data_train, label_train)
pred = clf_second.predict(data_test)
accuracy = metrics.accuracy_score(label_test, pred)*100
print accuracy
# 91.0969793323# 使用stacking方法的时候
# 第一级,重构特征当做第二级的训练集
modelist = ['SVM','GBDT','RF','KNN']
newfeature_list = []
newtestdata_list = []
for modelname in modelist:clf_first = SelectModel(modelname)oof_train_ ,oof_test_= get_oof(clf=clf_first,n_folds=10,X_train=data_train,y_train=label_train,X_test=data_test)newfeature_list.append(oof_train_)newtestdata_list.append(oof_test_)# 特征组合
newfeature = reduce(lambda x,y:np.concatenate((x,y),axis=1),newfeature_list)
newtestdata = reduce(lambda x,y:np.concatenate((x,y),axis=1),newtestdata_list)# 第二级,使用上一级输出的当做训练集
clf_second1 = RandomForestClassifier()
clf_second1.fit(newfeature, label_train)
pred = clf_second1.predict(newtestdata)
accuracy = metrics.accuracy_score(label_test, pred)*100
print accuracy
# 96.4228934817
  1. 这里只是使用了两层的stacking,完成了一个基本的stacking操作,也可以同理构建三层,四层等等
  2. 对于第二级的输入来说,特征进行了变化(有一级分类器构成的判决作为新特征),所以相应的测试集也需要进行同样的转换,毕竟分类器学习的训练集已经不一样了,学习的内容肯定是无法适用于旧的测试集的,要清楚的是,当初我们是对整个Data集合随机分测试集和训练集的!
  3. 适用k-fold的方法,实质上使用了cv的思想,所以数据并没有泄露(没有用到测试集,用的是训练集中的hold-set),所以这个方法也叫做out-of-folds

stacking的详细代码教程相关推荐

  1. pytorch 复现 FCN模型详细代码教程

  2. VS2019配置opencv详细图文教程和测试代码

    摘要: vs2019新鲜出炉,配置opencv又有哪些不一样呢,这个教程将会一步一步的教你如何配置opencv和跑动opencv一个简单的项目. 测试代码请在原文找到,转发备注原文链接:https:/ ...

  3. opencv有基于c语言的教程吗_VS2019配置opencv详细图文教程和测试代码的实现

    摘要: vs2019新鲜出炉,配置opencv又有哪些不一样呢,这个教程将会一步一步的教你如何配置opencv和跑动opencv一个简单的项目. 环境: 系统:win10系统截至20190523版本 ...

  4. 开源超级微同城系统源码 含完整程序代码包+数据库+详细搭建教程

    分享一个超级微同城系统源码,含完整程序代码包+数据库+详细搭建教程,源码开源可二开,功能基于微信公众号,做本地生活信息必备. 系统特色功能一览: 1.整合本地信息商家服务等资源,为本地用户提供多样化的 ...

  5. python初学者代码示例_python入门(非常详细的教程)

    对于初学者而言,您要做的只是专注于Python语言,阐明学习重点,掌握学习节奏,并逐步学习.根据我多年的学习和工作经验,编程语言的学习分为以下三个步骤,无论您是否具有编程基础,都可以通过比较来完成. ...

  6. python灰度图生成g代码_artcam pro 通过灰度图生成G代码详细图文教程

    本文是使用artcam pro 把灰度图转成G代码,看到喜欢的雕刻,可以自己先做成灰度图,然后转换成G代码,今天特地做了一个教程,仅供刚刚接触者使用! 新手可以看看,老手请高抬贵手,不要嘲笑.自己技术 ...

  7. 单片机c语言全程图文教程,单片机C语言,从小白到菜鸟进阶教程(超详细代码解读)...

    首先要认识单片机是啥?单片机语言是啥?单片机是一种可存储可读写可编程可运行的芯片,你写啥它就运行啥,运行出错,那你程序写错了.单片机语言,嗯!确定要学C啊!有哪一种语言能够抗衡C的强大地位?没有!哪一 ...

  8. 如何用Neo4j和Scikit-Learn做机器学习任务?| 附超详细分步教程

    作者 | Mark Needham 译者 | Tianyu.Shawnice 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 图算法不是一个新兴技术领域,在开源库中已经有很多 ...

  9. python详细教程-python入门(非常详细的教程)

    对于初学者而言,您要做的只是专注于Python语言,阐明学习重点,掌握学习节奏,并逐步学习.根据我多年的学习和工作经验,编程语言的学习分为以下三个步骤,无论您是否具有编程基础,都可以通过比较来完成. ...

最新文章

  1. 图灵奖得主Judea Pearl :从“贝叶斯网络之父”到“AI社区的叛徒”
  2. Java线程池 源码分析
  3. 《算法竞赛入门经典》计算组合数问题
  4. “云+大数据”时代 中端存储如何选择
  5. 软件测试人员:如何优秀的提Bug?
  6. 用Visual Studio2019自定义项目模板
  7. 映射date类型_SQLALchemy常见数据类型
  8. w3school---JQuery HTML
  9. 152-Maximum Product Subarray
  10. windows 7中的windows键相关的快捷键
  11. 0 基础转行 Android 工程师是种怎样的体验?
  12. Mybatis-学习笔记(1)SqlSessionFactory、SqlSession、Mybatis配置文件configuration的属性标签...
  13. ttvnc 服务器 自建,FastVNC(可以自架中心服务端的远程协助工具)
  14. 超脑计划孵出的阿尔法蛋 拥有什么超能力?
  15. 使用C# .net开发微信公众号之设置所属行业
  16. uniapp离线打包
  17. 基本面分析中必须了解的88条避雷常识
  18. 西门子1200plc485轮询读写28个测试仪表,包括plc程序和触摸屏程序
  19. 【平头哥】手动CKLink驱动安装/更新
  20. android 应用程序内存上限,Android APP的最大可用内存

热门文章

  1. java数组中获取长度通过调用_数组的长度如何获取?
  2. html3d扇形菜单,扇形菜单特效
  3. HTTP报文格式详细讲解
  4. oracle序列归一,Oracle系统架构
  5. Excel如何把一行文字的内容分为多行
  6. 中断处理与特权级转移
  7. python标准库math中用来实现上取整_python中取整
  8. 乡下,已经不是衣锦还乡的去处了(转载)
  9. 图解一致性哈希算法的基本原理
  10. 骨传导运动耳机怎么样、运动耳机推荐骨传导