Stacking Learning在分类问题中的使用
来源:互联网 发布:云南山歌软件下载 编辑:程序博客网 时间:2024/06/06 07:32
- 建议先阅读以下文章
- 回归问题构建stacking模型
- 分类问题构建stacking模型
- code
- Pay Attention
- Further
- 致谢
建议先阅读以下文章
- 知乎(必读):Kaggle机器学习之模型融合(stacking)心得
- Blog:Stacking Models for Improved Predictions
- Blog:KAGGLE ENSEMBLING GUIDE(注脚)
- Blog:如何在 Kaggle 首战中进入前 10%
- Github:[ikki407](https://github.com/ikki407)/stacking
- Paper:M. Paz Sesmero, Agapito I. Ledezma, Araceli Sanchis, “Generating ensembles of heterogeneous classifiers using Stacked Generalization,” WIREs Data Mining and Knowledge Discovery 5: 21-34 (2015) paper下载地址 密码: c7rf
- 神作:Stacked Generalization (Stacking)
回归问题构建stacking模型
墙裂推荐阅读第一篇文章,读完之后还不懂,那就继续读,读懂为止,这是最入门的教程了,写的不错的,Titanic数据是回归的问题,最后的predict方法得到是幸存的概率,所以最后作者的代码可用
这里需要再次强调的是,对于回归问题的stacking learning的处理方案,是在一级模型进行out-of-fold预测产生的预测精度,这个当做第二级分类器的训练集。但是在分类问题时,就会产生问题,分类之后产生的类别的判断,所以代码最后进行取均值是不恰当的,难道会出现3.2这个类么?所以,这种方法是不适合用于分类的stacking
分类问题构建stacking模型
解决方案是,使用predict_proba方法,产出对各类别的判断概率,对于sklearn模型来说,实际上最后输出的判断类即如果使用predict方法,等效于numpy.argmax(predict_proba),也就是说,在分类器内部,它取了把握最大的概率所在的类作为输出,打个比方,svm对iris数据的三个类进行判断时候,predict_proba输出的为1类概率0.5,2类概率0.3,三类概率0.2,而predict方法则直接输出上述中最大概率所在的类,即1类作为结果。ok,这样的话,现在新的特征大小被扩充成 : 数据集所含类别数 X一级分类器个数,比如iris数据做分类,设定有四个一级分类器,而需要做的数据是有3类,则新的特征维度 为 3*4 = 12,每个分类器都贡献了3个维度.
code
# -*- coding:utf-8 -*-# Author:哈士奇说喵# 二级stacking learningfrom sklearn.model_selection import KFoldfrom sklearn.model_selection import train_test_splitfrom sklearn.datasets import load_digitsimport numpy as npfrom sklearn.svm import SVCfrom sklearn import metricsfrom sklearn.ensemble import RandomForestClassifierfrom sklearn import preprocessingimport pandas as pd# 导入数据集切割训练与测试数据data = load_digits()data_D = preprocessing.StandardScaler().fit_transform(data.data)data_L = data.targetdata_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 SVC model = SVC(kernel='rbf', C=16, gamma=0.125,probability=True) elif modelname == "GBDT": from sklearn.ensemble import GradientBoostingClassifier model = GradientBoostingClassifier() elif modelname == "RF": from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier() elif modelname == "XGBOOST": import xgboost as xgb model = xgb() elif modelname == "KNN": from sklearn.neighbors import KNeighborsClassifier as knn model = knn() else: pass return 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)*100print 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)*100print accuracy# 96.4228934817
Pay Attention
- 这里只是使用了两层的stacking,完成了一个基本的stacking操作,也可以同理构建三层,四层等等
- 对于第二级的输入来说,特征进行了变化(有一级分类器构成的判决作为新特征),所以相应的测试集也需要进行同样的转换,毕竟分类器学习的训练集已经不一样了,学习的内容肯定是无法适用于旧的测试集的,要清楚的是,当初我们是对整个Data集合随机分测试集和训练集的!
- 适用k-fold的方法,实质上使用了cv的思想,所以数据并没有泄露(没有用到测试集,用的是训练集中的hold-set),所以这个方法也叫做out-of-folds
Further
- 可以将之前的原始特征和之后新的特征进行融合,相当于特征扩充,然后注意标准化和归一化进行处理,毕竟一级的特征量纲和产出的后验概率组成的特征量纲不一样,自己做测试吧~
致谢
- Self-Trained Stacking Model for Semi-Supervised Learning
阅读全文
0 0
- Stacking Learning在分类问题中的使用
- Machine Learning技术在具体应用中的一些问题
- Deep Learning(深度学习)之(十)神经网络在机器学习分类任务中的应用
- 关于Net Learning分类中的后续文章
- Learning Python 之 Python中的对象分类
- deep learning 专项课程二 dropout在代码中的使用
- 基于deep learning的图像分类问题
- SVM多分类问题 libsvm在matlab中的应用
- SVM多分类问题 libsvm在matlab中的应用
- AAMI EC57标准在ECG信号分类中的使用
- 分类问题中的样本不均衡算法使用备忘录
- 使用sklearn中的神经网络模块MLPClassifier处理分类问题
- Cross Validation for Ensemble Learning(Stacking!!)
- Bagging, boosting and stacking in machine learning
- 【Machine Learning】模型融合之Stacking
- 分类任务中的基本问题
- Stacking 在机器学习中的应用,以kaggle titanic为例
- machine learning(4) --SVM 在opencv 中的使用及SVM与HOG联合
- 【死磕Java并发】-----深入分析ThreadLocal
- 中间位置裁剪固定大小图片+灰度化
- Socket编程
- 虽然微不足道但很是有用的JAVA基础—java是什么
- bzoj1485 [HNOI2009]有趣的数列(Catalan)
- Stacking Learning在分类问题中的使用
- Eclipse Neon 意外退出后,启动页卡在 org.eclipse.m2e.core
- 一个企业如果对未来有很强信心的话,他应该用债券不应该用股票,只有企业觉得下一步的前景暗淡的时候才会用股票
- 跳槽季:分享从事C#开发人员面试经验
- LintcodeO(1)时间检测2的幂次
- UVA11582 巨大的斐波那契数!
- Linux系统下-进程间通信(消息队列-详解)
- C语言算法6-15
- C语言基础知识学习(三)