创建训练集和测试集
问题描述
如果我们正在搭建一个识猫的应用,用户会通过移动端上传不同的图片到应用。我们希望应用能够自动识别出含有猫的图片。
那么当我们搭建系统时,我们会从不同的数据来源获取包含猫的图片和不包含猫的图片作为训练的正负样本。然后我们通常会按照70%,30%划分训练集和测试集,使用这样的数据,我们能够搭建一个在训练集和测试集中都工作很好的猫识别器。
但是当把模型部署到移动端时,我们可能发现模型的效果真是太差了,到底是什么引起的?
最终我们可能会发现,用户上传的图片和从数据来源获取的数据集看起来不太一样。用户使用手机获取的图片通常分辨率更低,更模糊,并且光线不足。 因此算法无法泛化到真实数据。
70%、30%准则用来划分训练集和测试集是十分常用的。然而在越来越多的应用中,由于具有与上述识猫系统相同的问题,数据集与最终真实数据具有不同的分布,70/30准则不再那么有效。
我们定义:
- 训练集,用来训练模型参数
- 发展集或预留交叉验证集,用于调试模型参数,选择特征以及模型的其他方面
- 测试集,用于模型的最终测试
一旦我们定义发展集和测试集,我们会尝试使用不同的模型配置,模型参数使得模型或者最好性能。发展集和测试集使得我们可以快速的测试模型的表现。或者说,验证集和测试集是用于指导选择最有效地手段来优化模型。
所以,我们需要选择能够真实反映我们最终关注的真实数据分布作为发展集和测试集。所以测试集就不单单是我们可用数据的30%,尤其当训练数据和真实数据具有不同分布时。
针对这个识猫系统,那么验证集和测试集就需要能够反映真实数据,然而当应用没