深度学习模型融合stacking
当你的深度学习模型变得很多时,选一个确定的模型也是一个头痛的问题。或者你可以把他们都用起来,就进行模型融合。我主要使用stacking和blend方法。先把代码贴出来,大家可以看一下。
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- from sklearn.metrics import roc_curve
- SEED = 222
- np.random.seed(SEED)
- from sklearn.model_selection import train_test_split
- from sklearn.metrics import roc_auc_score
- from sklearn.svm import SVC,LinearSVC
- from sklearn.naive_bayes import GaussianNB
- from sklearn.ensemble import RandomForestClassifier,GradientBoostingClassifier
- from sklearn.linear_model import LogisticRegression
- from sklearn.neighbors import KNeighborsClassifier
- from sklearn.neural_network import MLPClassifier
- df = pd.read_csv('input.csv')
- def get_train_test(): # 数据处理
- y = 1 * (df.cand_pty_affiliation == "REP")
- x = df.drop(['cand_pty_affiliation'],axis=1)
- x = pd.get_dummies(x,sparse=True)
- x.drop(x.columns[x.std()==0],axis=1,inplace=True)
- return train_test_split(x,y,test_size=0.95,random_state=SEED)
- def get_models(): # 模型定义
- nb = GaussianNB()
- svc = SVC(C=100,probability=True)
- knn = KNeighborsClassifier(n_neighbors=3)
- lr = LogisticRegression(C=100,random_state=SEED)
- nn = MLPClassifier((80, 10), early_stopping=False, random_state=SEED)
- gb = GradientBoostingClassifier(n_estimators =100, random_state = SEED)
- rf = RandomForestClassifier(n_estimators=1,max_depth=3,random_state=SEED)
- models = {'svm':svc,
- 'knn':knn,
- 'naive bayes':nb,
- 'mlp-nn':nn,
- 'random forest':rf,
- 'gbm':gb,
- 'logistic':lr,
- }
- return models
- def train_base_learnres(base_learners,inp,out,verbose=True): # 训练基本模型
- if verbose:print("fitting models.")
- for i,(name,m) in enumerate(base_learners.items()):
- if verbose:print("%s..." % name,end=" ",flush=False)
- m.fit(inp,out)
- if verbose:print("done")
- def predict_base_learners(pred_base_learners,inp,verbose=True): # 把基本学习器的输出作为融合学习的特征,这里计算特征
- p = np.zeros((inp.shape[0],len(pred_base_learners)))
- if verbose:print("Generating base learner predictions.")
- for i,(name,m) in enumerate(pred_base_learners.items()):
- if verbose:print("%s..." % name,end=" ",flush=False)
- p_ = m.predict_proba(inp)
- p[:,i] = p_[:,1]
- if verbose:print("done")
- return p
- def ensemble_predict(base_learners,meta_learner,inp,verbose=True): # 融合学习进行预测
- p_pred = predict_base_learners(base_learners,inp,verbose=verbose) # 测试数据必须先经过基本学习器计算特征
- return p_pred,meta_learner.predict_proba(p_pred)[:,1]
- def ensenmble_by_blend(): # blend融合
- xtrain_base, xpred_base, ytrain_base, ypred_base = train_test_split(
- xtrain, ytrain, test_size=0.5, random_state=SEED
- ) # 把数据切分成两部分
- train_base_learnres(base_learners, xtrain_base, ytrain_base) # 训练基本模型
- p_base = predict_base_learners(base_learners, xpred_base) # 把基本学习器的输出作为融合学习的特征,这里计算特征
- meta_learner.fit(p_base, ypred_base) # 融合学习器的训练
- p_pred, p = ensemble_predict(base_learners, meta_learner, xtest) # 融合学习进行预测
- print("\nEnsemble ROC-AUC score: %.3f" % roc_auc_score(ytest, p))
- from sklearn.base import clone
- def stacking(base_learners,meta_learner,X,y,generator): # stacking进行融合
- print("Fitting final base learners...",end="")
- train_base_learnres(base_learners,X,y,verbose=False)
- print("done")
- print("Generating cross-validated predictions...")
- cv_preds,cv_y = [],[]
- for i,(train_inx,test_idx) in enumerate(generator.split(X)):
- fold_xtrain,fold_ytrain = X[train_inx,:],y[train_inx]
- fold_xtest,fold_ytest = X[test_idx,:],y[test_idx]
- fold_base_learners = {name:clone(model)
- for name,model in base_learners.items()}
- train_base_learnres(fold_base_learners,fold_xtrain,fold_ytrain,verbose=False)
- fold_P_base = predict_base_learners(fold_base_learners,fold_xtest,verbose=False)
- cv_preds.append(fold_P_base)
- cv_y.append(fold_ytest)
- print("Fold %i done" %(i+1))
- print("CV-predictions done")
- cv_preds = np.vstack(cv_preds)
- cv_y = np.hstack(cv_y)
- print("Fitting meta learner...",end="")
- meta_learner.fit(cv_preds,cv_y)
- print("done")
- return base_learners,meta_learner
- def ensemble_by_stack():
- from sklearn.model_selection import KFold
- cv_base_learners,cv_meta_learner = stacking(
- get_models(),clone(meta_learner),xtrain.values,ytrain.values,KFold(2))
- P_pred,p = ensemble_predict(cv_base_learners,cv_meta_learner,xtest,verbose=False)
- print("\nEnsemble ROC-AUC score: %.3f" %roc_auc_score(ytest,p))
- def plot_roc_curve(ytest,p_base_learners,p_ensemble,labels,ens_label):
- plt.figure(figsize=(10,8))
- plt.plot([0,1],[0,1],'k--')
- cm = [plt.cm.rainbow(i)
- for i in np.linspace(0,1.0, p_base_learners.shape[1] +1)]
- for i in range(p_base_learners.shape[1]):
- p = p_base_learners[:,i]
- fpr,tpr,_ = roc_curve(ytest,p)
- plt.plot(fpr,tpr,label = labels[i],c=cm[i+1])
- fpr, tpr, _ = roc_curve(ytest, p_ensemble)
- plt.plot(fpr, tpr, label=ens_label, c=cm[0])
- plt.xlabel('False positive rate')
- plt.ylabel('True positive rate')
- plt.title('ROC curve')
- plt.legend(frameon=False)
- plt.show()
- from mlens.ensemble import SuperLearner
- def use_pack():
- sl =SuperLearner(
- folds=10,random_state=SEED,verbose=2,
- # backend="multiprocessing"
- )
- # Add the base learners and the meta learner
- sl.add(list(base_learners.values()),proba=True)
- sl.add_meta(meta_learner,proba=True)
- # Train the ensemble
- sl.fit(xtrain,ytrain)
- # Predict the test set
- p_sl=sl.predict_proba(xtest)
- print("\nSuper Learner ROC-AUC score: %.3f" % roc_auc_score(ytest,p_sl[:,1]))
- if __name__ == "__main__":
- xtrain, xtest, ytrain, ytest = get_train_test()
- base_learners = get_models()
- meta_learner = GradientBoostingClassifier(
- n_estimators=1000,
- loss="exponential",
- max_depth=4,
- subsample=0.5,
- learning_rate=0.005,
- random_state=SEED
- )
- # ensenmble_by_blend() # blend进行融合
- # ensemble_by_stack() # stack进行融合
- use_pack() # 调用包进行融合
深度学习模型融合stacking的更多相关文章
- 深度学习模型stacking模型融合python代码,看了你就会使
话不多说,直接上代码 def stacking_first(train, train_y, test): savepath = './stack_op{}_dt{}_tfidf{}/'.format( ...
- CUDA上深度学习模型量化的自动化优化
CUDA上深度学习模型量化的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参数 ...
- CUDA上的量化深度学习模型的自动化优化
CUDA上的量化深度学习模型的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参 ...
- AI佳作解读系列(一)——深度学习模型训练痛点及解决方法
1 模型训练基本步骤 进入了AI领域,学习了手写字识别等几个demo后,就会发现深度学习模型训练是十分关键和有挑战性的.选定了网络结构后,深度学习训练过程基本大同小异,一般分为如下几个步骤 定义算法公 ...
- 『高性能模型』Roofline Model与深度学习模型的性能分析
转载自知乎:Roofline Model与深度学习模型的性能分析 在真实世界中,任何模型(例如 VGG / MobileNet 等)都必须依赖于具体的计算平台(例如CPU / GPU / ASIC 等 ...
- 利用 TFLearn 快速搭建经典深度学习模型
利用 TFLearn 快速搭建经典深度学习模型 使用 TensorFlow 一个最大的好处是可以用各种运算符(Ops)灵活构建计算图,同时可以支持自定义运算符(见本公众号早期文章<Tenso ...
- Roofline Model与深度学习模型的性能分析
原文链接: https://zhuanlan.zhihu.com/p/34204282 最近在不同的计算平台上验证几种经典深度学习模型的训练和预测性能时,经常遇到模型的实际测试性能表现和自己计算出的复 ...
- 在NLP中深度学习模型何时需要树形结构?
在NLP中深度学习模型何时需要树形结构? 前段时间阅读了Jiwei Li等人[1]在EMNLP2015上发表的论文<When Are Tree Structures Necessary for ...
- PyTorch如何构建深度学习模型?
简介 每过一段时间,就会有一个深度学习库被开发,这些深度学习库往往可以改变深度学习领域的景观.Pytorch就是这样一个库. 在过去的一段时间里,我研究了Pytorch,我惊叹于它的操作简易.Pyto ...
随机推荐
- [转]ssh和SSH服务(包含隧道内容)
本文对SSH连接验证机制进行了非常详细的分析,还详细介绍了ssh客户端工具的各种功能,相信能让各位对ssh有个全方位较透彻的了解,而不是仅仅只会用它来连接远程主机. 另外,本人翻译了ssh客户端命令的 ...
- Nginx 配置TCP代理
Nginx 1.9 版本以后增加了stream模块,可以对tcp,udp请求进行代理和负载均衡了,今天来体验一下首先编译安装过程configure的时候增加选项 --with-stream --wit ...
- [Android实例] Activity实例StartActivity出现NullPointer异常
[Android实例] Activity实例StartActivity出现NullPointer异常 [android实例教程] 在Android低版本(如2.3.3)中出现如下“界面跳转”的错误: ...
- Android查询不到电话号码解决方法
貌似联系人有三个数据库,且不同步,另外也有可能是版本问题. 解决方案:https://github.com/codinguser/android_contact_picker 接下来会对其进行一些改造 ...
- Git关于pull,commit,push的总结
以前总是由于自己的自身的原因,对于每一次的git的操作,我都是通过eclipse或者是idea来进行的,但是 我每一次都不是很清楚的关于这些方面的操作,现在我们来进行关于git bash的操作,正是由 ...
- anaconda的kernel对jupyter可见
在anaconda的kernel下,安装nb_conda_kernels conda install nb_conda_kernels 参考这篇博客
- C#学习笔记(31)——委托窗体传值
说明(2017-11-23 19:31:53): 1. 关于委托和窗体传值,一下午在网上查阅了大量资料,基本就是CSDN的论坛和博客园的文章,大家都在举例子,烧水.鸿门宴,看评论说还看到过沙漠足球的, ...
- python学习笔记(23)——python压缩bin包
说明(2017-12-25 10:43:20): 1. CZ写的压缩bin包代码,记下来以后好抄. # coding:utf-8 ''' Created on 2014年8月14日 @author: ...
- EXP-00056: ORACLE error 12154 encountered
今天用EXP命令导Oracle数据库,出现如下错误信息: [oracle@yingxiang-testServer1 ~]$ exp imgpf/imgpf@orcl file=/prlife/db/ ...
- Error: parent directory is world writable but not sticky
在本地安装pyenv的时候,出现了如下的报错: ➜ brew install pyenv ==> Downloading https://github.com/yyuu/pyenv/archiv ...