更多好玩的机器学习教程: 进入袋马学院领一份 ,全部免费?.
让我们回到之前猫咪图片的例子中,你开发了一款移动端APP,用户上传了各种各样的照片,你想让计算机自动区分出哪些照片中含有猫咪。
同时,为了训练模型,你的队友们从互联网上,找到了大量的猫咪图片(正例)和非猫咪图片(负例)。他们按7:3的比例,把数据分成了训练样本集和测试样本集。通过这些数据,他们构建了一个能在训练样本集和测试样本集上表现都很好猫咪检测器模型。
但是,当你们把这个模型应用到移动端的APP上式,你发现这个模型不管用了,检测准确率极差。
咋回事呢?
你发现,用户上传的图片跟你们从网上采集来的图片大不一样。用户上传的图片大部分都是用手机拍摄的,因此像素较低,比较模糊,而且光线也不是很好。因为你们之前用的训练数据全部来自与网上。你们的算法模型并不能适配真实的数据,即来自手机拍摄的照片数据。
在大数据时代之前,把数据按7:3分割成训练样本集和测试样本集,是一种非常通用的做法。实践证明这样的确有用,但是对于越来越多应用来说,它们的训练数据跟最终的实际数据分布不太一样,那再这样做,可就不是一个很好的主意了。
那怎么做呢?通常我们会定义三个数据集:
- 训练数据集 — 用来训练你的算法模型
- 开发数据集 — 用于调整学习模型,比如调整参数、选择特征等。这部分数据也称作预留交叉验证数据集。
- 测试数据集 — 用于评估模型性能,这部分数据集不参与模型调整和参数更新。
当你定义好开发和测试数据集后,你的团队就可以做出很多其他的尝试(比如再学习算法上试试其他的参数), 来找到表现最好的想法。开发和测试数据集可以让你的团队,快速的看到算法是否可行,表现如何。
换句话说,使用开发和测试数据集,可以引导你的团队,针对你们的机器学习系统,直接做出最重要的决定和改变。
所以,你应该选择最终实际要用的数据,作为开发和测试样本集。
因此,当你的最终数据,跟你预先采集的训练数据,分布不一致时,你最好不要简单的将可用数据的30%作为测试数据集。
如果你的APP还没有上线,或者你还没有的用户,此时你可能无法采集来自用户的实际数据。但是我仍旧建议你想办法,找到真实数据相似的数据。比如让你的朋友帮忙,用手机拍一下猫咪的照片发给你。当你的APP上线后,你就可以用真实的数据,来替换之前开发和测试样本集中的近似数据了。
如果你实在找不到能近似实际情况的数据,你可以使用从网上采集来的数据,来训练你的模型。但一定要注意由此可能导致的泛化风险,即你训练时,模型表现的很好,但是在实际使用时,却表现得很差。
你需要考虑用多大得成本,来构建更好的开发和测试数据集。但是永远不要假设训练数据跟实际数据的分布相同。测试数据集尽量选择与最终数据相似的数据,而不是像训练一样,啥数据都可以选。
更多好玩的机器学习教程: 进入袋马学院领一份 ,全部免费?.