训练集、验证集、测试集的区别与应用

0. 前言

最近一直在看论文、跑模型和做工程,很久没有来发博客了。但是在日常的学习和交流中,我感觉大家更加会关注当今最新的模型,最先进的算法,但是对于一些非常基础的内容的理解还不够透彻,我也是想借此机会梳理清楚一些内容。
今天想讲的是数据集的划分,即训练集,验证集和测试集分别是啥,又有啥用处,其区别是什么。目前网上讲述的大多相同,不同的讲解又太过简略,而且侧重点多半是讲述在不同方法上,而对于其确切内容没有一个详细的描述。我这里主要结合平时的实际工作,梳理一些常用的概念。

1.为什么要划分数据集为训练集,验证集和测试集?

做科研,就要提出问题,找到解决方法,并证明其有效性。这里的工作有3个部分,一个是提出问题,一个是找到解决方法,另一个是证明有效性。每一个部分都可以作为科研的对象,研究的越靠前,则越偏向科学,越靠后,则越偏向技术,因此叫做科学与技术。

在我们人工智能领域,证明一个模型的有效性,就是对于某一问题,有一些数据,而我们提出的模型可以(部分)解决这个问题,那如何来证明呢?这和我们平时的考试也是一样的,证明我们掌握了某类知识,就是去参加考试。

好,那么如何设计考试,让这个考试可以较为客观的考察出每个人的能力呢(注意,不是让每个人都得最高分)?回想我们的高中阶段,有一些教材,让我们平时学习其基本知识(训练集),有一些模拟考试,让我们知道我们到底掌握的怎么样,然后再改进我们的学习(验证集),最后的高考决定我们的去向(测试集)。这样的类比,是不是就很清楚了。

2.训练集、验证集与测试集

训练集:教材(例题),其特点是数量多,容易获得,是我们(模型)掌握知识的最根本的途径。训练集在我们模型的过程中起的作用就是更新模型的参数,用以获得更好的性能,其行为表现就是让我们以为模型掌握了相关的知识(规律)。

验证集:模拟考试,其特点是相对客观的自我衡量的一种方式。毕竟你见过的例题你都会了这是理所当然的事情,但是要求你能够举一反三,遇到同类型的题目也应该会。另外,当你习题做错的时候,你还可以重新去回顾已学习的知识,是不是掌握的方式或者理解发生了偏差。验证集就是为了调整我们模型的超参数(神经元的数量、迭代的次数、序列长度等等),这些超参数在某一次的学习迭代中是没有办法改变的。

测试集:高考,其特点是一考定终身,而且不给你改的机会,想想多少人在高考的过程中悔恨,但是也没啥用,除非复读,否则这个成绩就是无法改变的。而且,最重要的一点,首先,高考和模拟考与教材的考察内容应当是一致的(考试大纲),其次,你会发现无论平时做了多少题目,也许有些题目有几分相似,但是在高考试卷上不会出现100%一样的题目,多数题目都是从未见过的(数学最为甚)。而且致命的是,你不会得到答案反馈,即使后面会提供参考答案(比如在报纸上),但是你只会得到你的评分,无论这个评分与你的预估分有无差异。这就像是平时的数据比赛,测试集你是不会得到的,都是上传模型后,评测系统会给你一个最终得分。这才是最正统的做法。

但是,但是,事实上很少会提供这么严格的环境,通常的科研都是自己的数据,自己的方法,自己的模型,自己的评测,那么我们应该掌握科学的评测方法才能够更加客观的反映我们的模型的性能。

3.如何划分训练集、验证集和测试集。

这个问题其实非常基础,也非常明确,在Scikit-learn里提供了各种各样的划分方法。无论是单一的训练集、验证集和测试集,还是进行交叉验证,你都会找到调用的方法,因此我们这里主要介绍两种常见的方法。

  1. 前人给出训练集、验证集和测试集
    对于这种情况,那么只能跟随前人的数据划分进行,一般的比赛也是如此。一定不要使用测试集来调整性能(测试集已知的情况下),尽管存在使用这种方法来提升模型的性能的行为,但是我们并不推荐这么做。最正常的做法应当是使用训练集来学习,并使用验证集来调整超参数。当在验证集上取得最优的模型时,此时就可以使用此模型的超参数来重新训练(训练集+验证集),并用测试集评估最终的性能。
    我们首先说明加入验证集重新训练和不加有啥区别,从理论上讲,一方面学习的样本增多,应当是会提升模型性能的,第二,其在验证集上取得最优的模型与验证集的分布的契合度是最高的,因此最终的模型会更接近验证集的分布。
    其次再说明验证集和测试集上的性能差异。事实上,在验证集上取得最优的模型,未必在测试集上取得最优。其原因就是训练的模型是否对于该问题有着较好的泛化能力,即没有对验证集产生过拟合现象。正因为有这种情况的发生,才会有人使用测试集的最优值作为最终的结果(而不管验证集的好坏)。

  2. 前人没有明确给出数据集的划分
    这时候可以采取第一种划分方法,对于样本数较小的数据集,同样可以采取交叉验证的方法。
    交叉验证的方法的使用场景有很多,我们这里是针对不同的模型的性能好坏进行评估。
    使用交叉验证,可以获得更为客观的性能差异。当使用第一种方法时,我们更建议使用P值来做显著性检验,从而保证性能差异的客观性。而使用第二种方法,即交叉验证时,我们选取其性能表现的均值作为最终的结果,更能体现该模型的泛化能力。

    • 存在验证集
      这里五倍交叉验证是用于进行调参,此时不接触测试集。
      数据集首先划分出训练集与测试集(可以是4:1或者9:1)。
      其次,在训练集中,再划分出验证集(通常也是4:1或者9:1)
      然后对于训练集和验证集进行5折交叉验证,选取出最优的超参数,然后把训练集和验证集一起训练出最终的模型。
    • 不存在验证集
      该情况通常是对比不同的模型,如自己的模型和别人的模型的性能好坏。
      只需要把数据集划分为训练集和测试集即可,然后选取5次试验的平均值作为最终的性能评价。

4.小结

通过以上介绍,我们应该对训练集、验证集与测试集有了一个比较深刻的认识了。接下来进行我们的实验吧!

刘炫320 CSDN认证博客专家 博客专家 内容合伙人 首页内容推荐官
计算机科学与技术专业博士,主要研究方向为人工智能、自然语言处理、篇章分析。曾与微软小冰、微软小娜共同工作。兴趣广泛,包括并不限于人工智能,心理学,认知科学,语言学,数学,天文学等。让我们一起和AI,改进世界!
相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页