应用的机器学习通常专注于为给定数据集找到一个表现良好或最佳的模型。
有效使用模型需要对输入数据进行适当的准备和模型的超参数调整。
总而言之,准备数据、调整模型和转换预测所需的线性步骤序列称为建模流水线。现代机器学习库,如 scikit-learn Python 库,允许正确(无数据泄露)和一致地(在评估和预测期间)定义和使用此步骤序列。
然而,对于初学者来说,处理建模流水线可能会令人困惑,因为它需要改变对应用机器学习过程的看法。
在本教程中,您将了解应用于机器学习的建模流水线。
完成本教程后,您将了解:
- 应用机器学习不仅是为了找到一个表现良好的模型;它还需要找到一个适当的数据准备步骤序列以及预测后处理步骤。
- 总而言之,解决预测建模问题所需的操作可以被视为一个原子单元,称为建模流水线。
- 通过建模流水线的视角来处理应用机器学习,需要改变思维方式,从评估特定的模型配置转向评估转换和算法的序列。
让我们开始吧。

机器学习建模流程简明介绍
摄影:Jay Huang,部分权利保留。
教程概述
本教程分为三个部分;它们是:
- 找到一个熟练的模型是不够的
- 什么是建模流水线?
- 建模流水线的影响
找到一个熟练的模型是不够的
应用机器学习是为给定的预测建模数据集发现表现最佳模型的过程。
事实上,它不止于此。
除了发现哪个模型在您的数据集上表现最佳之外,您还必须发现
- 数据转换,它们能最佳地揭示问题潜在的未知结构给学习算法。
- 模型超参数,它们能产生所选模型的一个良好或最佳配置。
可能还会有其他考虑因素,例如转换模型预测的技术,如阈值移动或预测概率的模型校准。
因此,通常将应用机器学习视为一个大型组合搜索问题,涵盖数据转换、模型和模型配置。
这在实践中可能非常具有挑战性,因为它要求数据准备方案、模型、模型配置和任何预测转换方案的一个或多个序列必须在一个给定的测试框架上进行一致且正确的评估。
虽然棘手,但使用简单的训练-测试分割可能可以管理,但在使用 k 折交叉验证甚至重复 k 折交叉验证时,它变得非常难以管理。
解决方案是使用建模流水线来保持一切清晰。
什么是建模流水线?
流水线是一系列数据准备选项、建模操作和预测转换操作的线性序列。
它允许指定、评估并将该步骤序列作为一个原子单元使用。
- 流水线:一个可以被视为原子单元的数据准备和建模步骤的线性序列。
为了使这个想法更清晰,让我们看两个简单的例子
第一个例子使用输入变量的数据归一化并拟合一个逻辑回归模型
- [输入],[归一化],[逻辑回归],[预测]
第二个例子标准化输入变量,应用 RFE 特征选择,并拟合一个支持向量机。
- [输入],[标准化],[RFE],[SVM],[预测]
您可以想象建模流水线的其他例子。
作为一个原子单元,流水线可以使用首选的重采样方案进行评估,例如训练-测试分割或 k 折交叉验证。
这很重要,原因主要有两个
- 避免数据泄露。
- 一致性和可复现性。
建模流水线避免了最常见的数据泄露类型,即数据准备技术,如缩放输入值,被应用于整个数据集。这是数据泄露,因为它将测试数据集的知识(例如,有助于已知均值或最大值的观察结果)与训练数据集共享,从而可能导致模型性能过于乐观。
相反,数据转换必须仅在训练数据集上准备,然后应用于训练数据集、测试数据集、验证数据集以及任何其他需要该转换的数据集,然后才能与模型一起使用。
建模流水线确保执行的数据准备操作序列是可复现的。
如果没有建模流水线,数据准备步骤可能需要手动执行两次:一次用于评估模型,一次用于进行预测。序列中的任何更改都必须在这两种情况下保持一致,否则差异将影响模型的性能和技能。
流水线确保操作序列只定义一次,并且在用于模型评估或进行预测时保持一致。
Python scikit-learn 机器学习库通过Pipeline 类提供了机器学习建模流水线。
您可以在本教程中了解更多关于如何使用此 Pipeline API 的信息
建模流水线的影响
建模流水线是机器学习从业者的重要工具。
尽管如此,在使用它们时必须考虑重要的影响。
初学者在使用流水线时遇到的主要困惑在于理解流水线学到了什么或流水线发现的特定配置。
例如,流水线可以使用一个自动配置自身的数据转换技术,例如用于特征选择的RFECV。
- 在评估使用自动配置数据转换的流水线时,它会选择什么配置?或者在将此流水线作为最终模型进行预测时,它选择了什么配置?
答案是,这不重要。.
另一个例子是使用超参数调优作为流水线的最后一步。
网格搜索将在流水线中任何先前转换步骤提供的数据上进行,然后使用这些数据搜索模型的最佳超参数组合,然后使用这些超参数在数据上拟合模型。
- 在评估使用网格搜索模型超参数的流水线时,它会选择什么配置?或者在将此流水线作为最终模型进行预测时,它选择了什么配置?
答案同样是,这不重要。.
当在流水线的最后使用阈值移动或概率校准步骤时,答案也是如此。
原因与我们不关心所选模型的具体内部结构或系数的原因相同。
例如,在评估逻辑回归模型时,我们不需要检查在每个 k 折交叉验证回合中选择的系数就能够选择模型。相反,我们关注其样本外预测技能。
同样,当使用逻辑回归模型作为最终模型在新的数据上进行预测时,在进行预测之前,我们不需要检查在整个数据集上拟合模型时选择的系数。
我们可以将系数的检查和发现作为一项分析练习,但这不会影响模型的选择和使用。
这个相同的答案在考虑建模流水线时也是适用的。
我们不关心流水线中的数据转换可能自动选择了哪些特征。我们也不关心在流水线的最后一步使用网格搜索时为模型选择了哪些超参数。
在这三种情况下:单个模型、带有自动特征选择的流水线以及带有网格搜索的流水线,我们都将“模型”或“建模流水线”作为一个原子单元进行评估。
流水线使我们作为机器学习从业者能够提升一个抽象级别,并更少地关注算法的具体输出,而更多地关注一系列程序的性能。
因此,我们可以专注于评估算法在数据集上的性能,而不是算法的产物,即模型。一旦我们对流水线有了估计,我们就可以应用它,并确信我们平均会获得相似的性能。
这是一个思维的转变,可能需要一些时间来适应。
这也是现代 AutoML(自动机器学习)技术背后的哲学,这些技术将应用机器学习视为一个大型组合搜索问题。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
总结
在本教程中,您了解了应用于机器学习的建模流水线。
具体来说,你学到了:
- 应用机器学习不仅是为了找到一个表现良好的模型;它还需要找到一个适当的数据准备步骤序列以及预测后处理步骤。
- 总而言之,解决预测建模问题所需的操作可以被视为一个原子单元,称为建模流水线。
- 通过建模流水线的视角来处理应用机器学习,需要改变思维方式,从评估特定的模型配置转向评估转换和算法的序列。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
对一个不太受欢迎的主题进行了非常好的解释。我很高兴我们已经完成了大部分步骤,同时也了解了一些新概念。
谢谢。
我非常感谢您分享的一切。机器学习在解开消费者偏好之谜方面起着至关重要的作用。非常有用的帖子。
谢谢你。
我非常感谢这篇优秀的文章,它与我的主题相关。这里有关于文章主题的深入描述,对我帮助更大。
谢谢,很高兴听到这个。
感谢这个精彩的系列。
我之所以使用 make_pipeline,部分原因是我希望使用 make_column_transformer 中提供的缩放器。当我使用 TransformedTargetRegressor 作为流水线的一部分时,这对我来说很有效,但我的目标是使用 RNN。
我尝试将 LSTM、RNN 和 SimpleRNN 层添加到我的流水线中,但它们似乎失败了,因为它们既没有 fit() 函数也没有 transform() 函数。我收到了“Pipeline 的最后一步应实现 fit”的错误。
有没有办法让 RNN 在流水线中工作?或者,有没有办法在流水线之外使用 make_column_transformer?
也许手动执行每个数据准备对象的转换会更容易。
感谢您这篇很棒的文章,对概念有很好的解释。
不客气!
一如既往,谢谢您的文章。
我每次在您以前的文章中提到流水线时,总是感到困惑。通常当您谈论某事时(例如,文章提到交叉验证,然后您提供指向您关于它的文章的链接)。使用搜索栏,我发现这篇关于流水线的文章相当新。如果可能,将来当您更新提到流水线的文章时,可以将其作为参考链接。希望可以避免像我这样的困惑。
再次感谢,您的博客对我的机器学习学习非常有帮助。
感谢您的建议!
请我是一名学生,正在进行一项关于评估用于移动恶意软件检测的机器学习分类器的研究,从研究中我发现,处理如此大量的数据需要关于如何使用建模流水线来简化工作的指导。谢谢。
感谢 Ahmadu 的反馈!
我通常建议使用可以容纳在内存中的数据集的一小部分样本。
我之所以推荐这样做,是因为它会加速你了解问题。
测试问题的不同框架速度很快。
汇总和绘制数据速度很快。
测试不同的数据准备方法速度很快。
测试不同类型的模型速度很快。
测试不同的模型配置速度很快。
你从较小样本中学到的经验教训通常(但并非总是)可以转化为使用较大数据集进行建模。
然后,你可以在以后扩展模型以使用整个数据集,也许可以在 Amazon EC2 等云基础设施上进行训练。
如果你对使用大型数据集进行训练感兴趣,还有许多其他选项。我在这篇博文中列出了 7 个想法
处理机器学习大型数据文件的 7 种方法
你好,我想确认我是否理解正确。
-要制作最终模型(不使用流水线),我们将整个数据与确定的超参数配置一起拟合到模型中。
-要制作最终的流水线模型,我们将整个数据拟合到流水线中,并通过使用 GridSearchCV 再次搜索最佳超参数配置。
你好 Timotius…你的理解是正确的!我建议你按照你的建议进行,并告诉我们你的发现。