stacking算法原理

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

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

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

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

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

优缺点:

优点:

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

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

缺点:

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

stacking算法原理及代码-LMLPHP

代码:

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)

05-11 18:30