ensemble 和 stacking

集成学习

Ensemble learning 中文名叫做集成学习,它并不是一个单独的机器学习算法,而是将很多的机器学习算法结合在一起,我们把组成集成学习的算法叫做“个体学习器”。在集成学习器当中,个体学习器都相同,那么这些个体学习器可以叫做“基学习器”。

个体学习器组合在一起形成的集成学习,常常能够使得泛化性能提高,这对于“弱学习器”的提高尤为明显。弱学习器指的是比随机猜想要好一些的学习器。

在进行集成学习的时候,我们希望我们的基学习器应该是好而不同,这个思想在后面经常体现。 “好”就是说,你的基学习器不能太差,“不同”就是各个学习器尽量有差异。

集成学习有两个分类,一个是个体学习器存在强依赖关系、必须串行生成的序列化方法,以Boosting为代表。另外一种是个体学习器不存在强依赖关系、可同时生成的并行化方法,以Bagging和随机森林(Random Forest)为代表。

Bagging和随机森林

Bagging使用自助采样的方法(在使用sklearn进行交叉验证一文最后有介绍)来获得个体学习器的训练集,通过把训练好的个体学习器用适当的结合策略结合在一起得到我们的输出结果。

随机森立和Bagging很像,但是它的个体学习器是决策树。它在上面做了一些改进,为了使得个体学习器不同,在决策树算法选择划分属性的时候运用一定的策略进行随机选择,这样就做到了各个学习器不相同。

结合策略和Stacking

将个体学习器结合在一起的时候使用的方法叫做结合策略。

对于连续的值使用平均法,对于分类值使用投票法。

还有一种结合策略是使用另外一个机器学习算法来将个体机器学习器的结果结合在一起,这个方法就是Stacking。

在stacking方法中,我们把个体学习器叫做初级学习器,用于结合的学习器叫做次级学习器或元学习器(meta-learner)。

我们贴一张周志华老师《机器学习》一张图来说一下stacking学习算法。

过程1-3 是训练出来个体学习器,也就是初级学习器

过程5-9是 使用训练出来的个体学习器来得预测的结果,这个预测的结果当做次级学习器的训练集

过程11 是用初级学习器预测的结果训练出次级学习器,得到我们最后训练的模型。

这个算法还可以有别的情况,那就是过程4,我们其实不用从一个空集开始构造次级训练集,我们可以把预测出来的结果当做一个特征,追加到我们的数据集当中。

Stacking的实现

方法一:

最先想到的方法是这样的,用数据集D来训练h1,h2,h3...,然后再用这些训练出来的初级学习器在数据集D上面进行预测得到次级训练集。 这样的想法是不行的,因为这样容易过拟合。用原始数据训练出来的模型再来预测原始数据,模型的预测情况肯定是非常不错的,但是在新数据上表现并不一定好。

方法二:

我们使用k折交叉验证的方法来得到次级训练集。将数据D分为k等份:D1,D2,D3....Dk

for j = 1,2,...k:  ,我们取数据集 D\Dj 作为训练集来训练模型h1,h2,h3...,然后让模型h1,h2,h3...预测Dj的值,并将这个值保存下来,最后所有保存下来值组成了。

def get_stacking(clf, x_train, y_train):

    result_set = np.zeros(x_train.shape[0])
    kf = KFold(n_splits=10)
    for train_index, test_index in kf.split(x_train):
        clf.fit(x_train[train_index], y_train[train_index])
        result_set[test_index] = clf.predict(x_train[test_index])
    return result_set

但是看了别人写的关于stacking的文章以后,发现了一个误区,那就是我们预测了训练集的数据。对于测试集的数据(没有标签的测试数据,而不是将数据集划分出来的训练集和测试集的测试数据)我们也应该处理,否则到了第二层模型训练和预测的时候,训练集和测试数据的特征会不一样。

所以,改进代码如下:

def get_stacking(clf, x_train, y_train, x_test, n_fold=10):

    result_set = np.zeros(x_train.shape[0])
    nfold_y_test = np.zeros((x_test.shape[0], n_fold))
    y_set = np.zeros(x_test.shape[0])

    kf = KFold(n_splits=n_fold)

    for i ,(train_index, test_index) in enumerate(kf.split(x_train)):
        clf.fit(x_train[train_index], y_train[train_index])
        result_set[test_index] = clf.predict(x_train[test_index])
        nfold_y_test[:, i] = clf.predict(x_test)
    y_test = nfold_y_test.mean(axis=1)
    return result_set, y_test

参考

stacking 的基本思想及代码实现

Introduction to Ensembling/Stacking in Python

A Kaggler‘s Guide to Model Stacking in Practice

原文地址:https://www.cnblogs.com/jiaxin359/p/8559029.html

时间: 2024-10-11 20:16:46

ensemble 和 stacking的相关文章

如何在 Kaggle 首战中进入前 10%

转载一篇文章 如何在 Kaggle 首战中进入前 10% Posted on 2016-04-29   |   In Data Science  | Introduction 本文采用署名 - 非商业性使用 - 禁止演绎 3.0 中国大陆许可协议进行许可.著作权由章凌豪所有. Kaggle 是目前最大的 Data Scientist 聚集地.很多公司会拿出自家的数据并提供奖金,在 Kaggle 上组织数据竞赛.我最近完成了第一次比赛,在 2125 个参赛队伍中排名第 98 位(~ 5%).因为是

7. 集成学习(Ensemble Learning)Stacking

1. 集成学习(Ensemble Learning)原理 2. 集成学习(Ensemble Learning)Bagging 3. 集成学习(Ensemble Learning)随机森林(Random Forest) 4. 集成学习(Ensemble Learning)Adaboost 5. 集成学习(Ensemble Learning)GBDT 6. 集成学习(Ensemble Learning)算法比较 7. 集成学习(Ensemble Learning)Stacking 1. 前言 到现在

Ensemble_learning 集成学习算法 stacking 算法

原文:https://herbertmj.wikispaces.com/stacking%E7%AE%97%E6%B3%95 stacked 产生方法是一种截然不同的组合多个模型的方法,它讲的是组合学习器的概念,但是使用的相对于bagging和boosting较少,它不像bagging和boosting,而是组合不同的模型,具体的过程如下:1.划分训练数据集为两个不相交的集合.2. 在第一个集合上训练多个学习器.3. 在第二个集合上测试这几个学习器4. 把第三步得到的预测结果作为输入,把正确的回

5 Easy questions on Ensemble Modeling everyone should know

5 Easy questions on Ensemble Modeling everyone should know Introduction If you’ve ever participated in a data science competitions, you must be aware of the pivotal role that ensemble modeling plays. In fact, it is being said that ensemble modeling o

Basics of Ensemble Learning Explained in Simple English

Basics of Ensemble Learning Explained in Simple English Introduction Ensemble modeling is a powerful way to improve performance of your model. It usually pays off to apply ensemble learning over and above various models you might be building. Time an

Ensemble learning(集成学习)

定义 集成学习是一种机器学习范式,其中多个学习器被训练来解决相同的问题. 这与试图从训练数据中学习一个假设的普通机器学习方法相反,集成方法尝试构造一组假设并将它们结合使用. 一个集合包含一些通常被称为基础学习器的学习器. 一个集合的泛化能力通常比单个基础学习器的泛化能力强得多. 实际上,集成学习具有极大吸引力,因为它可以将弱于随机猜测的弱学习器提升为能够做出非常准确预测的强大学习器. 所以,"基础学习器"也被称为"弱学习器". 然而,值得注意的是,尽管大多数理论分析

机器学习——集成学习之Stacking

摘自: https://zhuanlan.zhihu.com/p/27689464 Stacking方法是指训练一个模型用于组合其他各个模型.首先我们先训练多个不同的模型,然后把之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出.理论上,Stacking可以表示上面提到的两种Ensemble方法,只要我们采用合适的模型组合策略即可.但在实际中,我们通常使用logistic回归作为组合策略. 如下图,先在整个训练数据集上通过bootstrap抽样得到各个训练集合,得到一系列分类模型

Dream team: Stacking for combining classifiers梦之队:组合分类器

 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share 将训练好的所有基模型对整个训练集进行预测,第j个基模型对第i个训练样本的预测值将作为新的训练集中第i个样本的第j个特征值,最后基于新的训练集进行训练.同理,预测的过程也要

Bagging,Boosting,Stacking

本文主要总结Bagging 和 Boosting 和 Stacking思想的异同点.这三种算法都可以称作为"meta-algorithms",就是将多个机器学习方法集成到一个模型里面去降低方差,偏差,或者改善模型预测能力.通常bagging可以降低variance,boosting可以降低bias,stacking可以改善模型预测能力. 这三种算法都包含以下两个步骤: 在原始数据的子集样例上产生一个简单的ML模型分布. 将这个分布的模型集成到一个模型当中. 在多分类问题当中,常用到两大