关于机器学习的训练数据、验证数据和测试数据的形象比喻
机器学习最明显的一个特点是需要大量的数据。特别对监督学习来说,就是需要大量的带标签数据(labeled data)。
很多入门的朋友很快就会遇见模型训练和测试这两个阶段,进而也就了解到带标签数据是要被划分成两个部分的:训练集 (training set) 与测试集 (test set)。这两个概念也很直观,大部分朋友非常快就能接受。
可是到后面,在我们需要为机器学习模型调参的时候,半路杀出来了个交叉验证 (cross validation) 阶段,这个对应的数据集也有个名字,叫做验证集 (validation set)。
据我观察,很多入门机器学习的朋友在这个时候就会感到一头雾水,并且非常困惑:咋又冒出来了个验证集啊?我们不是有个测试集了吗?直接在那上面做实验不就好了么?又划分多一个数据集,那就使得能用于训练和测试的数据都变少了,验证集是那方神圣啊?...
这里我给你们来个非常形象的类比!别眨眼!
训练集 → 题解大全
验证集 → 模拟考试
测试集 → 高考!
是不是非常形象易懂呢?(得意脸)
呃?搞不懂为什么是这样的对应关系?别急我还没说完呢。
机器学习算法是个笨学生,他没法直接从人类教师那里学会抽象的概念,于是唯一有效的策略就是天赋不足勤来补:玩命刷题! 想想看带标签的训练数据,是不是很像你平时做的习题册呢? 数据本身是题目,标签是正确答案。所以机器学习算法能够通过大量做题来学会抽象概念(但是这个傻孩子实际上只学会了怎么解答与特定抽象概念相关的问题)。
你说你学会了东西,但空口无凭啊,你得通过考试来证明自己!于是就有了测试集。测试集相当于考试的原因是,你只能看到题目(数据)而无法得知答案(标签)。你只能在交卷之后等老师给你打分。
于是就有朋友发问了:“那我一遍一遍考试来证明自己不就好?我大学挂科补考还少么?”。首先心疼你一秒钟。然后请你思考这个问题,如果那场考试是高考怎么办?你耗得起吗?
所以我们需要模拟考试,也就是验证集。我们可以获得验证集的标签,但是我们假装得不到,让自己以考试的心态去面对,过后也就能通过自己对答案来了解自己到底学会了多少,而这种几乎没有成本的考试我们想进行多少次都行!这就是验证集存在的意义!你的模型只能在测试集上面跑一次,一考定终身!
我们需要验证集的真正原因是:防止机器学习算法作弊!我们训练一个机器学习模型不是为了让它在那有限的带标签数据 high 个够,而是要将模型应用于真实世界。绝大多数情况下,我们无法直接从真实世界获得答案,我们能收集到的数据是没有标签的裸数据,我们需要高效准确的机器学习模型为我们提供答案。不能直接使用测试集不是因为我们负担不起在测试集上跑模型的成本(事实上几乎为 0),而是因为我们不能泄露测试集的信息。试想一下,假如你搞到了真正的高考题和答案,你一遍又一遍地去做这套题目,会发生什么?也许你会成为高考状元,可是你真的学会这些知识了吗?你能够再去做一套高考题并且拿高分吗?你能够去当家教向学弟学妹传授你的知识和解答他们的问题吗? 偷窥到了测试集的机器学习模型就是废品,没有人需要它,它也做不了任何有用的事情。
切记,你的机器学习模型只能在测试集上跑一次,一考定终身!
切记,你的机器学习模型只能在测试集上跑一次,一考定终身!
切记,你的机器学习模型只能在测试集上跑一次,一考定终身!
切记,你的机器学习模型只能在测试集上跑一次,一考定终身!
切记,你的机器学习模型只能在测试集上跑一次,一考定终身!
超级重要的事情说五次还嫌少,我得加粗了才行。哦还得加大字号,我怕你近视眼看不见!
都说到这个地步了,顺便借这个类比说说过拟合 (overfit) 和欠拟合 (underfit) 的事吧。过拟合的模型是个真正的书呆子,玩命刷题解大全 (Demidovich),但是只记住了所有的习题和答案,去做模拟考试就直接傻掉了。欠拟合的模型就是个不听课还懒惰的学渣,连习题册上的题目都搞不懂,别说模拟考试了。高考?呵呵呵。