stacking_stacking实现 - CSDN
stacking 订阅
Stacking原义是堆垛,现用于物流术语,表示商品堆码。商品堆码是指商品的堆放形式和方法,商品的合理堆码也是贮存中一项重要的技术工作。 展开全文
Stacking原义是堆垛,现用于物流术语,表示商品堆码。商品堆码是指商品的堆放形式和方法,商品的合理堆码也是贮存中一项重要的技术工作。
信息
外文名
Stacking
定    义
商品的堆放形式和方法
中文名
商品堆码
性    质
物流术语
Stacking原义
n.堆垛
收起全文
精华内容
参与话题
  • 集成学习总结 & Stacking方法详解

    万次阅读 多人点赞 2017-07-21 18:01:59
    集成学习主要分为 bagging, boosting 和 stacking方法。本文主要是介绍stacking方法及其应用。但是在总结之前还是先回顾一下继承学习。 这部分主要转自知乎。 1. Bagging方法:   给定一个大小为n的训练集 D,...

    集成学习主要分为 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的输入数据

     

    from sklearn import datasets
    
    iris = datasets.load_iris()
    X, y = iris.data[:, 1:3], iris.target
    
    from sklearn import model_selection
    from sklearn.linear_model import LogisticRegression
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.naive_bayes import GaussianNB 
    from sklearn.ensemble import RandomForestClassifier
    from mlxtend.classifier import StackingClassifier
    import numpy as np
    
    clf1 = KNeighborsClassifier(n_neighbors=1)
    clf2 = RandomForestClassifier(random_state=1)
    clf3 = GaussianNB()
    lr = LogisticRegression()
    sclf = StackingClassifier(classifiers=[clf1, clf2, clf3], 
                              meta_classifier=lr)
    
    print('3-fold cross validation:\n')
    
    for clf, label in zip([clf1, clf2, clf3, sclf], 
                          ['KNN', 
                           'Random Forest', 
                           'Naive Bayes',
                           'StackingClassifier']):
    
        scores = model_selection.cross_val_score(clf, X, y, 
                                                  cv=3, scoring='accuracy')
        print("Accuracy: %0.2f (+/- %0.2f) [%s]" 
              % (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]

     

    from sklearn import datasets
    
    iris = datasets.load_iris()
    X, y = iris.data[:, 1:3], iris.target
    
    from sklearn import model_selection
    from sklearn.linear_model import LogisticRegression
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.naive_bayes import GaussianNB 
    from sklearn.ensemble import RandomForestClassifier
    from mlxtend.classifier import StackingClassifier
    import numpy as np
    
    clf1 = KNeighborsClassifier(n_neighbors=1)
    clf2 = RandomForestClassifier(random_state=1)
    clf3 = GaussianNB()
    lr = LogisticRegression()
    sclf = StackingClassifier(classifiers=[clf1, clf2, clf3],
                              use_probas=True,
                              average_probas=False,
                              meta_classifier=lr)
    
    print('3-fold cross validation:\n')
    
    for clf, label in zip([clf1, clf2, clf3, sclf], 
                          ['KNN', 
                           'Random Forest', 
                           'Naive Bayes',
                           'StackingClassifier']):
    
        scores = model_selection.cross_val_score(clf, X, y, 
                                                  cv=3, scoring='accuracy')
        print("Accuracy: %0.2f (+/- %0.2f) [%s]" 
              % (scores.mean(), scores.std(), label))


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

     

     

    from sklearn.datasets import load_iris
    from mlxtend.classifier import StackingClassifier
    from mlxtend.feature_selection import ColumnSelector
    from sklearn.pipeline import make_pipeline
    from sklearn.linear_model import LogisticRegression
    
    iris = load_iris()
    X = iris.data
    y = iris.target
    
    pipe1 = make_pipeline(ColumnSelector(cols=(0, 2)),
                          LogisticRegression())
    pipe2 = make_pipeline(ColumnSelector(cols=(1, 2, 3)),
                          LogisticRegression())
    
    sclf = StackingClassifier(classifiers=[pipe1, pipe2], 
                              meta_classifier=LogisticRegression())
    
    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过程

    千次阅读 多人点赞 2019-03-25 19:34:26
    博客里关于stacking的讲解有许多,先分享一个我认为写的比较好的: https://blog.csdn.net/wstcjf/article/details/77989963 但是有一些地方我觉得还是没讲清楚: 1,训练集(training data),验证集(validation...

    博客里关于stacking的讲解有许多,先分享一个我认为写的比较好的:

    https://blog.csdn.net/wstcjf/article/details/77989963

    但是有一些地方我觉得还是没讲清楚:

    1,训练集(training data),验证集(validation data),测试集(test data)的概念。

    2,下一层模型如何训练。

    3,最终如何输出结果。

    因此对这篇博客进行了修改,修改后的文章如下:

    stacking的过程有一张图非常经典,如下:

    虽然很直观,但是没有语言描述确实很难搞懂。

    上半部分是用一个基础模型进行5折交叉验证,如:用XGBoost作为基础模型Model1,5折交叉验证就是先拿出四折作为training data(训练集),另外一折作为validation data(验证集)。注意:在stacking中此部分数据会用到整个training data。如:假设我们整个training data包含10000行数据,test data包含2500行数据,那么每一次交叉验证其实就是对training data进行训练集验证集的划分,在每一次的交叉验证中training data将会是8000行,validation data是2000行。

    每一次的交叉验证包含两个过程,1. 基于training data训练模型;2. 基于training data训练生成的模型对validation data进行预测。在整个第一次的交叉验证完成之后我们将会得到关于当前validation data的预测值,这将会是一个2000行1列的数据,记为a1。注意!在这部分操作完成后,我们还要对数据集原来的整个test data进行预测,这个过程会生成2500个预测值,这部分预测值将会作为下一层模型test data的一部分,记为b1。因为我们进行的是5折交叉验证,所以以上提及的过程将会进行五次,最终会生成针对validation data数据预测的2000行5列的数据a1,a2,a3,a4,a5,对test data的预测会是2500行5列数据b1,b2,b3,b4,b5。

    在完成对Model1的整个步骤之后,我们可以发现a1,a2,a3,a4,a5其实就是对原来整个training data的预测值,将他们拼凑起来,会形成一个10000行1列的矩阵,记为A1。而对于b1,b2,b3,b4,b5这部分数据,我们将各部分相加取平均值,得到一个2500行1列的矩阵,记为B1。

    以上就是stacking中一个模型的完整流程,stacking中同一层通常包含多个模型,假设还有Model2: LR,Model3:RF,Model4: GBDT,Model5:SVM,对于这四个模型,我们可以重复以上的步骤,在整个流程结束之后,我们可以得到新的A2,A3,A4,A5,B2,B3,B4,B5矩阵。

    在此之后,我们把A1,A2,A3,A4,A5并列合并得到一个10000行5列的矩阵作为training data,B1,B2,B3,B4,B5并列合并得到一个2500行5列的矩阵作为test data。让下一层的模型基于他们进一步训练。

    下一层模型训练时,将10000行5列的矩阵作为模型的特征矩阵,将最原始的training data的True Labels作为模型的输出矩阵,进行模型的训练。模型训练完成后,将经过处理的2500行5列test data作为特征矩阵,利用模型输出2500行1列作为结果。

    以上即为stacking的完整步骤!

    展开全文
  • 模型融合—— stacking详细讲解

    万次阅读 多人点赞 2018-07-31 14:42:59
    stacking的过程有一张图非常经典,如下: 虽然他很直观,但是没有语言描述确实很难搞懂。 上半部分是用一个基础模型进行5折交叉验证,如:用XGBoost作为基础模型Model1,5折交叉验证就是先拿出四折作...

    “无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。”

    stacking的过程有一张图非常经典,如下:

     

    虽然他很直观,但是没有语言描述确实很难搞懂。

    上半部分是用一个基础模型进行5折交叉验证,如:用XGBoost作为基础模型Model1,5折交叉验证就是先拿出四折作为training data,另外一折作为testing data。注意:在stacking中此部分数据会用到整个traing set。如:假设我们整个training set包含10000行数据,testing set包含2500行数据,那么每一次交叉验证其实就是对training set进行划分,在每一次的交叉验证中training data将会是8000行,testing data是2000行。

    每一次的交叉验证包含两个过程,1. 基于training data训练模型;2. 基于training data训练生成的模型对testing data进行预测。在整个第一次的交叉验证完成之后我们将会得到关于当前testing data的预测值,这将会是一个一维2000行的数据,记为a1。注意!在这部分操作完成后,我们还要对数据集原来的整个testing set进行预测,这个过程会生成2500个预测值,这部分预测值将会作为下一层模型testing data的一部分,记为b1。因为我们进行的是5折交叉验证,所以以上提及的过程将会进行五次,最终会生成针对testing set数据预测的5列2000行的数据a1,a2,a3,a4,a5,对testing set的预测会是5列2500行数据b1,b2,b3,b4,b5。

    在完成对Model1的整个步骤之后,我们可以发现a1,a2,a3,a4,a5其实就是对原来整个training set的预测值,将他们拼凑起来,会形成一个10000行一列的矩阵,记为A1。而对于b1,b2,b3,b4,b5这部分数据,我们将各部分相加取平均值,得到一个2500行一列的矩阵,记为B1。

    以上就是stacking中一个模型的完整流程,stacking中同一层通常包含多个模型,假设还有Model2: LR,Model3:RF,Model4: GBDT,Model5:SVM,对于这四个模型,我们可以重复以上的步骤,在整个流程结束之后,我们可以得到新的A2,A3,A4,A5,B2,B3,B4,B5矩阵。

    在此之后,我们把A1,A2,A3,A4,A5并列合并得到一个10000行五列的矩阵作为training data,B1,B2,B3,B4,B5并列合并得到一个2500行五列的矩阵作为testing data。让下一层的模型,基于他们进一步训练。

    以上即为stacking的完整步骤!

     

    “无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。”

     

    展开全文
  • 数据挖掘竞赛利器-Stacking和Blending方式

    万次阅读 多人点赞 2018-08-30 13:53:28
    一.Stacking思想简介 1.Stacking的思想是一种有层次的融合模型,比如我们将用不同特征训练出来的三个GBDT模型进行融合时,我们会将三个GBDT作为基层模型,在其上在训练一个次学习器(通常为线性模型LR),用于组织...

    一.Stacking思想简介

    1.Stacking的思想是一种有层次的融合模型,比如我们将用不同特征训练出来的三个GBDT模型进行融合时,我们会将三个GBDT作为基层模型,在其上在训练一个次学习器(通常为线性模型LR),用于组织利用基学习器的答案,也就是将基层模型的答案作为输入,让次学习器学习组织给基层模型的答案分配权重。

    2.下图是个简单的例子,A、B是学习器,C、D、E是进行答案再组织的次学习器,次学习器会组织利用底层模型提供的答案。

    二.Stacking过程解读

           Stacking的主要思想是训练模型来学习使用底层学习器的预测结果,下图是一个5折stacking中基模型在所有数据集上生成预测结果的过程,次学习器会基于模型的预测结果进行再训练,单个基模型生成预测结果的过程是:            

             *首先将所有数据集生成测试集和训练集(假如训练集为10000,测试集为2500行),那么上层会进行5折交叉检验,使用训练集中的8000条作为喂养集,剩余2000行作为验证集(橙色)

            *每次验证相当于使用了蓝色的8000条数据训练出一个模型,使用模型对验证集进行验证得到2000条数据,并对测试集进行预测,得到2500条数据,这样经过5次交叉检验,可以得到中间的橙色的5*2000条验证集的结果(相当于每条数据的预测结果),5*2500条测试集的预测结果。            

            *接下来会将验证集的5*2000条预测结果拼接成10000行长的矩阵,标记为A1,而对于5*2500行的测试集的预测结果进行加权平均,得到一个2500一列的矩阵,标记为B1。  

            *上面得到一个基模型在数据集上的预测结果A1、B1,这样当我们对3个基模型进行集成的话,相于得到了A1、A2、A3、B1、B2、B3六个矩阵。

            *之后我们会将A1、A2、A3并列在一起成10000行3列的矩阵作为training data,B1、B2、B3合并在一起成2500行3列的矩阵作为testing  data,让下层学习器基于这样的数据进行再训练。

           *再训练是基于每个基础模型的预测结果作为特征(三个特征),次学习器会学习训练如果往这样的基学习的预测结果上赋予权重w,来使得最后的预测最为准确。

    以上就是Stacking的思想,进行Stacking集成同样需要基学习器尽量保持独立,效果相近。

    三.Stacking特点

     使用stacking,组合1000多个模型,有时甚至要计算几十个小时。但是,这些怪物般的集成方法同样有着它的用处:        

          (1)它可以帮你打败当前学术界性能最好的算法          

          (2)我们有可能将集成的知识迁移到到简单的分类器上          

          (3)自动化的大型集成策略可以通过添加正则项有效的对抗过拟合,而且并不需要太多的调参和特征选择。所以从原则上讲,stacking非常适合于那些“懒人”        

          (4)这是目前提升机器学习效果最好的方法,或者说是最效率的方法human ensemble learning 。

    四.Stacking和Blending对比

    1.Blending方式和Stacking方式很类似,相比Stacking更简单点,两者区别是:        

         *blending是直接准备好一部分10%留出集只在留出集上继续预测,用不相交的数据训练不同的 Base Model,将它们的输出取(加权)平均。实现简单,但对训练数据利用少了。          

    2.blending 的优点是:比stacking简单,不会造成数据穿越(所谓数据创越,就比如训练部分数据时候用了全局的统计特征,导致模型效果过分的好),generalizers和stackers使用不同的数据,可以随时添加其他模型到blender中。                

    3.缺点在于:blending只使用了一部分数据集作为留出集进行验证,而stacking使用多折交叉验证,比使用单一留出集更加稳健

    4.两个方法都挺好,看偏好了,可以一部分做Blending、一部分做Stacking。        

     

     

     

    展开全文
  • 一张图帮你理解stacking过程

    千次阅读 2018-09-12 21:30:51
    stacking的过程有一张图非常经典,如下:   下面我们将对此图进行解释: 上半部分是用一个基础模型进行5折交叉验证,如:用XGBoost作为基础模型Model1,5折交叉验证就是先拿出四折作为training data,另外一折...
  • Stacking代码

    2018-12-29 10:33:56
    利用Stacking针对北京市pm2.5数据进行回归预测,直接运行
  • 利用stacking模型融合,并做预测

    千次阅读 2019-01-09 20:58:27
    利用stacking模型融合,并做预测 导入的包 import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 引入用到的分类...
  • 集成学习之stacking详解

    千次阅读 2018-12-30 21:36:27
    集成学习有以GBDT为代表的boosting方法和以RF为代表的Bagging方法,今天我们介绍另外一种stacking方法。stacking在kaggle中大为光火,很多高分选手都用了此方法,在工业界应用不详,还请知道的大神详解。 Stacking...
  • stacking

    千次阅读 2019-05-08 17:18:03
    stacking
  • Stacking

    千次阅读 2017-04-25 09:28:16
    经典Stacking模型是指将多种分类器组合在一起来取得更好表现的一种集成学习模型。一般情况下,Stacking模型分为两层。第一层中我们训练多个不同的模型,然后再以第一层训练的各个模型的输出作为输入来训练第二层的...
  • [机器学习]集成学习--bagging、boosting、stacking

    万次阅读 多人点赞 2018-05-24 12:11:10
    一、集成学习简介集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务。如何产生“好而不同”的个体学习器,是集成学习研究的核心。集成学习的思路是通过合并多个模型来提升机器学习性能,这种...
  • stacking模型融合

    2020-04-04 20:16:00
    模型融合 模型融合的方法 简单加权融合: 回归(分类概率):算术平均融合(Arithmetic mean),几何平均...stacking/blending: 构建多层模型,并利用预测结果再拟合预测。 boosting/bagging(在xgboost,Ad...
  • 模型融合stacking实战

    2019-03-16 15:25:52
    模型融合stacking的原理具体不再解释,有的博客已经解释很清楚了,还是附一张经典图吧, 直接上完整程序(根据后面的数据集下载地址可以下载数据集,然后直接运行程序): # Load in our libraries import pandas ...
  • Stacking 集成学习模型简介Stacking 集成学习的原理Stacking 是一种常见的集成学习框架。一般来说,Stacking 将训练一个多层(一般是两层, 本文中默认两层)的模型结构,第一层(也叫学习层)包含 n 个不同的模型,将...
  • 集成学习stacking

    千次阅读 2018-11-13 17:25:05
    参考链接:... stacking 使用mlxtend实现stacking 参考链接:http://rasbt.github.io/mlxtend/ mlxtend帮助文档:https://sebastianraschka.com/pdf/software/mlxtend-latest.pdf...
  • 1.一个简单的单层stacking import seaborn as sns import matplotlib.pyplot as plt from imblearn.over_sampling import SMOTE, ADASYN from sklearn.model_selection import cross_val_score from sklearn.model_...
  • 详解 Stacking 的 python 实现

    万次阅读 2017-07-09 09:27:20
    1. 什么是 stackingstacking 就是当用初始训练数据学习出若干个基学习器后,将这几个学习器的预测结果作为新的训练集,来学习一个新的学习器。2. 代码:例如我们用 RandomForestClassifier, ExtraTreesClassifier, ...
  • 【机器学习】集成学习Stacking

    千次阅读 2019-02-01 23:42:50
    上半部分是用一个基础模型进行5折交叉验证,...注意:在stacking中此部分数据会用到整个traing set。如:假设我们整个training set包含10000行数据,testing set包含2500行数据,那么每一次交叉验证其实就是对traini...
  • 本文是基于《kaggle比赛集成指南》来进行总结的概述什么是集成学习,以及目前较为常用的技术。这里主讲的集成学习技术用于分类任务,关于回归和预测这块不太了解,读者可自行查询相应博客或者论文。...
  • 前言 机器学习中很多训练模型通过融合方式都有可能使得准确率等评估指标有所提高,这一块有很多问题想学习,于是写篇博客来介绍,主要想解决: 什么是融合? 几种方式融合 基本的模型融合组合及适用场景、优缺点等 ...
1 2 3 4 5 ... 20
收藏数 13,429
精华内容 5,371
关键字:

stacking