• stacking算法原理及代码


    stacking算法原理

      1:对于Model1,将训练集D分为k份,对于每一份,用剩余数据集训练模型,然后预测出这一份的结果

      2:重复上面步骤,直到每一份都预测出来。得到次级模型的训练集

      3:得到k份测试集,平均后得到次级模型的测试集

      4: 对于Model2、Model3…..重复以上情况,得到M维数据

      5:选定次级模型,进行训练预测 ,一般这最后一层用的是LR。

     优缺点:

           优点:

           1、  采用交叉验证方法构造,稳健性强;

           2、  可以结合多个模型判断结果,进行次级训练,效果好;

           缺点:

           1、构造复杂,难以得到相应规则,商用上难以解释。

    代码:

    import numpy as np

    from sklearn.model_selection import KFold

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

        """

        这个函数是stacking的核心,使用交叉验证的方法得到次级训练集

        x_train, y_train, x_test 的值应该为numpy里面的数组类型 numpy.ndarray .

        如果输入为pandas的DataFrame类型则会把报错"""

        train_num, test_num = x_train.shape[0], x_test.shape[0]

        second_level_train_set = np.zeros((train_num,))

        second_level_test_set = np.zeros((test_num,))

        test_nfolds_sets = np.zeros((test_num, n_folds))

        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个分类算法,为了体现stacking的思想,就不加参数了

    from sklearn.ensemble import (RandomForestClassifier, AdaBoostClassifier,

                                  GradientBoostingClassifier, ExtraTreesClassifier)

    from sklearn.svm import SVC

    rf_model = RandomForestClassifier()

    adb_model = AdaBoostClassifier()

    gdbc_model = GradientBoostingClassifier()

    et_model = ExtraTreesClassifier()

    svc_model = SVC()

    #在这里我们使用train_test_split来人为的制造一些数据

    from sklearn.datasets import load_iris

    from sklearn.model_selection import train_test_split

    iris = load_iris()

    train_x, test_x, train_y, test_y = train_test_split(iris.data, iris.target, test_size=0.2)

    train_sets = []

    test_sets = []

    for clf in [rf_model, adb_model, gdbc_model, et_model, svc_model]:

        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)

    print(df_predict)

  • 相关阅读:
    asp.net Forms验证跨域页面不能访问的问题
    JavaScript创建命名空间
    DataTable转换成JSON字符串的函数
    javascript 正确截取单字节和双字节混和字符串的方法
    异常详细信息: 不能通过已删除的行访问该行的信息
    HttpUtility.ParseQueryString直接从字符串URL中提取参数
    支持函数,变量的算术表达式计算(三、加入函数)
    mp3 分类管理工具
    我好累
    电饭煲是如何知道饭已熟了的
  • 原文地址:https://www.cnblogs.com/dudumiaomiao/p/9692935.html
Copyright © 2020-2023  润新知