http://blog.csdn.net/willduan1/article/details/73618677

集成学习主要分为 bagging, boosting 和 stacking方法。本文主要是介绍stacking方法及其应用。但是在总结之前还是先回顾一下继承学习。

这部分主要转自知乎

1. Bagging方法:

给定一个大小为n的训练集 D,Bagging算法从中均匀、有放回地选出 m个大小为 n' 的子集Di,作为新的训练集。在这 m个训练集上使用分类、回归等算法,则可得到 m个模型,再通过取平均值、取多数票等方法综合产生预测结果,即可得到Bagging的结果。

(转自知乎)

2. Boosting 方法

加入的过程中,通常根据它们的上一轮的分类准确率给予不同的权重。加和弱学习者之后,数据通常会被重新加权,来强化对之前分类错误数据点的分类,其中一个经典的提升算法例子是AdaBoost。

(来自知乎)

3. Stacking 方法:

将训练好的所有基模型对整个训练集进行预测,第j个基模型对第i个训练样本的预测值将作为新的训练集中第i个样本的第j个特征值,最后基于新的训练集进行训练。同理,预测的过程也要先经过所有基模型的预测形成新的测试集,最后再对测试集进行预测:

下面我们介绍一款功能强大的stacking利器,mlxtend库,它可以很快地完成对sklearn模型地stacking。

主要有以下几种使用方法吧:

I. 最基本的使用方法,即使用前面分类器产生的特征输出作为最后总的meta-classifier的输入数据

  1. from sklearn import datasets
  2. iris = datasets.load_iris()
  3. X, y = iris.data[:, 1:3], iris.target
  4. from sklearn import model_selection
  5. from sklearn.linear_model import LogisticRegression
  6. from sklearn.neighbors import KNeighborsClassifier
  7. from sklearn.naive_bayes import GaussianNB
  8. from sklearn.ensemble import RandomForestClassifier
  9. from mlxtend.classifier import StackingClassifier
  10. import numpy as np
  11. clf1 = KNeighborsClassifier(n_neighbors=1)
  12. clf2 = RandomForestClassifier(random_state=1)
  13. clf3 = GaussianNB()
  14. lr = LogisticRegression()
  15. sclf = StackingClassifier(classifiers=[clf1, clf2, clf3],
  16. meta_classifier=lr)
  17. print('3-fold cross validation:\n')
  18. for clf, label in zip([clf1, clf2, clf3, sclf],
  19. ['KNN',
  20. 'Random Forest',
  21. 'Naive Bayes',
  22. 'StackingClassifier']):
  23. scores = model_selection.cross_val_score(clf, X, y,
  24. cv=3, scoring='accuracy')
  25. print("Accuracy: %0.2f (+/- %0.2f) [%s]"
  26. % (scores.mean(), scores.std(), label))

II. 另一种使用第一层基本分类器产生的类别概率值作为meta-classfier的输入,这种情况下需要将StackingClassifier的参数设置为 use_probas=True。如果将参数设置为 average_probas=True,那么这些基分类器对每一个类别产生的概率值会被平均,否则会拼接。

例如有两个基分类器产生的概率输出为:

classifier 1: [0.2, 0.5, 0.3]

classifier 2: [0.3, 0.4, 0.4]

1) average = True :

产生的meta-feature 为:[0.25, 0.45, 0.35]

2) average = False:

产生的meta-feature为:[0.2, 0.5, 0.3, 0.3, 0.4, 0.4]

  1. from sklearn import datasets
  2. iris = datasets.load_iris()
  3. X, y = iris.data[:, 1:3], iris.target
  4. from sklearn import model_selection
  5. from sklearn.linear_model import LogisticRegression
  6. from sklearn.neighbors import KNeighborsClassifier
  7. from sklearn.naive_bayes import GaussianNB
  8. from sklearn.ensemble import RandomForestClassifier
  9. from mlxtend.classifier import StackingClassifier
  10. import numpy as np
  11. clf1 = KNeighborsClassifier(n_neighbors=1)
  12. clf2 = RandomForestClassifier(random_state=1)
  13. clf3 = GaussianNB()
  14. lr = LogisticRegression()
  15. sclf = StackingClassifier(classifiers=[clf1, clf2, clf3],
  16. use_probas=True,
  17. average_probas=False,
  18. meta_classifier=lr)
  19. print('3-fold cross validation:\n')
  20. for clf, label in zip([clf1, clf2, clf3, sclf],
  21. ['KNN',
  22. 'Random Forest',
  23. 'Naive Bayes',
  24. 'StackingClassifier']):
  25. scores = model_selection.cross_val_score(clf, X, y,
  26. cv=3, scoring='accuracy')
  27. print("Accuracy: %0.2f (+/- %0.2f) [%s]"
  28. % (scores.mean(), scores.std(), label))

III. 另外一种方法是对训练基中的特征维度进行操作的,这次不是给每一个基分类器全部的特征,而是给不同的基分类器分不同的特征,即比如基分类器1训练前半部分特征,基分类器2训练后半部分特征(可以通过sklearn 的pipelines 实现)。最终通过StackingClassifier组合起来。

  1. from sklearn.datasets import load_iris
  2. from mlxtend.classifier import StackingClassifier
  3. from mlxtend.feature_selection import ColumnSelector
  4. from sklearn.pipeline import make_pipeline
  5. from sklearn.linear_model import LogisticRegression
  6. iris = load_iris()
  7. X = iris.data
  8. y = iris.target
  9. pipe1 = make_pipeline(ColumnSelector(cols=(0, 2)),
  10. LogisticRegression())
  11. pipe2 = make_pipeline(ColumnSelector(cols=(1, 2, 3)),
  12. LogisticRegression())
  13. sclf = StackingClassifier(classifiers=[pipe1, pipe2],
  14. meta_classifier=LogisticRegression())
  15. sclf.fit(X, y)

StackingClassifier 使用API及参数解析:

StackingClassifier(classifiers, meta_classifier, use_probas=False, average_probas=False, verbose=0, use_features_in_secondary=False)

参数:

classifiers : 基分类器,数组形式,[cl1, cl2, cl3]. 每个基分类器的属性被存储在类属性 self.clfs_.
meta_classifier : 目标分类器,即将前面分类器合起来的分类器
use_probas : bool (default: False) ,如果设置为True, 那么目标分类器的输入就是前面分类输出的类别概率值而不是类别标签
average_probas : bool (default: False),用来设置上一个参数当使用概率值输出的时候是否使用平均值。
verbose : int, optional (default=0)。用来控制使用过程中的日志输出,当 verbose = 0时,什么也不输出, verbose = 1,输出回归器的序号和名字。verbose = 2,输出详细的参数信息。verbose > 2, 自动将verbose设置为小于2的,verbose -2.
use_features_in_secondary : bool (default: False). 如果设置为True,那么最终的目标分类器就被基分类器产生的数据和最初的数据集同时训练。如果设置为False,最终的分类器只会使用基分类器产生的数据训练。

属性:
clfs_ : 每个基分类器的属性,list, shape 为 [n_classifiers]。
meta_clf_ : 最终目标分类器的属性

方法:

fit(X, y)
fit_transform(X, y=None, fit_params)
get_params(deep=True),如果是使用sklearn的GridSearch方法,那么返回分类器的各项参数。
predict(X)
predict_proba(X)
score(X, y, sample_weight=None), 对于给定数据集和给定label,返回评价accuracy
set_params(params),设置分类器的参数,params的设置方法和sklearn的格式一样

------------------------------------------EOF---------------------------------

参考文献:

https://zhihu.com/question/29036379/answer/111637662

https://rasbt.github.io/mlxtend/user_guide/classifier/StackingClassifier/

https://zh.wikipedia.org/zh-hans/Bagging%E7%AE%97%E6%B3%95

Wolpert, David H. "Stacked generalization." Neural networks 5.2 (1992): 241-259.

集成学习总结 & Stacking方法详解的更多相关文章

  1. Stacking方法详解

    集成学习方法主要分成三种:bagging,boosting 和 Stacking.这里主要介绍Stacking. stacking严格来说并不是一种算法,而是精美而又复杂的,对模型集成的一种策略. 首 ...

  2. 深入学习JavaScript: apply 方法 详解

    我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...

  3. 深入学习JavaScript: apply 方法 详解(转)——非常好

    主要我是要解决一下几个问题: 1.        apply和call的区别在哪里 2.        什么情况下用apply,什么情况下用call 3.        apply的其他巧妙用法(一般 ...

  4. ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解

    原文 ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解 在教程的这一部分,我们将研究一下自动生成的 Details 和Delete 方法. Details 方法 打开M ...

  5. Python学习之旅—生成器对象的send方法详解

    前言 在上一篇博客中,笔者带大家一起探讨了生成器与迭代器的本质原理和使用,本次博客将重点聚焦于生成器对象的send方法. 一.send方法详解  我们知道生成器对象本质上是一个迭代器.但是它比迭代器对 ...

  6. Asp.Net MVC学习总结之过滤器详解(转载)

    来源:http://www.php.cn/csharp-article-359736.html   一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的 ...

  7. CURL使用方法详解

    php采集神器CURL使用方法详解 作者:佚名  更新时间:2016-10-21   对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程 ...

  8. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

  9. Js apply 方法 详解

    Js apply方法详解 我在一开始看到JavaScript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

随机推荐

  1. Codeforces Round #370 (Div. 2) A. Memory and Crow 水题

    A. Memory and Crow 题目连接: http://codeforces.com/contest/712/problem/A Description There are n integer ...

  2. Redis "MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk"问题的解决(转)

    今天第二次遇到Redis “MISCONF Redis is configured to save RDB snapshots, but is currently not able to persis ...

  3. 使用GSON和泛型解析约定格式的JSON串(转)

    时间紧张,先记一笔,后续优化与完善. 解决的问题: 使用GSON和泛型解析约定格式的JSON串. 背景介绍: 1.使用GSON来进行JSON串与java代码的互相转换. 2.JSON的格式如下三种: ...

  4. SQLPrompt_7.2.2.273〖含注册机〗(支持低版本和最高版本SQL2016+VS2015)

    SQLPrompt_7.4.1.564[含注册机](支持低版本和最高版本SQL2016+VS2015) http://download.csdn.net/detail/wozengcong/97601 ...

  5. Unity3D实践系列06,球体撞击物体游戏

    本篇实现一个球体在固定区域移动撞击Cube的游戏. 首先有1个Plane当作地面,1个Sphere当作球体,4个Cube当作墙,12个Cube当作被撞击物体,另外还有球体的撞击计算,在撞击的过程适时显 ...

  6. 什么时候用var关键字

    C#关键字是伴随这.NET 3.5以后,伴随着匿名函数.LINQ而来, 由编译器帮我们推断具体的类型.总体来说,当一个变量是局部变量(不包括类级别的变量),并且在声明的时候初始化,是使用var关键字的 ...

  7. How To Create A Local Repository For SUSE Linux

    原文地址:http://candon123.blog.51cto.com/704299/1009294/ As you know,you can use the yum command to inst ...

  8. log4j deadlock

    用了这么久的Log4j这次倒下了,而且官方也还没有给出解决方案. 描述:tomcat 经过一天多时间的访问,出现了hang ,使用 Jstack 查看堆栈后,发现现成 blocked ,主要是 Log ...

  9. UIWebView 大全

    <html> <head> </head> <body> <img src = "http://t1.baidu.com/it/u=10 ...

  10. 教你调用数据库读取短信 记事本 通讯录文件,让ios5的短信恢复到ios4

    由于高版本的ios固件向下恢复到低版固件时无法通过itunes恢复备份,所以一些数据,比如SMS需要通过提取文件的方式单独进行备份恢复特别是ios5的短信,之前很是头痛,直接将文件恢复到指定目录修改权 ...