译/ 阿里淘系商家团队 – 革新
本文是技术图书“Deep Learning with Python, Second Edition”的翻译和弥补。发布者:Franois Chollet(Keras作者,Google深度学习工程师)
由于目标是开发一些能够成功泛化到新数据的模型,因而,对模型泛化能力的评价就变得非常重要。在本文中,我们将正式介绍评价机器学习模型的不同办法。
培训,验证和测验集
评价模型总是归结为将可用数据分为三组:练习,验证和测验。您依据练习数据进行练习,并依据验证数据评价模型。一旦模型准备就绪,就能够在测验数据上进行最后一次测验,这意味着与出产数据尽或许类似。然后,您能够在出产中部署模型。
您或许会问,为什么没有两套:练习套和测验套?您将依据练习数据进行练习,并依据测验数据进行评价。简略得多!
原因是开发模型总是要调整其装备:例如,挑选层数或层大小(称为模型的超参数,以将其与网络权重的参数区分隔)。您能够经过运用验证数据上模型的功能作为反应信号来进行此调整。从本质上讲,这种调整是一种学习方式:在某些参数空间中寻找杰出的装备。因而,即便从未对模型进行过直接练习,依据其在验证集上的功能来调整模型的装备也或许很快导致对验证集的过度拟合。
这种现象的核心是信息走漏的概念。每次依据模型在验证会集的功能调整模型的超参数时,一些有关验证数据的信息都会走漏到模型中。假如仅对一个参数执行一次此操作,那么将走漏很少的信息,而且您的验证集将坚持牢靠以评价模型。可是,假如您重复多次(运转一个试验,对验证集进行评价并终究修改模型),那么您将把与验证集有关的越来越多的信息走漏到模型中。
归根到底,您将取得一个模型,该模型在验证数据上人为地表现杰出,由于这是您对其进行优化的意图。您关怀的是全新数据而不是验证数据的功能,因而需求运用一个完全不同的,从未见过的数据集来评价模型:测验数据集。您的模型不该拜访任何有关测验集的信息,即便是直接拜访也是如此。假如已依据测验集功能对模型进行了任何调整,那么您的概括性衡量将存在缺点。
将数据分为练习,验证和测验集看似很简略,可是当数据很少时,有几种先进的办法能够派上用场。让我们回忆一下三种经典的评价办法:简略的保存验证,K折验证和带混洗的迭代K折验证。我们还将评论常识基线的运用,以检查您的培训是否在进行中。
简略的保存验证
将部分数据分隔作为测验集。练习剩下的数据,并评价测验集。如前几节所述,为了避免信息走漏,您不该基于测验集来调整模型,因而,您还应该保存验证集。
示意性地,坚持验证类似于图TODO。以下清单显示了一个简略的实现。
这是最简略的评价协议,而且存在一个缺点:假如没有可用的数据,则您的验证和测验集或许包括的样本太少,无法从统计学上代表手头的数据。这很简略辨认:假如在拆分之前对数据进行了不同的随机混洗,终究得出的模型功能的测量办法大不相同,那么您就遇到了这个问题。 K-fold验证和迭代K-fold验证是处理此问题的两种办法,如下所述。
K折验证
运用这种办法,您能够将数据分成大小持平的K个分区。关于每个分区i,在剩下的K – 1个分区上练习模型,并在分区i上进行评价。这样,您的终究分数便是所取得的K分数的平均值。当模型的功能显示出基于练习测验拆分的显着方差时,此办法很有用。与保存验证相同,此办法也不能免除您运用不同的验证集进行模型校准的费事。 示意图中,K折穿插验证看起来像图TODO。列出TODO显示了一个简略的实现。
num_validation_samples = 10000
np.random.shuffle(data)
validation_data = data[:num_validation_samples]
data = data[num_validation_samples:]
training_data = data[:]
model = get_model()
model.train(training_data)
validation_score = model.evaluate(validation_data)
# At this point you can tune your model,
# retrain it, evaluate it, tune it again...
model = get_model()
model.train(np.concatenate([training_data,
validation_data]))
test_score = model.evaluate(test_data)
经过改组进行迭代的K折验证
这是针对您可用数据相对较少而且需求尽或许精确地评价模型的情况。我发现它在Kaggle竞赛中非常有用。它包括多次应用K倍验证,在将数据拆分为K方式之前,每次都要对数据进行改组。终究分数是在每次K折验证中取得的分数的平均值。请注意,您终究需求练习和评价PK模型(其间P是您运用的迭代次数),这或许会非常昂贵。
打破常识性基准
除了可用的不同评价协议之外,您还应该了解的最后一件事是运用常识性基准。 练习深度学习模型有点像按下按钮以在并行世界中发射火箭。您听不到或看不到它。您无法观察到多种学习过程-它是在具有数千个维度的空间中产生的,即便将其投影到3D,也无法解释它。唯一的反应便是您的验证指标,例如隐形火箭上的高度计。
尤为重要的一点是,要能够分辨出您是否正在起步。您开端的海拔高度是多少?您的模型的准确度似乎为15%,这有什么优点吗?在开端运用数据集之前,应一直挑选一个简略的基准,然后尝试将其打败。假如您超过该阈值,您就会知道自己做对了:您的模型实际上是在运用输入数据中的信息进行广泛的猜测-您能够持续。该基准能够是随机分类器的功能,也能够是您能够想象的最简略的非机器学习技术的功能。
例如,在MNIST的数字分类示例中,简略的基线将是验证精度大于0.1(随机分类器);在IMDB示例中,验证精度将大于0.5。在路透社的比如中,由于阶层的不平衡,它将在0.18-0.19左右。假如您遇到二进制分类问题,其间90%的样本归于A类,而10%的样本归于B类,则一直猜测A的分类器的验证精度已经达到0.9,因而您需求做得更好。
当您开端处理曾经没有人处理过的问题时,具有一个常识性基准是至关重要的。假如您无法处理一个简略的处理方案,那么您的模型将一文不值-也许您运用了过错的模型,或许也许刚开端运用机器学习无法处理您要处理的问题。是时候回到绘图板上了。
关于模型评价的注意事项
挑选评价协议时,请注意以下几点:
- 数据代表性—您希望练习集和测验集都能够代表手头的数据。例如,假如您尝试对数字图像进行分类,而且从样本数组开端,按样本的类别对样本进行排序,则将数组的前80%作为练习集,其余的20%作为练习集由于您的测验集将导致您的练习集仅包括课程0–7,而您的测验集仅包括课程8–9。这似乎是一个荒谬的过错,但出奇的遍及。因而,您通常应在将数据分为练习集和测验集之前将数据随机洗牌。
- 时刻之箭—假如您要依据给定的过去来猜测未来(例如,明日的气候,股票走势等),则在分割数据之前不要随意洗牌,由于这样做会产生时刻上的改变走漏:您的模型将有效地接受来自未来数据的培训。在这种情况下,您应一直保证测验会集的一切数据都在练习会集的数据之后。
- 数据中的冗余-假如数据中的某些数据点出现两次(与实际数据相当遍及),则将数据混排并将其分为练习集和验证集将导致练习和验证集之间的冗余。实际上,您将对部分练习数据进行测验,这是您最糟糕的事情!保证练习集和验证集不相交。
评价模型功能的牢靠办法是,您将能够监控机器学习的核心压力-在优化与泛化,欠拟合与过拟合之间。