为什么每次在机器学习中获得不同的结果?

一、基础知识:

在应用机器学习中,我们对数据集运行机器学习“算法”以获得机器学习“模型”。然后可以根据训练期间未使用的数据评估模型,也可以根据训练期间未看到的新数据对模型进行预测。

  • 算法:程序在产生模型的数据上运行(例如,训练或学习)。
  • 模型:用于对数据进行预测的数据结构和系数。

有监督的机器学习意味着我们有带有输入和输出变量(列)的示例(行)。我们无法编写代码来预测给定输入的输出,因为它太难了,因此我们使用机器学习算法来学习如何根据给定历史示例的输入来预测输出。

这就是所谓的函数逼近,我们正在学习或寻找一种函数,该函数以一种具有技能的方式将输入映射到我们的特定预测任务上的输出,这意味着映射的性能优于随机的,理想情况下,其性能优于所有其他函数我们尝试过的算法和算法配置。

  • 监督学习:自动学习从输入示例到输出示例的映射功能。

从这个意义上讲,机器学习模型是我们打算用于某些项目或应用程序的程序;碰巧的是,该程序是从示例中学习的(使用算法),而不是使用if语句等明确编写。这是一种自动编程。

  • 机器学习模型:从历史数据中自动学习的“程序”。

与我们可能习惯的编程不同,这些程序可能不是完全确定的。

每次训练机器学习模型时,它们可能会有所不同。反过来,模型可能会做出不同的预测,并且在进行评估时,模型可能会具有不同级别的错误或准确性。

至少在四种情况下会得到不同的结果;他们是:

  • 由于训练数据的差异,结果不同。
  • 由于随机学习算法,结果不同。
  • 由于随机评估程序,结果不同。
  • 由于平台不同,结果不同。

以下做详细叙述。

二、训练集导致的差异

当对不同的数据运行相同的算法时,您将获得不同的结果。

这称为机器学习算法的方差。可能在偏差方差折衷的背景下听说过它。

方差是算法对训练期间使用的特定数据的敏感程度的度量。

  • 方差:算法对训练期间使用的特定数据的敏感程度。

较敏感的算法具有较大的方差,这将导致模型中的差异更大,进而导致模型的预测和评估。相反,敏感性较低的算法具有较小的方差,将导致具有不同训练数据的结果模型的差异较小,进而导致结果的预测和模型评估的差异较小。

与方差少的算法相比,方差大的算法通常需要更多的训练数据。如果我们考虑从输入和输出以及大数定律近似映射函数的模型,这是显而易见的。

但是,当在不同的训练数据上训练机器学习算法时,将获得具有不同行为的不同模型。这意味着不同的训练数据将给出做出不同预测并具有不同性能估计(例如误差或准确性)的模型。

结果差异的多少将与每种模型的训练数据的差异以及选择的特定模型和模型配置的差异有关。

如何解决?

通常可以通过更改算法的超参数来减少模型的方差。

例如,ķ在ķ -nearest邻居控制算法,的方差,其中相同的较小的值k = 1周时的结果在高方差和像大的值K = 21结果在低方差。

可以通过更改算法来减少方差。例如,较简单的算法(如线性回归和逻辑回归)的方差比其他类型的算法低。

还可以通过增加训练数据集的大小来使用高方差算法来降低方差,这意味着可能需要收集更多数据。

三、学习算法造成的差异

由于学习算法的性质,在相同数据上运行相同算法时,可能会得到不同的结果。

这是阅读本教程的最可能原因。

在相同的数据集上运行相同的代码,并得到一个模型,该模型每次都会做出不同的预测或具有不同的性能,并且我们可能认为这是一个错误或其他问题。
这不是一个错误,这是一个功能。

一些机器学习算法是确定性的。就像习惯的编程一样。这意味着,当给该算法相同的数据集时,它每次都会学习相同的模型。一个例子是线性回归或逻辑回归算法。

有些算法不是确定性的;相反,它们是随机的。这意味着他们的行为包含了随机性。

随机并不意味着随机。随机机器学习算法无法学习随机模型。他们正在学习基于提供的历史数据的模型。相反,算法在学习过程中做出的特定小决定可以随机变化。

其影响是,每次随机机器学习算法在相同数据上运行时,它都会学习略有不同的模型。反过来,模型可能会做出稍微不同的预测,并且在使用误差或准确性进行评估时,其性能可能会稍有不同。

有关随机性及其在机器学习中的含义的更多信息,请参见教程:
随机学习在机器学习中意味着什么?

将随机性添加到算法做出的某些决策中,可以提高对于复杂问题的性能。用来自域的有限数据样本来学习监督学习映射功能是一个非常困难的问题。

为数据集找到良好或最佳的映射函数是一种搜索问题。我们测试了定义搜索空间形状的不同算法和测试算法配置,并为我们提供了搜索空间的起点。然后,我们运行算法,然后将搜索空间导航到单个模型。

添加随机性可以帮助避免找到好的解决方案,并帮助您在搜索空间中找到真正好的解决方案。它们使模型能够逃脱学习算法可能获得的局部最优或欺骗性局部最优,并帮助找到更好的解决方案,甚至是全局最优。

有关将监督学习视为搜索问题的更多信息,请参见教程:
对应用机器学习作为搜索问题的简要介绍

在学习过程中使用随机性的算法示例是:神经网络。它以两种方式使用随机性:

  • 随机初始权重(模型系数)。
  • 每个时期随机洗牌。

神经网络(深度学习)是一种随机的机器学习算法。随机初始权重允许模型尝试从每种算法运行的搜索空间中的不同起点进行学习,并允许学习算法在学习过程中“打破对称性”。训练期间随机随机播放示例可确保每个梯度估计和权重更新略有不同。

另一个示例是诸如装袋之类的随机的集成机器学习算法

训练数据集的采样过程中使用了随机性,以确保为集合中的每个贡献成员准备不同的决策树。在集成学习中,这称为集成多样性,是一种模拟来自单个训练数据集的独立预测的方法。

如何解决?

学习算法使用的随机性可以控制。

例如,设置伪随机数生成器使用的种子,以确保算法每次运行都具有相同的随机性。

对于教程而言,这可能是一个很好的方法,但实际上却不是一个很好的方法。导致出现以下问题:

伪随机数生成器的最佳种子是什么?
随机机器学习算法没有最好的种子。正在与算法的本质作斗争,从而迫使随机学习具有确定性。

可以假设使用固定种子来适合最终模型,以确保在进行任何部署前系统测试之前,在生产之前使用相同的数据创建相同的模型。但是,一旦训练数据集发生更改,模型就会更改。

更好的方法是接受机器学习算法的随机性。

考虑到您的数据集没有单一模型。而是有一个随机过程(算法管道)可以为你的问题生成模型。

然后,可以将这些模型(算法流水线)的性能概括为平均预期误差或准确度以及标准偏差的分布。

最后,可以通过在数据集上拟合多个最终模型并在需要对新数据进行预测时对它们的预测取平均来确保达到模型的平均性能。

四、评估程序造成的差异

由于评估程序,使用相同的数据运行相同的算法时,可以获得不同的结果。

两种最常见的评估程序是训练测试集拆分k重交叉验证

训练测试集拆分涉及随机分配给任一用来行训练模型或评估模型,以满足预定义的训练或测试集的大小。

有关训练测试拆分的更多信息,请参见教程:
训练测试拆分以评估机器学习算法

k重交叉验证过程涉及将数据集划分为k个不重叠的分区,并使用一个折叠作为测试集,使用所有其他折叠作为训练集。将模型拟合到训练集上,并在保留倍数上进行评估,然后重复此过程k次,为每个折叠提供用作保留倍数的机会。

有关k折交叉验证的更多信息,请参见教程:
K折交叉验证

这两种模型评估程序都是随机的。

同样,这并不意味着它们是随机的;这意味着在此过程中做出的小决定涉及随机性。具体而言,选择将哪些行分配给数据的给定子集。

这种随机性的使用是功能,而不是错误。

在这种情况下,使用随机性可使重新采样近似于模型性能的估计值,而该估计值与从该域提取的特定数据样本无关。这种近似是有偏差的,因为我们只有一小部分数据样本需要处理,而不是一整套可能的观察结果。

当根据训练期间未看到的数据在域中进行预测时,性能估计可提供模型预期或平均能力的想法,至少在理想情况下。

这样,对确定性机器学习算法的每次评估(例如线性回归或逻辑回归)都可以给出错误或准确性的不同估计。

如何解决?

这种情况下的解决方案非常类似于随机学习算法的情况。

伪随机数生成器的种子可以是固定的,也可以包含过程的随机性。

与随机学习算法不同,这两种解决方案都非常合理。

如果要在预测建模任务上对大量机器学习算法和算法配置进行系统评估,则固定评估过程的随机种子可能是一个好主意。任何值都可以。

想法是,将以相同的方式评估每个候选解决方案(每种算法或配置)。这确保了之间的比较。如果需要,它还允许稍后使用配对的统计假设检验,以检查算法之间的差异是否在统计上有意义。

拥抱随机性也是合适的。这涉及多次重复评估程序,并报告绩效得分分布的摘要,例如平均值和标准偏差。

进行重复评估的偏向性最低的方法可能是使用重复的k倍交叉验证,例如常见的10倍(3×10)的三个重复,或两倍(5×2)的五个重复。在将算法与统计假设检验进行比较时通常使用。

有关使用统计假设检验比较算法的简要介绍,请参见教程:
比较机器学习算法的统计显着性检验

有关将平均算法性能与假设检验进行比较的教程,请参见该教程:
机器学习算法比较的假设检验

五、平台造成的差异

当在不同计算机上对相同数据运行相同算法时,可以得到不同的结果。

即使修复随机数种子以解决学习算法和评估过程的随机性,也会发生这种情况。

在这种情况下,原因是用于运行示例的平台或开发环境,结果通常在次要方面有所不同,但并非总是如此。

这包括:

  • 系统架构的差异,例如CPU或GPU。
  • 操作系统的差异,例如MacOS或Linux。
  • 基础数学库中的差异,例如LAPACK或BLAS。
  • Python版本中的差异,例如3.6或3.7。
  • 库版本中的差异,例如scikit-learn 0.22或0.23。

机器学习算法是一种数值计算。

这意味着它们通常涉及大量带有浮点值的数学运算。架构和操作系统等方面的差异可能会导致舍入误差的差异,从而使轮次误差与执行的计算数量相加,从而得出非常不同的结果。

此外,库版本的差异可能意味着错误的修复和功能的改变,也可能导致不同的结果。

此外,这也解释了为什么在由不同语言(例如R和Python)实现的同一台计算机上使用同一算法获得相同结果的原因。实现上的细微差异和/或所使用的基础数学库中的细微差异将导致结果模型和该模型做出的预测方面的差异。

如何解决?

这并不意味着可以将平台本身视为超参数,并针对预测性建模问题进行了调整。

相反,这意味着该平台是评估机器学习算法时的重要因素,应该固定或完整描述该平台,以确保从开发到生产或报告学术研究的性能时具有完全可重复性。

一种方法可能是使用虚拟化,例如docker或虚拟机实例,以确保环境保持恒定,如果完全可重复性对项目至关重要。

实际上,只要主要软件版本的匹配良好或足够接近,差异通常很小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值