如何利用Keras在深度神经网络中进行堆栈集成(Stacking Ensemble)

    译自Machine Learning Mastery~

    模型平均是一种集成技术,其中多个子模型对组合预测的贡献相等。

    利用子模型的预期性能,加权各子模型对组合预测的贡献,可以改善模型平均。通过培训一个全新的模型来学习如何最好地组合来自每个子模型的贡献,可以进一步扩展这一点。这种方法被称为Stacked Generalization(堆栈泛化),或简称Stacking,可以产生比任何单个贡献模型更好的预测性能。

    在本教程中,您将了解如何为深度学习神经网络开发一个Stacked Generalization Ensemble(集成堆栈泛化)。

    完成本教程后,您将知道:

  • Stacked Generalization是一种集成方法,新模型学习如何最好地结合多个现有模型的预测。
  • 如何以神经网络为子模型,以scikit-learn分类器为元学习机,建立Stacking模型。
  • 如何将神经网络的子模型嵌入到更大的叠加集成模型中进行训练和预测。

    让我们开始吧。

教程概述

    本教程分为六个部分;它们是:

  1. Stacked Generalization Ensemble(集成堆栈集成)
  2. 多分类问题
  3. 多层感知器模型
  4. 训练和保存子模型
  5. 单独的Stacking模型
  6. 综合Stacking模型

 Stacked Generalization Ensemble(堆叠泛化集成)

    一个平均集成模型结合了来自多个训练模型的预测。

    这种方法的一个限制是,无论模型执行得如何,每个模型对集成预测的贡献都是相同的。这种方法的一种变体称为加权平均集成,它通过模型对预留集(holdout dataset)的信任或预期性能来确定每个集成成员的权重。这允许性能良好的模型贡献更多,而性能较差的模型贡献更少。加权平均集成比模型平均集成提供了一种改进。

    该方法的另一个推广是用其他算法来替代线性加权和(例如线性回归)模型。这种方法称为堆栈泛化(Stacked Generlization),简称Stacking。

    在Stacking中,算法将子模型的输出作为输入,并尝试学习如何将输入预测最好地组合起来,从而做出更好的输出预测。

    我们科研将Stacking过程看作有两个级别:级别0和级别1。

  • 0级:0级数据是训练数据集的输入,0级模型学习如何从这些数据中进行预测。
  • 1级:第1级数据以第0级模型的输出作为输入,第1级模型(元学习机)学习从该0级数据进行预测。

    Stacking Generalization的工作原理是根据给定的学习集推导出泛化器的偏差。这个推论通过在第二个空间中进行泛化来进行,第二个空间的输入是原始泛化器在部分学习集上学习的结果,并尝试猜测其余部分,其输出(例如)是正确的猜测。

                                                                                                                                          — Stacked generalization, 1992.

    与加权平均集成不同,Stacked Generalization Ensemble(堆栈泛化集成)可以将预测集用作上下文,并有条件地决定以不同的方式赋以输入预测权重,从而可能获得更好的性能。

    有趣的是,尽管Stacking被描述为具有两个或多个0级模型的集成学习方法,但它可以用于只有一个0级模型的情况。在这种情况下,1级或元学习机模型学习从0级模型纠正预测。

    ......虽然它也可以用于只有一个泛化器的情况下,作为一种改进该泛化器的技术。

                                                                                                                                         — Stacked generalization, 1992.

    重要的是,在一个单独的数据集上对元学习机进行训练,以获得用于训练0级模型的示例,以避免过度拟合。

    可以用一个简单的方法,把训练数据集分成训练集和验证集。0级模型在训练集训练。1级模型使用验证训练集,原始输入喂进0级模型预测,并用作输入到1级模型。

   预留集(hold-out validation set)验证训练Stacking模型的一个限制是0级和1级模型没有在完整的数据集上训练。

    一种更为复杂的方法是使用k-fold交叉验证来开发元学习机模型的训练数据集。每个0级模型都使用k-fold交叉验证(甚至为了达到最大效果使用留一法交叉验证)进行训练;然后模型被丢弃,但是预测被保留。这意味着对于每个模型,都有一个模型版本所做的预测,而这个版本的模型并没有针对这些例子进行训练,例如,有一些在预留的例子,但是在这个例子中,是针对整个训练数据集的。

    这里,引用一下详解stacking过程里面的一张图,非常经典地阐述了Stacking的过程。同时也非常推荐大家看一下这篇博客,讲得比较清楚。关于Stacking和其他集成方法的总结以及在scikit-learn中使用Stacking的代码可参考集成学习总结 & Stacking方法详解

    然后将预测作为训练元学习机的输入。然后对整个训练数据集进行0级模型的训练,并与元学习机一起使用Stacking模型对新数据进行预测。

    Tips(使用时的注意事项):在实践中,通常使用不同的算法来准备每个level 0模型,以提供不同的预测集。

    ....Stacking通常不用于组合同类型的模型[…],它适用于不同学习算法构建的模型。

                                                                      — Practical Machine Learning Tools and Techniques, Second Edition, 2005.

    使用简单的线性模型组合预测结果也很常见。由于线性模型的使用非常普遍,Stacking在最近被称为“model blending”或简称为“blengding”,尤其是在机器学习竞赛中。

    ......采用多响应最小二乘线性回归技术(multi-response least squares linear regression technique )作为高级推广器。该技术提供了一种组合0级模型置信度的方法。

                                                                                                                            — Issues in Stacked Generalization, 1999.

    Stacking Generalization Ensemble可以被用作回归和分类问题。在分类问题中,使用类概率预测而不是类标签作为元学习机的输入,效果更好。

    ......我们应该使用类概率,而不是单一的预测类作为更高层次学习的输入属性。类概率作为预测的置信度。

                                                                                                                              — Issues in Stacked Generalization, 1999.

    现在我们已经熟悉了Stacking Generalization,我们可以通过一个案例研究来开发一个堆栈深度学习模型。

多分类问题

    我们将使用一个小的多类分类问题作为基础来演示Stacking。

    scikit-learn类提供了make_blobs()函数,该函数可用于创建具有指定样本数量、输入变量、类和类内样本方差的多类分类问题。该问题有两个输入变量(表示点的x和y坐标),每组点的标准差为2.0。我们将使用相同的随机状态(伪随机数生成器的种子)来确保总是得到相同的数据点。

# generate 2d classification dataset
X, y = make_blobs(n_samples=1000, centers=3, n_features=2, cluster_std=2, random_state=2)

    结果是我们可以建模的数据集的输入和输出元素。为了了解问题的复杂性,我们可以在二维散点图上绘制每个点,并按类值对每个点进行着色。下面列出了完整的示例。

# scatter plot of blobs dataset
from sklearn.datasets.samples_generator import make_blobs
from matplotlib import pyplot
from pandas import DataFrame
# generate 2d classification dataset
X, y = make_blobs(n_samples=1000, centers=3, n_features=2, cluster_std=2, random_state=2)
# scatter plot, dots colored by class value
df = DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue', 2:'green'}
fig, ax = pyplot.subplots()
grouped = df.groupby('label')
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])
pyplot.show()

    运行该示例将创建整个数据集的散点图。我们可以看到2.0的标准偏差意味着类不是线性可分的(由直线可分),这导致了许多不明确的点。这是可取的,因为这意味着问题不是微不足道的,

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值