当前位置:   article > 正文

[ML]机器学习_模型评估_交叉验证误差远大于训练误差

交叉验证误差远大于训练误差

目录

前言

一、模型评估

1、评估使用平方误差代价函数的线性回归问题

2、评估分类问题

3、模型选择

4、交叉验证测试集法

二、偏差与方差

1、通过偏差与方差评估模型

2、正则化对偏差和方差的影响

三、学习曲线

1、制定性能评估的基准

2、学习曲线

四、神经网络解决偏差与方差问题

1、解决办法的总结

2、神经网络解决偏差和方差问题


前言

如果我们运行模型时,发现这个模型预测的结果不准,则通常有如下对策:

        1、获得更多训练示例

        2、减少那些影响较小的特征

        3、使用特征工程添加特征

        4、减小或者增大正则化项中的\lambda

        通过模型评估可以得到一些诊断,能够得知,是否值得花费数周甚至数月时间收集更多训练数据来提高性能。


一、模型评估

        模型评估是指对机器学习模型进行评估,以确定其预测准确性和性能。评估模型可以帮助我们判断模型是否可以很好地处理预测任务,以及确定是否需要改进模型。

常用的模型评估方法包括:

1、留出法

留出法是最简单、最常用的模型评估方法之一,它是将原始数据集随机划分成训练集和测试集,然后用训练集训练模型,用测试集验证模型性能。通常将数据集的70% ~ 80%作为训练集,剩余的20%~30%作为测试集。

优点:简单易行,不需要进行复杂的计算。

缺点:可能会出现偏差。由于每次的划分都不同,所以评估结果可能会存在较大的差异。

2、交叉验证法

交叉验证法是常用的模型评估方法之一,它将数据集分成K份,每次选择其中1份作为测试集,其他K-1份作为训练集,重复K次,最后取平均值作为模型的评估指标。常用的交叉验证方式包括k折交叉验证、留一交叉验证等。

优点:评估结果相对较可靠,可以检测出模型的泛化能力。

缺点:计算量较大,时间较长。

3、自助法

自助法是在留出法有偏的情况下采用的一种评估方法,它采用自助采样(即从原始数据集中有放回的随机采样)来产生新的数据集,用于训练和测试。在这个过程中,每个样本被选中的概率是1/N,未被选中的概率是(1-1/N)。

优点:数据集的利用率高,可以通过多次自助采样来得到不同的数据集用于训练,提高模型的稳定性和可靠性。

缺点:样本数量较少时,自助法可能会引入较大的噪声。

4、Bootstrap法

Bootstrap法是一种利用自助采样的重抽样技术,用于估计量的标准误差和置信区间。它利用有放回的随机采样方式,从原始数据集中抽取一定数量的样本,然后重复抽样M次,得到M个新的数据集,再利用这些数据集进行训练和测试。

优点:可以利用多个数据集来验证模型的性能。

缺点:需要进行多次模型训练和测试,计算量较大。

5、排除一法

排除一法是在留出法有限制的情况下采用的一种评估方法,它是在训练集和测试集中排除某个样本,用剩下的样本进行训练和测试,重复N次,然后取平均测试误差。

优点:可以有效地利用数据,降低了随机性和噪声的影响。

缺点:计算量大,时间较长。在样本数量较少的情况下,可能会出现较大的误差。

1、评估使用平方误差代价函数的线性回归问题

        将训练集按照比例分为两个子集(可能是7:3也可能是8:2),比例大的部分作为训练集,比例小的部分作为测试集。

首先通过最小化代价函数J来拟合参数

然后为了说明这个模型的表现如何,计算J_{test},它等于测试集上的均方误差

训练误差J_{train}衡量模型在训练集上的表现,等于训练集上的均方误差

         在示例模型中,J_{train}会很低,因为训练示例的平均方差将为零或非常接近于零,但是如果在测试集中有一些例子没有被训练过,且这些例子与预测的数据存在很大的偏差,因此J_{test}会变得很高,这意味着尽管模型在训练集上表现出色,但是实际上并不能很好的将新示例泛化到不在训练集中的新数据点。

2、评估分类问题

与线性回归问题类似,可以通过最小化代价函数来拟合参数以找到参数w,b

        当机器学习应用于分类问题时,还有一种可能更常用的J_{test}J_{train}的定义,相比于之前计算测试集和训练集上的误差的两个公式,更常用模型分类错误的次数除以总的预测次数来表示误差

notes:

        通过计算J_{test}J_{train},可以衡量模型在测试集和训练集上的表现

        此过程是能够自动选择用于给定机器学习应用程序的模型的一个步骤

3、模型选择

        一旦模型的参数w和b已经适配了训练集,此时训练误差J_{train}可能不能很好的表明算法效果如何,或者算法对不在训练集中的新例子的泛化能力如何。测试误差J_{test}能更好地指示模型在新数据上的表现。

        如果拟合一个函数来预测房价或其他一些回归问题,可能会需要拟合一条线性模型。在上图中使用d来指代多项式阶数,如d=1表示一个一阶多项式。如果将这样的模型拟合到训练集中,则会得到一些参数w和b,然后计算 J_{test}来估计它对新数据的泛化效果如何。

        此时可以尝试计算上图中所有模型地J_{test},然后选择最小值的多项式。但是这很可能是对泛化误差的乐观估计,因为还是基于测试集来选择最合适的d的值,测试集本来就不够全面,那么这个d非常契合这个测试集,在该测试集上对应的误差也要更小,它可能低于实际估计的泛化误差,过度追求现有数据的准确性。

        选择模型的标准是泛化能力,泛化能力是针对其他未出现的数据的拟合能力,而这里测试集已经用于选择模型,等于做题先看了答案,与标准冲突。

4、交叉验证测试集法

        交叉验证测试集法(Cross-Validation)是一种常见的模型评估方法,用于评估模型对新样本的泛化能力。其基本思想是将数据集分为k等份(通常取k=5或k=10),选择其中的一份作为测试集,其余k-1份作为训练集,然后用训练集训练模型,在测试集上进行评估,重复该过程k次,每次选取不同的测试集。最终将k次实验的评估结果取平均值作为模型的性能指标。

        交叉验证测试集法的优点在于,可以充分利用数据集,降低了评估结果的方差,提高了评估结果的稳定性和可靠性。同时,该方法可以有效避免过拟合和欠拟合的问题,提高了模型的泛化性能。不足之处在于,计算量较大,需要进行多次模型训练和测试。

交叉验证测试集法的实现步骤如下:

  1. 将数据集分为k等份。

  2. 对于每个k,轮流将其中一份作为测试集,其他k-1份作为训练集。

  3. 在训练集上训练模型。

  4. 在测试集上测试模型,并记录评估结果。

  5. 重复步骤2~4,直到每个k都被用作测试集。

  6. 计算k次实验的评估结果的平均值,作为模型的性能指标。

        在Python中,可以使用scikit-learn库中的cross_val_score函数来实现交叉验证测试集法。示例代码如下:

  1. from sklearn.model_selection import cross_val_score
  2. from sklearn.tree import DecisionTreeClassifier
  3. from sklearn.datasets import load_iris
  4. # 加载数据集
  5. iris = load_iris()
  6. # 定义决策树分类器
  7. clf = DecisionTreeClassifier()
  8. # 使用交叉验证测试集法评估模型
  9. scores = cross_val_score(clf, iris.data, iris.target, cv=5)
  10. # 输出模型评估结果
  11. print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

        在上述代码中,load_iris函数用于加载iris数据集,DecisionTreeClassifier函数定义决策树分类器,cross_val_score函数用于进行交叉验证测试集评估,其中参数cv=5表示采用5折交叉验证评估。最后,输出模型的平均分类准确率和标准差。

举例说明:

         将数据分为三个不同的子集:训练集,交叉验证集、测试集。

        交叉验证集cross validation,也成为验证集validation set 或开发集dev set ,它是一个额外的数据集,用来检查或信任检查不同模型的有效性或真实性。

        在数据训练集、交叉验证集、和测试集的这三个子集上,可以计算训练误差、交叉验证误差和测试误差。

         与模型选择中示例相同,可以使用10个模型,拟合参数w和b,在交叉验证集上评估这些参数,并计算J_{cv}。然后为了选择一个模型,比较d等于多少的模型的交叉验证误差最低。最后,想得到该模型在新数据上的泛化误差估计值,则使用数据的第三个子集测试集执行操作,并得出J_{test}

       在整个过程中,使用了训练集拟合参数w和b,然后使用交叉验证集选择参数d或选择多项式的阶数,直到此时,还未将任何参数拟合到测试集,这就是为什么在这个例子中使用J_{test}能公平地估计该模型的泛化误差。

        目的是想让模型和测试集不产生过多联系,从而使得基于测试集计算出的误差值更能客观反映模型精度。

二、偏差与方差

1、通过偏差与方差评估模型

        偏差和方差是评估机器学习模型的重要指标。偏差是指模型对于训练集的拟合能力,直观地说就是模型预测的平均值与实际值之间的偏离程度。方差是指模型在不同训练集上的波动程度,直观地说就是模型对于训练数据的变化的敏感程度。

在评估模型时,需要同时考虑偏差和方差对模型的影响:

  • 高偏差、低方差的模型在训练集上欠拟合,可能无法准确地预测新的数据,需要增加模型的复杂度;
  • 低偏差、高方差的模型在训练集上过拟合,对于新的数据可能会出现较大的误差,需要减少模型的复杂度。

        因此,为了寻找一个好的模型,我们需要在偏差和方差之间寻找平衡点,即找到一个既能够很好地拟合训练数据,又能很好地泛化到新的数据的模型。

        常用的评估模型的方法包括交叉验证和学习曲线。交叉验证可以帮助我们评估模型在不同的训练集和测试集上的表现,从而了解模型的泛化能力和方差;学习曲线可以帮助我们了解模型的偏差,即在训练数据集大小变化时,模型的表现如何变化。

        为了选择合适的模型,我们可以使用到训练集和交叉验证集,如图中的左边,这是高偏差,计算误差值,我们会发现它的训练误差过大,交叉验证误差过大;来看看右边right的模型,这是高方差,它的训练误差很低,交叉验证误差过大;而中间的模型,通过计算你会发现它的训练误差和交叉验证误差都很低,所以它不存在什么高偏差和高方差问题。

        如果我们的学习算法存在高偏差(欠拟合)的时候,关键的指标是它的训练误差J_{train}是否高,这时交叉验证误差J_{cv}一般也会很高;

        如果我们的学习算法存在高方差(过拟合)的时候,关键的指标是它的交叉验证误差J_{cv}是否远大于训练误差J_{train},当我们将一个非常高阶的多项式拟合到一个非常小的数据集时,就会发生这种情况;

notes:        

        高偏差和高方差分别指拟合能力和泛化能力,高阶多项式在训练次数不够的时候会既有高偏差又有高方差,训练神经网络过程中也会有。        

        如果我们的学习算法既存在高偏差又存在高方差的时候,关键的指标是它的训练误差很高,而交叉验证误差远大于训练误差

2、正则化对偏差和方差的影响

        在训练模型时,正则化可以减少模型的方差,因为它限制了模型接受的输入数据的数量。这意味着模型不能过度拟合训练数据,这是造成方差很高的主要原因。通过惩罚复杂的权重和神经元,正则化可以使模型更加简单,从而减少方差。

        另一方面,正则化也可以增加模型的偏差。因为正则化惩罚了权重和神经元,这可能会导致模型偏向于欠拟合。这就是说,模型不能完全学习到训练数据中的所有特征,从而导致模型的表现有所下降。

        综上所述,正则化对偏差和方差都有影响,因此在使用正则化时需要找到一个平衡点,以获得最佳的模型性能。

举例说明:

         在例子中,使用四阶多项式,通过正则化来拟合这个模型。

        Lambda\lambda的值是正则化参数,控制参数在整体中的影响大小来权衡拟合训练数据。

        当Lambda设置成一个非常大的值时,如\lambda =10000,算法就会非常积极地保持这些参数w非常的小,所以最终会得到的参数实际上都非常接近与0,该模型最终的f\left ( x \right )会接近于一个常数值,该模型显然有很高的偏差,而且J_{train}也很大。

        当Lambda设置成一个非常小的值,相当于没有进行正则化,所以只是拟合一个没有正则化的四阶多项式,最终会得到一个过度拟合数据的曲线,该模型会有很高的方差,此时J_{train}很小,但是J_{cv}很大。

        我们想要做的就是找到一个合适的λ值,可以使得模型很好的拟合数据,交叉验证为我们提供了一种方法。

        具体来说,假设Lambda的值,来最小化代价函数,并得到一些参数w和b,然后计算交叉验证误差J_{cv},通过尝试Lambda的大范围可能值,使用这些不同的正则化拟合参数,然后评估交叉验证集的性能,就可以尝试选出正则化参数的最佳值,和参数w,b,最后计算测试集误差J_{test}

        这里的x轴是用正则化参数Lambda的值。

        如果Lambda的值很小甚至为0,在这种情况下模型是有高方差的,那么此时J_{train}会很小而J_{cv}会很大,因为在训练集上表现很好但是交叉验证集上表现很差。

        如果Lambda的值很大,在这种情况下模型是有高偏差的,对数据拟合不好,此时J_{train}会很高而J_{cv}也会很高。

        在正则化优化函数中,Lambda越大,算法越试图保持w的权重变小,对训练集的实际关注就越少,此时J_{train}就会上升。

        如果Lambda的值太小或太大,那么在交叉验证集上表现的都不好,要么左侧欠拟合,要么右侧过拟合,交叉验证所做的就是尝试许多不同的Lambda值,并评估许多不同点的交叉验证误差,然后选择一个具有低交叉验证误差的值,

三、学习曲线

1、制定性能评估的基准

        基准性能水平是指在特定条件下,系统、软件或硬件设备所能达到的性能水平。通俗来说,就是某个系统或设备的最初的、基础的、默认的性能表现。这个性能水平往往是通过测试和测量得出的数据来确定的。

        在软件、硬件或系统的开发和测试中,基准性能水平是非常重要的。它可以作为评估和比较系统性能的基准。通过与基准性能水平相比较,可以确定系统或设备在不同条件下的性能变化,如系统负载增加、数据量增加、用户数量增加等情况下的性能表现,从而进行性能优化和提升。

        为了确定基准性能水平,需要对系统或设备进行一系列的测试和测量。这些测试可以包括性能压力测试、负载测试、响应时间测试等等,通过对这些测试结果进行分析和评估,就可以确定系统或设备的基准性能水平。

        总之,基准性能水平是一个重要的概念,它可以帮助开发团队和用户更好地了解系统和设备的性能表现,并为性能优化提供基础。

举例说明:

        为了判断训练误差是否高,查看训练误差是否远高于人类在当前状况下的表现水平更有用。判断训练误差是否高,通常有助于建立基准性能水平,基准性能水平是指可以合理地希望该学习算法最终能达到的误差水平。

        建立基准水平的一种常见方法是衡量人类在这项任务上的表现,因为人类十分擅长理解语音数据、处理图像或理解文本,当使用非结构化的数据时,人类水平的表现通常是一个很好的基准。

        另一种估计基准性能水平的方法是,如果有一些竞争算法,可能是其他人在以前已经实现的,或者甚至是竞争对手的算法来建立基准性能水平。如果可以访问此基线性能水平,也就是可以合理地希望达到的误差水平是多少,或者希望算法达到的性能水平是多少,然后在判断一个算法是否有高偏差或方差时,就可以看性能的基线水平,以及训练误差和交叉验证误差。

要测量的两个关键量是:

        训练误差和希望达到的基线水平之间的差距是什么,如果差距很大,那么就是一个高偏差问题。

        训练误差和交叉验证误差之间的差距,如果差距过大,那么就是一个高方差问题。

        训练误差比希望达到的基线水平高得多,交叉验证误差和训练误差十分接近,那么就是一个高偏差问题。

总结:前两个数字之间的差距可以判断是否有高偏差问题,后两个数字之间的差距可以判断是否有高方差问题。

2、学习曲线

        机器学习学习曲线是指机器学习算法在不同数据量下的预测准确度和训练误差的变化情况。通常,随着训练数据的增加,模型的预测准确度会逐渐提高,同时训练误差也会逐渐减小。学习曲线可以通过绘制训练集大小和模型性能的关系图来展示。

        学习曲线可以帮助机器学习工程师评估模型的表现,确定模型是否需要更多的数据或更好的特征工程,以优化模型预测能力。当学习曲线的训练误差和测试误差出现逐渐趋近或趋近平稳时,说明模型在当前数据量下已经能达到最佳性能,并且继续增加数据量可能不会进一步提高模型的性能。

        此外,学习曲线还可以帮助机器学习工程师识别过拟合和欠拟合。当模型在训练数据上表现良好,但在测试数据上表现较差时,通常是过拟合的结果。相反,当模型在训练数据和测试数据上表现均不佳时,通常是欠拟合的结果。学习曲线可以帮助机器学习工程师识别这些问题,并通过调整模型参数来解决它们。

        总之,学习曲线是一种非常有用的工具,可以帮助机器学习工程师评估模型性能、识别过拟合和欠拟合,并指导模型优化和优化策略的选择。

        横轴是训练集的数量,纵轴上是误差。

        当训练集数量增大时,学习到一个更好的模型,交叉验证误差下降,但是训练集中示例越多,就越难完美拟合每一个实例,训练误差反而变大了。交叉验证误差通常会高于训练误差。

  • 高偏差或欠拟合情况

        当你拟合简单的线性函数时得到越来越多的训练样本,模型实际上并没有改变那么多,则平均训练误差图像会在训练集数量增加时变平,同样,交叉验证误差会下降,并逐渐变平,是因为模型太简单了无法拟合那么多数据。 

        此时如果有基线性能水平的方法,例如人类水平的性能,那么这个值往往会低于J_{train}J_{cv}。基准性能水平与 J_{train}之间存在很大的差距,这是判断该算法具有高偏差的指标。

        像这种情况,我们如果添加数据集,模型不会有什么改变,直线拟合不会变。

  • 高方差或过拟合情况

       J_{train}会随着训练集的数量增大而上升,交叉验证误差会比训练误差高很多,在训练集上的表现比交叉验证集上要好很多。

        绘制一个基线水平性能,比如人类水平的表现,会发现J_{train}甚至低于人类水平的表现,因为过度拟合训练集时,能得到不切实际的低误差,实际上要比人类做得更好。

        在高方差情况下,增加训练集数量,训练误差将继续上升,但是交叉验证误差会有望下降并接近训练误差J_{train}

总结

        如果学习算法存在高方差,那么获得更多的训练数据确实可能会有所帮助。 

        但是增加训练集样本数量对减少高偏差没有作用。

四、神经网络解决偏差与方差问题

1、解决办法的总结

1)、获得更多训练示例

        若算法具有高偏差的,那么获得更多的训练数据对其问题本身没有帮助。

        若算法具有高方差,比如说对非常小的训练集过度拟合,那么获得更多的训练样本会有很大的帮助。

        获得更多训练示例有助于解决高方差问题。

2)、尝试一组较小的特征

        如果你的学习算法有太多的特征,那么它会给算法带来太多的灵活性,以至于无法适应非常复杂的模型。如果只是消除其中的一些特征,那么模型就不会那么复杂,也不会有那么高的方差。

        消除或减少特征的数量有助于解决高方差问题。

3)、获得额外的特征

        如果模型训练的特征较少时,模型会过于简单而不能很好的预测,会有较高的偏差问题,添加额外的特征会使模型变得复杂,更好的预测数据。

        添加额外的特征会有助于解决高偏差问题。

4)、添加多项式特征

        如果你是线性函数,添加额外的多项式特征如x^{2}_{1}x_{1}x_{2},可以帮助模型在训练集上变现更好。

        添加多项式特征是解决高偏差问题的一种方法。

5)、减小Lambda

        减小Lambda意味着对正则化项使用较低的值,意味着将减少对该项的关注,更多关注前项,尝试在训练集上表现更好。

        减小Lambda可以帮助解决高偏差问题。

6)、增加Lambda

        如果模型原本是过于拟合训练数据了,增加Lambda迫使算法拟合更平滑的函数,是算法更泛化其他新数据。

        增加Lambda可以解决高方差问题。

总结

解决高方差问题的方法:

  1. 获得更多训练示例
  2. 尝试一组较小的特征
  3. 添加多项式特征
  4. 增加Lambda

解决高偏差问题的方法:

  1. 获得额外的特征
  2. 减小Lambda

2、神经网络解决偏差和方差问题

        如果将不同阶的多项式拟合到一个数据集,非常简单的模型可能会有很高的偏差,而复杂的模型就可能会遇到高方差。在偏差和方差之间就需要做一个权衡,选择一个交叉验证误差最低的模型。在这种权衡中,必须平衡多项式次数的复杂性或者正则化参数的大小,让偏差和方差都不会太高。事实证明,神经网络可以有助于权衡偏差和方差之间的问题。

        大型神经网络在小规模中等大小的数据集上训练时是低偏差的,也就是,如果神经网络足够大,就几乎总能很好的适应训练集。这就意味着提供了一种新的方法,可以根据需要尝试减少偏差或减少方差,而无需在两者之间进行权衡。

        神经网络首先先在训练集上训练算法,然后计算J_{train }来对照基准性能水平,评价算法在训练集上表现是否良好,如果表现不佳,就会遇到高偏差问题,即高训练误差。

        减少偏差的方法之一是使用更大的神经网络,更多隐藏层或每层更多的隐藏单元。

        然后继续训练,计算J_{train }来对照基准性能水平,让神经网络越来越大直到该算法在训练集上表现良好。

        解决高偏差问题之后,在交叉验证集上进行验证,评价该算法表现是否良好,也就是该算法是否具有高方差。

        如果该算法在交叉验证集上表现得远不如在训练集上表现得那么好,也就是J_{cv}远大于J_{train},证明该算法可能存在高方差问题。

        降低高方差问题的方法之一就是获得更多的数据,然后返回继续训练模型并仔细检查,直到算法没有高偏差和高方差,这就是一个良好的模型,可以推广到新的例子。

        训练更大的神经网络确实可以减少偏差,但是也会增加计算成本。另外,有时也很难获得更多的数据。

如果神经网络太大了会产生高方差(过拟合)问题吗

        事实证明,具有适当正则化的大型神经网络通常与较小的神经网络表现一样好甚至更好。

        只要我们适当的进行正则化,拥有更大的神经网络几乎没有坏处。一个更大的神经网络可能会减慢代码的运行速度,除此之外不会有什么不好的影响。 

        具有适当正则化的大型神经网络仍然可能产生过拟合问题,但是这种情况比未正则化的模型更少见。正则化有助于抑制模型的过度拟合,通过在代价函数中增加正则化项来减小权重或激活函数的规模,提高模型的泛化能力。但如果模型过于复杂,正则化的效果就会减弱。此外,数据的大小和质量也会影响模型的性能和过拟合的问题。因此,需要在模型构建和数据处理方面找到适当的平衡点,以减轻过拟合的问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/979263
推荐阅读
相关标签
  

闽ICP备14008679号