我们先来看一个简单的例子,假设哈,你是一个初创公司的老板,你们公司的目标是给爱猫人士提供源源不断的猫猫图片。于是,你利用神经网络,搭建了一个计算机视觉体系,专门用来检测图片中的猫猫。
你创建了一个手机app,用户可以将各种各样的图片上传到这个app上。你想自动识别出哪些是猫猫的图片。
通过从不同网站下载猫猫的图片和不是猫猫的图片,你的团队可以获得一个比较大的训练集。他们将数据集进行三七划分,其中30%为测试集(test set),70%为训练集(training set)。利用这些数据,你的团队就可以建立一个在训练集和测试集上都可以运行良好的猫猫检测系统。
但是,当你将这个分类器部署到手机app上时,你会发现,这个效果实在太差了!
天哪,到底发生了什么呢?
原来,用户上传的图片与你的训练集中的图片并非一样:用户上传的图片通常由他们的手机拍摄,而手机拍摄的图片往往分辨率较低,像素模糊,光线较差。而你在训练集中所使用的图片来自于网络,因此你的算法并不能很好地识别用户上传在app上的图片。
在大数据时代之前,利用三七法来分割测试集和训练集在机器学习中是常见规则,这种做法也确实可行,然而,如今,在越来越多的应用中,训练集数据(如上述例子中的网络图片)与目标关注数据(手机图片)十分不同,那么,这种情况下还利用三七法来区分测试集和训练集就实在是很不合适了。
关于训练集、开发集、测试集,我们通常是这样定义的:
训练集(training set):用于建立模型
开发集(developmentset):可调整参数,提取特征,以及做出与学习算法相关的其他决策。开发集也被称为交叉验证集(crossvalidation set)(以下统称验证集)。
测试集(test set):用来检验最终选择最优的模型的性能如何。
一旦你将验证集和测试集定义好,你的团队就会尝试各种方法,比如不同的学习算法参数,来测试哪个方法效果最好。通过验证集和测试集,你的团队可以很快看到算法的运行情况。
换句话说,验证集和测试集的目的是指导你的团队对机器学习系统做出最重要的调整。
因此,你需要做的是:
选择一个验证集和测试集,可以反映你在实际生产环境中遇到的数据,在这些数据上,你的模型会表现得更好。
也就是说,你的测试集不应该仅仅占当前已有数据的30%,尤其是当你预料将来的数据(手机图片)在本质上有别于你的训练集(网站图片)的情况下。
如果你还没有开发手机app,那你可能还没有用户,因此你也无法获得准确数据,来反应你在未来必须做些什么。但你仍然可以尝试一番。比如说,让你的朋友用手机拍个猫的照片发给你。等你的app上线了,你就可以利用这个照片来更新你的验证集或者测试集。
如果你真的没有任何方法可以获取到这些数据,那么你或许可以先使用网络数据,但是你必须注意到,这个方法可能效果不会特别好。
它需要有一个判断标准来判定需要在获取好的开发集和测试集上投入多大的人力和物力,但是,可别假设你的训练数据分布同你的测试数据分布是一样的。我们应该尽可能地选择这样的测试数据,它可以代表模型在实际生成环境中会遇到的数据,而不是训练集中的任意数据。
好啦,今天就到这里,下周再见,届时我们来聊聊“验证集和测试集是否该来自于同一分布”这个问题~
—— END ——
大家好,我是AI搬运工 致力于将国外的AI好文,翻译成大家都懂的中国话!
本文属于AI搬运工自行翻译,如有错误,欢迎指正!
原文摘自于:Machine Learning Yearning(Technical Strategy for AI Engineers, In the Era of Deep Learning)(Draft Version)
往期回顾
01 谈及监督学习时,我们在谈什么?
02 监督学习之回归分析法:预测连续数值
03 监督学习之分类算法