集成方法stacking的简单阐述

在西瓜书有介绍到一种名为stacking的集成学习方法,在这里简单阐述下,大家一起学习,相互进步。
在此我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器。
Stacking 先从初始数据集训练出学习器,然后生成一个新数据集用于训练次级学习器,在这个新数据集中,初级学习器的输出被当做样例输入特征,而初始样本的标记仍被当作样例的标记。
在训练阶段,次级训练集是利用初级学习器产生的,若直接用初级学习器的训练集来产生次级训练集,则有可能发生过拟合。因此,一般都是采用交叉验证或者留一法这样的方式,用训练初级学习器未使用的样本来产生次级 学习器的训练样本。次级学习器的输入属性表示和次级学习算法对stacking集成的泛华性能有很大影响,将初级学习器的输出类概率作为次级学习器的输入属性,次级学习算法一般用多响应线性回归(MLR).

class Ensemable(object):
    def __init__(self, n_splits, stacker, base_models):
        self.n_splits = n_splits
        self.stacker = stacker
        self.base_models = base_models

    def fit_predict(self, x, y, t):
        x = np.array(x)
        y = np.array(y)
        t = np.array(t)
        folds = list(StratifiedKFold(n_splits=self.n_splits, shuffle=True, random_state=2017).split(x, y))
        s_train = np.zeros((x.shape[0], len(self.base_models)))
        s_test = np.zeros((t.shape[0], len(self.base_models)))
        for i, clf in enumerate(self.base_models):
            s_test_i = np.zeros((t.shape[0], self.n_splits))
            for j, (train_inx, test_inx) in enumerate(folds):
                x_train = x[train_inx]
                y_train = y[train_inx]
                x_test = x[test_inx]
                print("Fit %s fold %d" % (str(clf).split('(')[0], j + 1))
                clf.fit(x_train, y_train)
                score = cross_val_score(clf, x_train, y_train, cv=3, scoring="roc_auc")
                print("cross_score: %.5f" % (score.mean()))
                y_pred = clf.predict_proba(x_test)[:, 1]
                s_train[test_inx, i] = y_pred
                s_test_i[:, j] = clf.predict_proba(t)[:, 1] #取预测为1的概率
            s_test[:, i] = s_test_i.mean(axis=1)# columns
        result = cross_val_score(self.stacker, s_train, y, cv=3, scoring="roc_auc")
        print("Stacker score: %.5f" % (result.mean()))

        self.stacker.fit(s_train, y)
        res = self.stacker.predict_proba(s_test)[:, 1]
        return res

你可能感兴趣的:(机器学习/深度学习)