让我们回到之前关于猫咪图片的例子: 你开发了一个移动APP, 用户可以上传许多不同的图片到你的APP上,你想识别出用户上传的图片中所有包含猫咪的图片。
你的团队下载了很多图片数据集,包含猫咪图片(正样本,positive example)和非猫咪图片(负样本, negative example)。他们将这些数据划分为70%的训练集,30%的测试集。当使用这些进行算法训练时,效果非常不错。
但是将算法(分类器)部署到APP的时候,发现效果却非常的糟糕!
发生了什么?
你发现用户上传的图片和你团队下载作为训练集的图片不同。用户使用收集拍摄的图片分辨率更低,模糊,而且照明效果较差。由于你的训练/测试集来源于网站上的图片,你的算法没有很好的把智能手机图片一般化。
大数据时代之前,在机器学习中人们对数据集的一个常见划分规则为:将数据集划分为70%/30%的训练集和测试集。但是在越来越多的应用(比如上面的例子)中,收集的数据与训练数据不同,这个时候该规则就不适用了。
我们通常定义:
• 训练集(Training set) — 运行在算法上的数据集.
• 开发集(Dev/development set) — 这部分数据通常用来调参,选择特征,以及对学习算法进行改进。有时也被用于交叉验证。
• 测试集(Test set) — 这部分数据通常用于评估算法的性能,但不要依靠这个数据对你的算法进行调参和修改。
一旦你定义了一个开发集和测试集,你的团队就可以进行模型的建立,通过调整参数,特征选择等。从而制定最有效的机器学习算法。开发集和测试集可以很快的告诉你算法的运行情况。
换句话说,开发集和测试集的目的是为了让你对算法进行改进,使算法效果变得更好
所以你应该:
• 选择开发集和测试集时,主要选择可以反映未来需要获取的数据
换句话说,你的测试集不应该只是可用数据的30%这么简单,尤其是你得到的数据(移动app的图像)和你训练数据(网站图像)不一样的时候。
如果你还没有运行你的移动应用,也就意味着还没有用户,可能你就无法获取到一些比较好的数据,但是你可以尝试去获取这些数据。比如:让你的朋友拍一些手机照片发给你,一旦你的应用启动后,你可以使用实际的数据来更新你的开发/测试集。
如果你实在没有办法获取到你期望的数据,那么你可以从网站图片开始,不过这种做法可能会导致你的系统不能一般化(generalize)的很好。
有时,可能需要花费一些资金去获取比较好的数据集。切记不要认为你的训练集和测试集分布必须是一样的。尽量去选择那些可以反映真实情况的数据作为测试样本。