训练集和测试集:拆分数据

上一单元介绍了将数据集划分为两个子集的概念:

  • 训练集 - 用于训练模型的子集。
  • 测试集 - 用于测试训练后模型的子集。

您可以想象如何分割单个数据集,如下所示:

分为两段的水平条:80% 为训练集,20% 为测试集。

图 1. 将单个数据集划分为训练集和测试集。

确保您的测试集满足以下两个条件:

  • 足够大,可以得出具有统计意义的结果。
  • 能代表整个数据集。也就是说,在选择测试集时,不要选择与训练集具有不同特征的测试集。

假设您的测试集满足上述两个条件,您的目标是创建一个能够很好地泛化到新数据的模型。我们的测试集会充当新数据的代理。例如,请参考下图。请注意,从训练数据中学习的模型非常简单。此模型的效果并非完美,一些预测出错了。不过,该模型在测试数据上的表现与在训练数据上的表现一样。换言之,这个简单的模型不会过拟合训练数据。

两个模型:一个在训练数据上运行,另一个在测试数据上运行。这个模型非常简单,只用一条线将橙点和蓝点分开。训练数据的损失与测试数据的损失类似。

图 2. 根据测试数据验证训练后的模型。

切勿使用测试数据进行训练。如果您的评估指标结果出乎意料的好,则可能表明您不小心对测试集进行了训练。例如,高准确率可能表示测试数据泄露到了训练集内。

例如,假设某个模型使用主题行、电子邮件正文和发件人的电子邮件地址作为特征来预测电子邮件是否为垃圾邮件。我们将数据拆分为训练集和测试集,拆分比例为 80-20。训练完成后,该模型在训练集和测试集上的精确率均达到 99%。我们预计测试集的精确率较低,因此我们再次查看数据,发现测试集中的许多样本都与训练集中的样本重复(我们并没有忽略输入数据库中同一垃圾邮件的重复条目,然后再拆分数据)。我们无意中对部分测试数据进行了训练,因此无法再准确衡量模型泛化到新数据的程度。