Deep Learning with Python 读书笔记(五) 机器学习模型的评估

在机器学习中,我们通常都将手中的数据分为3部分:训练数据、验证数据和测试数据。不用相同的数据来训练和评估一个机器学习模型的原因很容易理解,那就是容易造成模型的过拟合(overfitting)。过拟合的模型在新数据面前,预测的准确度不仅仅会停滞不前,甚至会不断的恶化。

我们知道机器学习的目标是获得一个能够对新数据准确进行预测的模型,而其中的一个主要障碍就是过拟合。过后我们会讨论如何控制、减少过拟合,现在我们先讨论一下如何评估和衡量一个模型的通用性。

训练、验证和测试数据集

评估一个机器学习模型最好是将可用数据分为三组,分别用于训练、验证和测试。用训练数据来训练这个模型,用评估数据对模型进行评估。一旦模型准备就绪,你就可以使用测试数据对模型进行最终的测试

你可能也会问,为什么不分成2组数据:训练数据和测试数据?这样不是简单得多!原因很简单,那就是是开发一个模型总要调整其配置参数:例如,选择层数的多少或每层的大小(称为超参数)。你可以通过这个模型在验证数据上的预测性能作为调整超参数的反馈信号。本质上,这种调整也是一种学习,那就是在一个参数空间里搜索最好的神经网络层的配置。但是不幸的是即使这样调整超参数训练出来的模型也会过度拟合验证数据集,即使在训练阶段,神经网络根本没有接触验证数据。

上述现象产生的一个原因被大家称作“信息泄露”(information leaks)。你每次根据模型针对验证数据的预测准确度模型的超参数进行调整,都会有少量信息泄漏到模型中。如果你重复很多次这样的调整,就会导致越来越多的信息泄露到你的模型中,所以你这样获得的模型会对验证数据的预测准确度非常好。但是这不一定是你想要的,因为你关心的是模型对从来都没有见过的数据的预测准确度,而不是仅仅对验证数据的预测准确度,所以你在调整超参数的过程中不要让模型接触任何测试数据,否则你的模型就有了先天的不足。

虽然上面的道理说的很清楚,但是在实际中,手上可用的数据量有时候很少,因此人们想出来几种常用的验证方法:简单hold-out验证、K-fold验证和带有数据混排的重复K-fold验证。

简单hold-out验证(Simple hold-out validation)

是一种最简单的交叉验证。我们把数据集分为两部分,一部分是训练数据和一部分是测试数据。模型在训练时仅使用训练数据。然后,模型对测试数据进行预测。测试数据对应的输出数据和期待输出之间的差值就是预测的误差。我们把计算出来的平均误差用来评估模型。这就是简单的hold-out验证,它的的优点是实现简单,计算复杂度也不高。但是,缺点是其评估结果可能会有很大差异,也就是评估结果在很大程度上取决于哪些数据被选进训练集中,哪些数据被选进测试集中。所以,数据的划分方式对评估结果可能会影响很大。

K-fold验证(K-fold validation)

种方法是将数据平均分为K部分,然后每次依次拿出来一部分数据作为对模型进行评估所用的数据,其余的K-1个部分用来对模型进行训练。这个过程重复K次后,算出验证得分的平均值。使用K-fold验证的目的主要是为了降低评估结果的偏差,如上面所说的简单hold-out验证中可能出现的问题,从而得到更加准确可靠的评估得分。

 

posted @ 2020-02-24 20:29  吕汉鸿  阅读(204)  评论(0编辑  收藏  举报
Save on your hotel - hotelscombined.com