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)

posted @ 2018-09-23 16:04  白鹭倾城  阅读(10115)  评论(0编辑  收藏  举报