6.1.2 训练与测试
你可以回想一下,到目前为止我们是如何测试学习程序的。首先,我们通过带标签的样本数据训练模型。然后使用这些样本计算出一系列的预测值,并将这些预测值与实际结果进行比较。如果这两组数值越接近,那么预测效果就越好。这种方法在学习基础知识时很有用,但是在实际项目中可能会失败。
为了说明原因,让我来举一个比较极端的例子。想象一下,你在酒吧里和一个朋友谈论MNIST。几杯啤酒下肚之后,你的朋友想和你打一个赌,她将编写一个系统,该系统可以在一次迭代训练中学习MNIST图像,然后得出100%准确的分类。多么可笑!听起来你会轻松地胜利,但是你狡猾的朋友可以轻易地在这场赌局中击败你。你能想象得到吗?
你的朋友编写了一个train()函数,该函数除了将训练样本存储在字典中之外什么也不做,字典是一种将键与值进行匹配的数据结构(根据你的编程背景,可以将其称为“映射”“哈希表”或其他类似的名称)。在这个字典中,图像是键,标签是值。当你要求它对图像进行分类时,程序可以在字典中查找到该图像并返回该图像的标签。嘿,转眼间,在训练的一次迭代中,完全准确的预测——甚至不用费心去实现机器学习算法!
当你付酒钱的时候,可能会抱怨你的朋友作弊,这种说法没错。她的系统并没有真正学习——它只是记住了图像和标签而已。面对一个它从未见过的图像,这样的系统会以一种尴尬的沉默来回应。与正常的学习系统不同,它无法将它的知识归纳到新的数据中。
这里有一个转折,即使没有人想要作弊,许多机器学习系统都有一个内置的趋势,即记忆训练数据。这是一种被称为过度拟合的现象。当系统在熟知的老数据上的性能优于在陌生的新数据上的性能时,你就可以看到系统是过度拟合的。这样的系统可以非常准确地对训练中已熟知的图像进行分类,然后会在遇到不熟悉的新图像时让你失望。
在本书的其余部分,我们将讨论很多关于过度拟合的内容,甚至会探索一些技术来减少其影响。现在,给你一个简单的建议,永远不要使用训练系统时使用过的样本数据来测试系统。否则,由于过度拟合的原因,你可能得到一个不正确的乐观结果。在模型训练之前专门留出一些样本数据用于模型测试,在模型训练完成之前不要碰这些样本。
现在我们知道了MNIST数据集是如何组织的,以及为什么它会被分成单独的训练集和测试集了。这就是我们所需要的全部知识。让我们编写加载MNIST样本数据的代码,并将这些数据转换为适合我们的学习程序的格式。