美文网首页
数据科学(DS)学习笔记-stacking

数据科学(DS)学习笔记-stacking

作者: 牧小熊 | 来源:发表于2020-02-06 11:51 被阅读0次

    stacking是一种集成学习模型,主要利用分层模型搭建学习框架。
    以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为特征加入训练集进行再训练,从而得到完整的stacking模型。

    stacking 模型具体是怎么操作的呢?
    我们从这里拿来了一张图并加上自己的理解来阐述stacking 的模型。

    image.png
    image.png
    image.png
    最后用一张图来总结上面的过程
    微信图片_20200205202453.png

    首先第一步是得到训练集与验证集(train_x,train_y,test_x,test_y),这里和普通的数据训练是一样的。
    对训练集的操作如下:
    1.使用 KFold或者StratifiedKFold来对训练集进行分割,将训练集的数据分割成n份。
    值得注意的是StratifiedKFold 分层采样交叉切分,确保训练集,测试集中各类别样本的比例与原始数据集中相同,因此更加推荐使用StratifiedKFold
    具体请参考KFold,StratifiedKFold k折交叉切分
    2.随机选择其中的n-1份做为训练集中的训练集,剩下的1份作为训练集中的验证集,对训练集的训练集进行fit,对训练集的测试机进行predict 得到train_y_pred,同时对测试集pred,就得到test_y_pred,对得到的test_y_pred取平均值即输出为最后的test_y_pred_mean
    循环训练,就得到了n个test_y_pred_mean,将这n个test_y_pred_mean拼接起来,我们就得到了n_train_y_pred
    循环训练,就得到了n个test_y_pred,对这n个test_y_pred求平均值
    这样第一步的融合训练就完成了
    3.第二层模型,使用简单的模型,将第一层得到的结果进行训练
    首先将得到的n_train_y_pred 与 train_y 进行训练
    将得到的训练模型再对test_y_pred进行预测,就可以得到最终测试集的预测结果

    更加细致一些的讲解可以参考:https://blog.csdn.net/wstcjf/article/details/77989963

    我们来看看具体是如何实现的
    stacking 实现

    import numpy as np
    from sklearn.model_selection import KFold
    #选择from sklearn.model_selection import StratifiedKFold 也是可以的
    
    def get_stacking(clf, x_train, y_train, x_test, n_folds=10):
        #clf 训练的模型
        #x_train 训练集x
        #y_train 训练集y
        #x_test 测试集x
        #n_folds 训练集划分
        train_num, test_num = x_train.shape[0], x_test.shape[0]
        second_level_train_set = np.zeros((train_num,)) #120*1
        second_level_test_set = np.zeros((test_num,)) #30*1
        test_nfolds_sets = np.zeros((test_num, n_folds)) #30*10
        kf = KFold(n_splits=n_folds)
    
        for i,(train_index, test_index) in enumerate(kf.split(x_train)):
            x_tra, y_tra = x_train[train_index], y_train[train_index]
            x_tst, y_tst =  x_train[test_index], y_train[test_index]
    
            clf.fit(x_tra, y_tra)
    
            second_level_train_set[test_index] = clf.predict(x_tst)
            test_nfolds_sets[:,i] = clf.predict(x_test)
    
        second_level_test_set[:] = test_nfolds_sets.mean(axis=1)
        return second_level_train_set, second_level_test_set
    

    第一层模型融合

    这里随便选择5种模型
    from sklearn.ensemble import (RandomForestClassifier, AdaBoostClassifier,
                                  GradientBoostingClassifier, ExtraTreesClassifier)
    from sklearn.svm import SVC
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    
    #第一层的5个训练模型
    model_1 = RandomForestClassifier()
    model_2= AdaBoostClassifier()
    model_3= GradientBoostingClassifier()
    model_4= ExtraTreesClassifier()
    model_5= SVC()
    clfs=[model_1,model_2,model_3,model_4,model_5]
    iris= load_iris()  #导入鸢尾花数据集 150*4
    train_x, test_x, train_y, test_y = train_test_split(iris.data, iris.target, test_size=0.3,random_state=2020)
    #准备工作已经做好------->
    #train_x 120*4
    train_sets = []
    test_sets = []
    for clf in clfs:
        train_set, test_set = get_stacking(clf, train_x, train_y, test_x)
        train_sets.append(train_set)
        test_sets.append(test_set)
    
    meta_train = np.concatenate([result_set.reshape(-1,1) for result_set in train_sets], axis=1)
    meta_test = np.concatenate([y_test_set.reshape(-1,1) for y_test_set in test_sets], axis=1)
    

    第二层模型

    #使用决策树作为我们的次级分类器
    from sklearn.tree import DecisionTreeClassifier
    dt_model = DecisionTreeClassifier()
    dt_model.fit(meta_train, train_y)
    df_predict = dt_model.predict(meta_test)
    

    参考:
    https://blog.csdn.net/wqh_jingsong/article/details/77896449
    https://www.cnblogs.com/jiaxin359/p/8559029.html
    https://zhuanlan.zhihu.com/p/26890738
    https://www.kaggle.com/arthurtok/introduction-to-ensembling-stacking-in-python
    https://zhuanlan.zhihu.com/p/25836678

    相关文章

      网友评论

          本文标题:数据科学(DS)学习笔记-stacking

          本文链接:https://www.haomeiwen.com/subject/wglexhtx.html