独家 | 利用Python的混合集成机器学习(附链接)

作者:Jason Brownlee

翻译:王可汗

校对:wwl

本文约7000字,建议阅读16分钟

本文为大家展示了如何在python中开发和评估混合集成学习,以及如何用于分类和回归问题当中。

混合是一种基于集成学习的机器学习算法。

它是堆叠或堆叠集成的口语化名称,在这种情况下,元模型不是根据基本模型做出的对折外数据的预测来拟合,而是根据对保留的样本数据集做出的预测来拟合。

在价值100万美元的Netflix机器学习竞赛中,“混合”被用来描述由竞争对手将数百个预测模型组合在一起的堆叠模型并且在竞争激烈的机器学习圈,比如Kaggle社区,仍然是一种流行的技术和名称。

在本教程中,您将了解如何在python中开发和评估混合集成学习。

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

  • 混合集成是一种叠加,在这种叠加中,元模型是通过对一个保留验证数据集的预测而不是折外数据集的预测来拟合的。

  • 如何开发一个混合集成,包括训练模型和对新数据进行预测的功能。

  • 如何评价用于分类和回归预测建模问题的混合集成。

让我们开始吧。

教程概述

本教程分为四个部分,它们是:

  • 混合集成

  • 开发混合集成

  • 用于分类的混合集成

  • 用于回归的混合集成

混合集成

混合是一种集成机器学习技术,它使用一个机器学习模型来学习如何最好地结合来自多个成员模型的预测。

广义来说,就其本身而言,混合和堆叠泛化(即叠加)是一样的。在同一篇论文或模型描述中,混合和叠加通常是交替使用的。

“许多机器学习实践者已经成功地使用叠加和相关技术来提高预测精度,超过任何单个模型所获得的水平。在某些情况下,堆叠也被称为混合,在这里我们将交替使用这两个术语。”

特征加权线性叠加,2009年。

堆叠模型的体系结构包括两个或多个基本模型(通常称为0级模型)和一个元模型(它结合了基本模型的预测,称为1级模型)。元模型是根据基本模型对样本外数据的预测来训练的。

  • 0级模型(基础模型):基于训练数据训练模型用来进行预测。

  • 1级模型(元模型):学习如何最好地结合基本模型的预测的模型。

然而,混合对于如何构建堆叠集成模型具有特定的内涵。

混合可能建议开发一个堆叠的集成学习模型,其中基础模型是任何类型的机器学习模型,元模型是一个“混合”基础模型的线性模型。

例如,预测数值时的线性回归模型或预测类标签时的逻辑回归模型将计算基本模型所作预测的加权和,并将被认为是预测的混合。

  • 混合集成:使用线性模型,如线性回归或逻辑回归,作为叠加集成中的元模型。

在2009年的Netflix奖金比赛中“混合”是描述堆叠集成的术语。该奖项包括寻求比Netflix原生算法更好的电影推荐预测的团队,性能提高10%的团队将获得100万美元的奖金。

“我们的RMSE=0.8643^2解是100多个结果的线性混合.……在对方法的描述中,我们强调了参与最终混合解决方案的特定预测器。”

- 2008年Netflix大奖的BellKor解决方案

因此,混合是一个通俗的术语,指的是带有堆栈类型架构模型的集成学习。除了与竞争机器学习相关的内容外,很少在教科书或学术论文中使用它。

最常见的是,混合(blending)被用来描述堆叠的特定应用,在这种情况下,元模型是根据一个固定的验证数据集上的基础模型所做出的预测来训练的。堆叠(stacking)则被保留给元模型,在交叉验证过程中根据折外预测进行训练的场景。

  • 混合(blending):堆叠类型的集成,其中元模型是根据对保留的验证数据集的预测进行训练的。

  • 堆叠(stacking):堆叠式集成,在k-fold交叉验证过程中,元模型根据折外预测进行训练。

这种区别在Kaggle竞争机器学习社区中很常见。

“Blend(混合)这个词是由Netflix的获胜者们提出的。它非常接近堆叠泛化,但更简单,信息泄漏的风险更小。…使用混合,而不是为训练集创建折外数据集预测,您创建一个小的保留数据集,比如10%的训练集。然后堆叠模型只在这个保留集合上运行。”

-《Kaggle Ensemble Guide》,MLWave, 2015。

我们将使用后一个混合的定义。

接下来,让我们看看如何实现混合。

开发混合集成

在编写时,scikit-learn库并不天生支持混合。但,我们可以使用scikit-lern模型自己实现它。

首先,我们需要创建一些基本模型。对于回归或分类问题,这些模型可以是我们喜欢的任何模型。我们可以定义一个函数get_models(),它返回一个模型列表,其中每个模型被定义为一个具有名称和配置的分类器或回归器的元组。

例如,对于一个分类问题,我们可以使用逻辑回归、kNN、决策树、支持向量机和朴素贝叶斯模型。

# get a list of base models
def get_models():
models = list()
models.append(('lr', LogisticRegression()))
models.append(('knn', KNeighborsClassifier()))
models.append(('cart', DecisionTreeClassifier()))
models.append(('svm', SVC(probability=True)))
models.append(('bayes', GaussianNB()))
return models

接下来,我们需要拟合混合模型。回想一下,基本模型用于拟合训练数据集。元模型是基于每个基本模型对保留数据集的预测结果进行拟合。首先,我们可以列举模型列表,然后依次在训练数据集上训练每一个模型。同样在这个循环中,我们可以使用训练的模型对保留的验证数据集进行预测,并为以后存储预测。

...

# fit all models on the training set and predict on hold out set
meta_X = list()
for name, model in models:
# fit in training set
model.fit(X_train, y_train)
# predict on hold out set
yhat = model.predict(X_val)
# reshape predictions into a matrix with one column
yhat = yhat.reshape(len(yhat), 1)
# store predictions as input for blending
meta_X.append(yhat)

我们现在有了表示可用于训练元模型的输入数据的“meta_X”。每一列或特性代表一个基本模型的输出。

每一行表示来自保留数据集的一个示例。我们可以使用hstack()函数来确保这个数据集像机器学习模型所期望的那样是一个2D numpy数组。

...

# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)

我们现在可以训练我们的元模型。这可以是我们喜欢的任何机器学习模型,比如分类的逻辑回归。

...

# define blending model
blender = LogisticRegression()
# fit on predictions from base models
blender.fit(meta_X, y_val)

我们可以将所有这些整合接到一个名为fit_ensemble()的函数中,该函数使用一个训练数据集和一个验证数据集训练混合模型。

下一步是使用混合集成对新数据进行预测。这是一个两步的过程。第一步是使用每个基础模型进行预测。然后将这些预测收集在一起,作为混合模型的输入来做出最终的预测。我们可以使用与训练模型时相同的循环结构。也就是说,我们可以将每个基本模型的预测收集到训练数据集中,将预测堆叠在一起,并使用这个元级别数据集在blender模型上调用predict()。下面的predict_ensemble()函数实现了这一点。

# fit the blending ensemble
def fit_ensemble(models, X_train, X_val, y_train, y_val):
# fit all models on the training set and predict on hold out set
meta_X = list()
for name, model in models:
# fit in training set
model.fit(X_train, y_train)
# predict on hold out set
yhat = model.predict(X_val)
# reshape predictions into a matrix with one column
yhat = yhat.reshape(len(yhat), 1)
# store predictions as input for blending
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# define blending model
blender = LogisticRegression()
# fit on predictions from base models
blender.fit(meta_X, y_val)
return blender

给定训练的基础模型列表、训练的blender集合和数据集(比如测试数据集或新数据),它将返回数据集的一组预测。

# make a prediction with the blending ensemble
def predict_ensemble(models, blender, X_test):
# make predictions with base models
meta_X = list()
for name, model in models:
# predict with base model
yhat = model.predict(X_test)
# reshape predictions into a matrix with one column
yhat = yhat.reshape(len(yhat), 1)
# store prediction
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# predict
return blender.predict(meta_X)

现在,我们已经拥有了实现分类或回归预测建模问题的混合集成所需的所有元素。

用于分类的混合集成

在本节中,我们将研究如何使用混合来解决分类问题。

首先,我们可以使用make_classification()函数创建一个包含10,000个示例和20个输入特性的二进制分类问题。

下面列出了完整的示例。

# test
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值