之前我们在 《深入浅出的数据分析》中提到过,如果我们将散点图(只有一个特征,对应结果也只有一个)的相邻的点都用直线连上的话,我们就将所有数据都拟合了。然而这种模型对新数据的预测能力降大幅降低。
为了防止过拟合的发生,同时也为了保证自己模型的预测能力,在机器学习中,我们将数据分为训练集 和测试集。
训练集不用多说,自然是为了训练神经网络的。
测试集则是为了对训练好的神经网络进行测试。
既然我们将同一批数据分为了两组,并且用同一个神经网络计算loss,那么我们分组也是需要注意的。
首先,要保证每个数据集足够大,可产生具有统计意义的结果。
其次,要保证每个数据集的特征相同(能代表整个数据集)。请回想下之前的文章《只有浅出没有深入的数据分析(十)》中,数据在开始的范围内是呈现线性的,随后离散程度突然增加。如果这里我们用开始范围内的数据训练,而用离散化的数据测试。那么结果很可能loss在验证集的损失甚至比我们随便猜的结果还要大。
请勿对验证集进行训练
如果我们验证的结果出乎意料的好,那么我们很可能是训练了验证集(例如验证数据泄漏到了训练集)。
下面是原文中的一个例子:
“例如,假设一个模型要预测某封电子邮件是否是垃圾邮件,它使用主题行、邮件正文和发件人的电子邮件地址作为特征。我们按照 80-20 的拆分比例将数据拆分为训练集和测试集。在训练之后,该模型在训练集和测试集上均达到了 99% 的精确率。我们原本预计测试集上的精确率会低于此结果,因此再次查看数据后发现,测试集中的很多样本与训练集中的样本是重复的(由于疏忽,我们在拆分数据之前,没有将输入数据库中的相同垃圾邮件重复条目清理掉)。我们无意中对一些测试数据进行了训练,因此无法再准确衡量该模型泛化到新数据的效果。”
playground并且没有意义,请自己动手做一下。(谷歌的教程真的很用心)