有了像scikit-learn和Keras这样易于使用的机器学习库,在给定的预测建模数据集上拟合许多不同的机器学习模型是相当直接的。
因此,应用机器学习所面临的挑战是如何在一系列可用于您问题的不同模型中进行选择。
乍一看,您可能认为模型性能就足够了,但您是否应该考虑其他因素,例如模型训练需要多长时间,或者向项目干系人解释它的难易程度。如果选定的模型必须运行数月或数年,那么他们的担忧就会变得更加紧迫。
另外,您究竟在选择什么:是仅选择用于拟合模型的算法,还是选择整个数据准备和模型拟合的流程?
在本文中,您将了解机器学习模型选择的挑战。
阅读本文后,你将了解:
- 模型选择是为预测建模问题从许多候选模型中选择一个的过程。
- 在进行模型选择时,除了模型性能之外,可能还有许多相互竞争的考虑因素,例如复杂性、可维护性和可用资源。
- 模型选择的两个主要技术类别是概率度量和重采样方法。
让我们开始吧。

机器学习模型选择的简要介绍
照片由Bernard Spragg. NZ拍摄,保留部分权利。
概述
本教程分为三个部分;它们是:
- 什么是模型选择
- 模型选择的考虑因素
- 模型选择技术
什么是模型选择
模型选择是从一组候选机器学习模型中为训练数据集选择一个最终机器学习模型的过程。
模型选择可以应用于不同类型的模型(例如逻辑回归、SVM、KNN 等),也可以应用于配置了不同模型超参数的同一类型模型(例如 SVM 中的不同核)。
当我们拥有各种不同复杂度的模型时(例如,不同多项式次数的线性或逻辑回归模型,或具有不同 K 值的 KNN 分类器),我们应该如何选择正确的模型?
— 第 22 页,《机器学习:概率视角》,2012 年。
例如,我们可能有一个数据集,我们有兴趣为其开发分类或回归预测模型。我们事先不知道哪种模型在该问题上表现最好,因为这是不可知的。因此,我们对问题拟合并评估一系列不同的模型。
模型选择是从模型中选择一个模型作为解决该问题的最终模型的流程。
模型选择不同于模型评估。
例如,我们评估或评价候选模型以选择最佳模型,这就是模型选择。而一旦选择了模型,就可以对其进行评估,以传达它在一般情况下预期的表现如何;这就是模型评估。
评估模型性能的过程称为模型评估,而选择模型合适灵活性水平的过程称为模型选择。
— 第 175 页,《统计学习导论:在 R 中的应用》,2017 年。
模型选择的考虑因素
拟合模型相对直接,尽管在模型之间进行选择是应用机器学习的真正挑战。
首先,我们需要抛弃“最佳”模型的观念。
考虑到数据中的统计噪声、数据样本的不完整性以及每种不同模型的局限性,所有模型都有一定的预测误差。因此,“完美”或“最佳”模型的概念是没有用的。相反,我们必须寻找一个“足够好”的模型。
在选择最终模型时,我们关心什么?
项目干系人可能有特定要求,例如可维护性和有限的模型复杂性。因此,可能更倾向于选择一个技能较低但更简单易懂的模型。
或者,如果模型技能比其他所有方面都更重要,那么无论涉及多少计算复杂性,都将优先考虑模型在样本外数据上表现良好的能力。
因此,“足够好”的模型可能意味着许多事情,并且因您的项目而异,例如
- 符合项目干系人要求和限制的模型。
- 在可用时间和资源的情况下,模型足够有效。
- 与朴素模型相比,模型足够有效。
- 相对于其他测试模型,模型足够有效。
- 相对于行业最佳实践,模型足够有效。
接下来,我们必须考虑选择的是什么。
例如,我们不是选择一个已拟合的模型,因为所有模型都将被丢弃。这是因为一旦我们选择了模型,我们将使用所有可用数据拟合一个新的最终模型,并开始使用它进行预测。
因此,我们是在选择用于在训练数据集上拟合模型的算法吗?
有些算法需要专门的数据准备,以便最好地揭示问题的结构以供学习算法使用。因此,我们必须更进一步,将模型选择视为在模型开发流程之间进行选择的过程。
每个流程都可能接受相同的原始训练数据集,并输出一个可以以相同方式评估的模型,但可能需要不同或重叠的计算步骤,例如
- 数据过滤。
- 数据转换。
- 特征选择。
- 特征工程。
- 等等…
您越深入研究模型选择的挑战,就会发现越多细微之处。
现在我们熟悉了模型选择的一些考虑因素,让我们回顾一些常见的模型选择方法。
模型选择技术
模型选择的最佳方法需要“足够”的数据,这可能几乎是无限的,具体取决于问题的复杂性。
在这种理想情况下,我们会将数据分为训练集、验证集和测试集,然后在训练集上拟合候选模型,在验证集上评估和选择它们,并在测试集上报告最终模型的性能。
如果我们在数据丰富的情况下,最佳方法 [...] 是将数据集随机分为三部分:训练集、验证集和测试集。训练集用于拟合模型;验证集用于估计模型选择的预测误差;测试集用于评估最终选定模型的泛化误差。
— 第 222 页,《统计学习要素:数据挖掘、推理和预测》,2017 年。
鉴于我们很少有足够的数据,或者能够判断什么是足够的,因此在大多数预测建模问题中这都是不切实际的。
然而,在许多应用中,用于训练和测试的数据供应将是有限的,并且为了构建良好的模型,我们希望尽可能多地利用可用数据进行训练。但是,如果验证集很小,它将提供相对嘈杂的预测性能估计。
– 第 32 页,《模式识别与机器学习》,2006 年。
相反,有两种主要的技术可以近似理想的模型选择情况;它们是
- 概率度量:通过样本内误差和复杂性选择模型。
- 重采样方法:通过估计的样本外误差选择模型。
让我们依次仔细看看每一个。
概率度量
概率度量涉及使用模型在训练数据集上的性能和模型的复杂性来分析性地评估候选模型。
众所周知,训练误差是乐观偏差,因此不是选择模型的良好基础。性能可以根据训练误差的乐观程度进行惩罚。这通常通过特定于算法的方法来实现,通常是线性的,它会根据模型的复杂性来惩罚得分。
历史上,人们提出了各种“信息准则”,试图通过添加一个惩罚项来补偿最大似然的偏差,以弥补更复杂模型过拟合的问题。
– 第 33 页,《模式识别与机器学习》,2006 年。
参数较少的模型参数更不复杂,因此更受青睐,因为它平均而言可能泛化得更好。
四个常用的概率模型选择度量包括
- 赤池信息准则 (AIC)。
- 贝叶斯信息准则 (BIC)。
- 最小描述长度 (MDL)。
- 结构风险最小化 (SRM)。
当使用线性回归或逻辑回归等更简单的线性模型时,概率度量是适用的,因为模型复杂性惩罚(例如样本内偏差)的计算是已知的且可处理的。
重采样方法
重采样方法旨在估计模型(或更准确地说,模型开发流程)在样本外数据上的性能。
这是通过将训练数据集划分为子训练集和测试集,在子训练集上拟合模型,并在测试集上进行评估来实现的。然后,此过程可以重复多次,并报告每次试验的平均性能。
它是模型在样本外数据上性能的蒙特卡罗估计的一种,尽管每次试验不完全独立,因为根据所选的重采样方法,相同的数据可能在不同的训练数据集中出现多次,或者出现在测试数据集中。
三种常见的重采样模型选择方法包括
大多数情况下,概率度量(在前一节中描述)是不可用的,因此使用重采样方法。
迄今为止,最受欢迎的是交叉验证系列方法,其中包含许多子类型。
估计预测误差最简单且最广泛使用的方法可能是交叉验证。
— 第 241 页,《统计学习要素:数据挖掘、推理和预测》,2017 年。
一个例子是广泛使用的 k 折交叉验证,它将训练数据集划分为 k 折,其中每个样本仅在测试集中出现一次。
另一个是留一法 (LOOCV),其中测试集由单个样本组成,每个样本都有机会成为测试集,这需要构建和评估 N(训练集中样本的数量)个模型。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
教程
书籍
- 应用预测建模, 2013.
- 《统计学习要素:数据挖掘、推理和预测》, 2017.
- 《统计学习导论:R语言应用》(An Introduction to Statistical Learning: with Applications in R), 2017.
- 模式识别与机器学习, 2006.
- 机器学习:概率视角, 2012.
文章
总结
在本文中,您了解了机器学习模型选择的挑战。
具体来说,你学到了:
- 模型选择是为预测建模问题从许多候选模型中选择一个的过程。
- 在进行模型选择时,除了模型性能之外,可能还有许多相互竞争的考虑因素,例如复杂性、可维护性和可用资源。
- 模型选择的两个主要技术类别是概率度量和重采样方法。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
你好 Jason,
我已安装 Tensorflow:2.0.0-alpha0。我需要升级到 tensorflow 2.0 吗?
如何将其从 alpha0 升级到新版本?(或者最好保持原样?)。
我找不到任何关于升级它的文章 🙁
谢谢,
Marco
这将是一个好主意。
直接重新安装 tensorflow 即可。如果您遇到问题,请参阅此内容
https://machinelearning.org.cn/setup-python-environment-machine-learning-deep-learning-anaconda/
这是一个很棒的教程。
非常感谢。
谢谢,很高兴它有帮助。
嘿 Jason。您的网页至今对我帮助很大,让我在非本专业的领域里选择了机器学习并写了学术论文。但问题是,所有基础的 Python 书籍、深度学习书籍和 YouTube 都未能解释清楚我应该使用哪种模型,或者我的输入/输出 Excel 表格会是什么样子。现在几周前我发现了您的网页,并开始更系统地学习。这很好。但是,我还没有找到如何将我的输入传递给模型,以及需要使用哪个函数 API。这里是对我需要构建的模型和 Excel 文件的简要说明:
有 20 个 c 和 p 值,它们将成对应用于查看在 x 和 y 轴上发生了多少位移 (z)。
输入选项卡 = 第 1 行有 2 个变量 (c, p) 和每个变量的 20 个值。
x 坐标选项卡 = 第 1 行只是一个索引 A~T,其中包含 (c, p) 对的 20 个输入(因此是 20 列)。以及 60 行 x 坐标。
y 坐标选项卡 = 第 1 行只是一个索引 A~T,其中包含 (c, p) 对的 20 个输入(因此是 20 列)。以及 60 行 y 坐标。
位移选项卡 = 第 1 行是“位移”,只有 1 列。
感谢您的阅读。任何进一步阅读的关键词或页面链接都将不胜感激!
顺便说一句,我的一位硕士学位的朋友(我的导师指派他帮助我的论文)已经在 Matlab 中解决了这个问题,但我不懂 Matlab,我想用 Python 构建自己的模型,越简单越好。
他的论文似乎是关于:代理模型、响应面方法、降阶模型。等等(天哪!)
也许和你的导师讨论一下——毕竟那是他们的工作?
Jason,感谢您的链接。我会仔细研究它们。看起来我可以在那里获得很多信息!🙂
顺便说一句,我试图通过将我的数据与 MNIST 数据进行比较来理解它,我找到了相对较多的教程,因此我对它们更熟悉一些。
让我想象一下,如果我将手写数字的 28x28 像素图像数据放入 Excel。那么会有 784 列,每列都会提供颜色值范围从 0~255 的信息。如果我有 100 个图像文件,那么就会有 100 行。这个输入 Excel 选项卡将进入一个分类模型。第一隐藏层有 100 个节点。然后输出是 10(0~9 的数字),所以从最后一层隐藏层到输出层的节点数将是 10。到目前为止,我是否正确理解了 MNIST?
然后我尝试用同样的方式来理解我的数据。以下是它们之间的比较。
输入层:784 列/100 行 -> 2 列/20 行
到第一个隐藏层的节点数:100 -> 20
输出层:1 列/10 行 -> 1 列/120 行
(我不知道如何处理我的 x、y 选项卡)
请告诉我我理解数据的方法有什么问题。也许我应该全部忘记,然后从您提供的链接开始一步一步地做,因为我非常困惑!
附注:我已经问过了。他说我可以问关于 ANN 的问题,但那位硕士学位的人也无法提供帮助,因为他只知道 Matlab 中的 ANN。
我明白了,我确实很困惑。
我意识到节点是层中的一个东西,数据量(100 个图像数据或 20 个 (c, p))与节点或权重无关。
因此,ANN 的蓝图应该是这样的:
输入节点:784 -> 2(如果 c 和 p 应该配对,则为 1?)
输出节点:10 -> x 选项卡和 y 选项卡中每个 x 和 y 轴的 60 个
最简单的模型:?(我认为 Keras 可以满足我的需求,除了“Sequential”)
隐藏层节点:超参数。需要人为地给出一些随机的数量。
隐藏层数量:超参数。需要给出一些随机的数量。
层之间的权重:模型参数。AI 将根据数据决定。(https://machinelearning.org.cn/difference-between-a-parameter-and-a-hyperparameter/)
抱歉,不太明白你的问题。
至于选择节点/层的数量,这可能会有帮助
https://machinelearning.org.cn/faq/single-faq/how-many-layers-and-nodes-do-i-need-in-my-neural-network
感谢 Jason 提供的链接和您的好意:)
不客气。
不确定我能帮上什么忙?
也许这个过程会帮助你解决你的预测建模问题
https://machinelearning.org.cn/start-here/#process
你好,Jason。
感谢您发表这篇精彩的文章。
我有一个问题。
对于回归问题,时间序列数据使用了哪种模型选择方法?
以便保持其时间顺序。
我正在尝试比较 SARIMA、MLP、1D-CNN 和 LSTM 模型。
谢谢。
也许选择误差最低的模型,通过前向验证。
非常感谢,先生。
我会试试的。
嗨,Jason,
如何使深度学习中的模型更复杂。例如,使用 2 个 LSTM 和 1 个 GRU 以及注意力层。对 10000 个数据文件进行训练以进行预测
谢谢你
按您喜欢的方式堆叠层。
亲爱的,
我非常喜欢您的帖子,并且我已经购买了您的所有书籍:)。现在我专注于联邦(机器学习)学习,我知道在 FML 或 FL 中,我们在客户端训练模型。我的问题是如何为我们的 FD 问题选择第一个初始模型?我们需要使用例如交叉验证来完成所有评估步骤来选择最佳机器学习模型(使用不同模型进行训练和测试)吗?当我们确定了哪个模型最适合我们当前的问题后,选择它作为初始模型,将其发送到我们的客户端,然后在客户端设备上进行训练?
提前感谢,
此致,
Bahar
我认为您的描述是正确的。交叉验证总是让我们对模型选择有信心。但是对于联邦学习,我认为它对错误或次优模型更宽容,因为有其他模型可以纠正一个客户端的错误(就像集成学习一样)。
嗨,Jason,
感谢您撰写这篇文章。内容非常丰富。
有一个“一个标准误差”规则,用于与交叉验证一起考虑复杂性以及
用于模型选择的性能。它有助于选择一个最简洁的模型,其预测误差不会比其最小验证误差差很多。您会建议将其用于回归任务吗?
此致
你好 Mohammad…是的,在交叉验证中使用“一个标准误差”规则进行回归任务通常是推荐的。该规则允许选择一个更简单的模型,如果其性能在一个标准误差内,则接近通过交叉验证找到的最佳模型。这种方法特别有益,因为它平衡了模型复杂性和泛化误差,有助于防止过拟合,同时仍能实现稳健的预测性能。
实施此规则涉及选择一个最简单的模型,其验证误差不比性能最佳的模型差很多。这种方法促进了模型简洁性和稳健性,这在许多实际应用中都是有价值的属性,特别是在容易过拟合的回归任务中。
嗨 James,
感谢您的回复。确实,这是一个有趣的方法。但是,我很好奇它在寻找不同类型的模型(例如,线性回归、决策树和神经网络)的最佳模型方面有多好。我遇到的文献大部分只使用它来查找同一类型模型中的最佳模型。如果您遇到任何实施它来查找不同模型类型之间最佳模型的来源,请分享。
此致