Stacking Learning在分类问题中的使用

建议先阅读以下文章

  1. 知乎(必读):Kaggle机器学习之模型融合(stacking)心得
  2. Blog:Stacking Models for Improved Predictions
  3. Blog:KAGGLE ENSEMBLING GUIDE(注脚)
  4. Blog:如何在 Kaggle 首战中进入前 10%
  5. Github:[ikki407](https://github.com/ikki407)/stacking
  6. 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
  7. 神作: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 learning
from sklearn.model_selection import KFold
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits
import numpy as np
from sklearn.svm import SVC
from sklearn import metrics
from sklearn.ensemble import RandomForestClassifier
from sklearn import preprocessing
import pandas as pd


# 导入数据集切割训练与测试数据

data = load_digits()
data_D = preprocessing.StandardScaler().fit_transform(data.data)
data_L = data.target
data_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 model

def 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)*100
print 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)*100
print accuracy
# 96.4228934817

Pay Attention

  1. 这里只是使用了两层的stacking,完成了一个基本的stacking操作,也可以同理构建三层,四层等等
  2. 对于第二级的输入来说,特征进行了变化(有一级分类器构成的判决作为新特征),所以相应的测试集也需要进行同样的转换,毕竟分类器学习的训练集已经不一样了,学习的内容肯定是无法适用于旧的测试集的,要清楚的是,当初我们是对整个Data集合随机分测试集和训练集的!
  3. 适用k-fold的方法,实质上使用了cv的思想,所以数据并没有泄露(没有用到测试集,用的是训练集中的hold-set),所以这个方法也叫做out-of-folds

Further

  1. 可以将之前的原始特征和之后新的特征进行融合,相当于特征扩充,然后注意标准化和归一化进行处理,毕竟一级的特征量纲和产出的后验概率组成的特征量纲不一样,自己做测试吧~

致谢

  • Self-Trained Stacking Model for Semi-Supervised Learning
  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: bagging:是一种集成学习方法,通过对训练数据进行有放回的随机抽样,生成多个子集,然后在每个子集上训练一个基学习器,最后将这些基学习器的预测结果进行平均或投票来得到最终的预测结果。 boosting:也是一种集成学习方法,但与bagging不同的是,它是通过对训练数据进行加权,使得基学习器更加关注那些难以分类的样本,从而提高整体的预测准确率。 stacking:是一种更加高级的集成学习方法,它不仅仅是将多个基学习器的预测结果进行简单的平均或投票,而是将这些预测结果作为新的特征,再训练一个元学习器来得到最终的预测结果。 ### 回答2: Bagging、BoostingStacking都是集成学习(Ensemble Learning常用的方法。 Bagging(自举汇聚法)是一种并行集成方法,基于自助采样的思想,通过构建多个相互独立的分类器(如决策树),再进行投票或求平均等方式进行集成。每个子分类器都是在不同的训练数据集上训练得到的,可以减少模型的方差,提高模型的稳定性,有效降低过拟合风险。 Boosting(提升法)则是一种串行集成方法,通过迭代训练一系列弱分类器(如决策树),通过不断调整样本权重以使错误样本更加关注,然后再结合所有弱分类器形成一个强分类器。Boosting可以提高模型的准确性,特别适用于处理复杂的分类问题Stacking(堆叠泛化法)是一种更为复杂的集成方法,它结合了Bagging和Boosting的优势。在Stacking,首先构建多层的分类器(如基分类器、元分类器等),每层的输出作为下一层的输入。最后通过一个元分类器来整合各层的输出结果,以获得最终的预测结果。 总结起来,Bagging通过并行地构建多个相互独立的分类器进行集成,Boosting通过迭代地训练一系列弱分类器形成一个强分类器,而Stacking通过构建多层的分类器以获得更强大的预测能力。这些集成方法在实际应用,能够有效提高分类模型的准确性和稳定性,达到更好的预测效果。 ### 回答3: Bagging、BoostingStacking都是常用于集成学习(ensemble learning的方法。 Bagging是基于自助采样(bootstrap sampling)的一种集成学习方法。在Bagging,我们从原始数据集使用有放回地进行采样得到多个不同的子样本集,并使用这些子样本集独立地训练多个基学习器。最后,通过对基学习器的预测结果进行投票或求平均来得到最终的集成模型。Bagging能够减少过拟合,提高模型的稳定性和泛化能力。 Boosting也是一种集成学习方法,与Bagging不同的是它是基于序列训练的。在Boosting,基学习器是按顺序训练的,每个基学习器都会根据前一个学习器的预测结果对样本进行调整。Boosting的核心思想是通过迭代训练一系列弱学习器,使得它们能够逐步提升性能并最终形成一个强学习器。常用的Boosting算法有AdaBoost和Gradient BoostingStacking是一种更高级的集成学习方法,它将多个不同类型的基学习器集成在一起。在Stacking,我们首先使用训练数据集对多个基学习器进行训练,然后使用这些基学习器对测试数据集进行预测。接着,我们将基学习器的预测结果作为输入,再训练一个元学习器来得到最终的集成模型。Stacking通过将不同类型的基学习器进行组合,可以充分利用它们的优势,提高模型的性能和泛化能力。 综上所述,Bagging、BoostingStacking都是集成学习常用的方法,它们通过组合多个基学习器来提高模型的性能和泛化能力,从而在实际应用取得更好的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值