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. python tcp 实时抓包

    问题:之前我们系统上线后,因为是旧的系统,没有加统计的功能,比如用户喜欢那个页面,是哪些用户再访问,接口的负载能力等等. 解决办法:1,现有代码更改,添加功能.现有代码侵入太多,工作量比较大 2,想到 ...

  2. SSH 证书登录(实例详解)

    SSH 证书登录(实例详解) 客户端通过私钥登录 ssh 服务器 CentOS 7 SSH 使用证书登录 使用私钥 ssh 登陆 CentOS

  3. 北大 ACM 分类 汇总

    1.搜索 //回溯 2.DP(动态规划) 3.贪心 北大ACM题分类2009-01-27 1 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同 ...

  4. Java -verbose[:class|gc|jni] 转 ----JAVA源码分析

    http://blog.csdn.net/tenderhearted/article/details/39642275 http://www.cnblogs.com/iceAeterNa/p/4876 ...

  5. Revit API单位转换类

    用法:txt.Text=UnitConvertC.CovertFromAPI(param.AsDouble());param.Set(UnitConvertC.CovertToAPI(txt.Text ...

  6. 报错:TargetException, 非静态方法需要一个目标

    如果实例为null,调用实例方法会报如上错. 解决办法: 检查实例是否为null,考虑什么情况下实例为null,然后排除实例为null的情况.

  7. 在ASP.NET MVC中使用jQuery的Load方法加载静态页面的一个注意点

    使用使用jQuery的Load方法可以加载静态页面,本篇就在ASP.NET MVC下实现. Model先行: public class Article { public int Id { get; s ...

  8. 安装/使用 MVVMLight(转)

    安装 MVVMLight Toolkit 为什么说是 MVVMLight Toolkit ?实际上我们一般安装的都是 MVVMLight Toolkit ,这个里面包含了工具就是在VS新建工程的时候你 ...

  9. git合并的时候,冲突问题Merging is not possible because you have unmerged files

    在做项目工作的时候,同事修改了代码一个cpp代码,我同样也修改了代码,两人代码冲突了,提交之后,他代码git自动合并,并提示: [master| MERGEING]$ git merge my_new ...

  10. JDK配置 linux

    在启动终端并输入 gedit /etc/profile 在末尾添加一下配置,保存并退出 #set jdk environment export JAVA_HOME=/usr/lib/jvm/jdk1. ...