假设你在做一个猫的分类器,训练准确度达到了90%,现在还想继续提高,你可能会有以下的想法:
所以我们需要知道哪些是可以尝试的,哪些是可以放心舍弃的。
搭建机器学习系统挑战之一是:你可以尝试和挑战的东西太多。
正交化
改变一个参数或变量只影响一个方面——正交化
- 如果你的算法在成本函数上不能很好的拟合训练集,你可以训练一个更大的网络;或者选用一个更好的优化算法,比如。
- 如果对开发集(验证集)效果很差,希望去调整尽量不影响到训练集效果。增大训练集是一种方法
- 如果在开发集上效果很好,在测试集上效果不行,说明你对开发集过拟合了,你需要往回退一步,使用更大的开发集
- 如果在测试集上,但不能部署良好的体验,这意味着你需要回去改开发集或成本函数。
单一数字评估指标
查全率和查准率可以用单一的F1值
或者下图的平均误差
设立满足和优化指标
如果我只是要求响应时间小于100ms的话,应该选择第二种。
训练/开发/测试集划分
将所有数据放在一起随机洗牌放入开发集和测试集,所以开发集和测试集都来自八个地区的数据,并且开发集和测试集都来自于同一分布。
这里有一个真实的故事 :
训练/开发/测试集大小
什么时候改变你的开发/测试集指标
- Eg1
算法A误差只有3%,算法B误差5%。算法A可以看到更多猫的图片,但会让一下色情图片通过,,这一点完全不能接受;算法B有5%误差,这样分类器就得到较少的图片,但不会推送色情图片。所以从公司以及用户的角度来看,算法B实际是一个更好的算法。A在评估指标上做的更好但实际上是一个更糟糕的算法。在这种情况下,评估指标加上开发集它们都会倾向选择算法A,但你和你的用户更倾向使用算法B。当这种情况发生时,你的评估指标无法衡量算法之间的优劣排序时,这就发出信号,你应该改变评估指标了或者改变开发集和测试集。
解决办法就是对你的误差加入一个权重因子惩罚项。
处理机器学习问题时,应该把它切分成独立的步骤。1.弄清楚如何定义一个指标来衡量你想做的事情的表现 2.考虑如何改善系统在这个指标上的表现
-
Eg2
如果你的开发测试集都是些高质量图像,但在开发测试集上做的评估无法预测你的应用实际表现,因为你的应用处理的是低质量图像。那么就应该改变你的开发测试集,让你的数据更能反映你实际需要处理好的数据。
总体方针就是,如果你当前的指标和当前用来评估的数据和你真正关心必须做好的事情关系不大,那你就应该更改你的指标或者你的开发测试集,让它们能更好地反映你的算法需要处理好的数据
贝叶斯最优误差
理论上可以达到的最优误差,就是说没有任何办法设计出一个x到y的函数,让它能够超过一定的准确度。
对于语音识别系统,如果X是音频片段,有些音频就是这么嘈杂,基本不知道说的是什么,所以准确率不可能是100%。
事实证明,机器学习进展往往相当快,直到超越人类的表现之前一直很快。当超越人类表现时,有时进展会变慢,有两个原因:1.人类水平在很多任务中离贝叶斯误差已经不远了,人们非常擅长看图片或者听音频。 2.只要你的表现比人类的变现更差,那么实际上可以使用某些工具来提高性能,一旦超越了人类的表现,这些工具就没那么好用了。
可避免偏差
贝叶斯误差和训练误差之间的差值
人类水平表现
人类水平误差可以用来估计贝叶斯误差
-
Eg1
以上四种情况哪一种可以代表人类水平误差呢?
因为人类水平误差可以用来估计贝叶斯误差,所以我们知道贝叶斯误差不会高于0.5%,所以这里我们将人类水平定义为0.5%。
定义人类水平误差时,要弄清楚你的目标所在,如果要表明你可以超越单个人类,那么就有理由把第二种情况作为人类水平误差。但是如果你的目标是代替贝叶斯误差,那么第四种才是合适的。
-
Eg 误差分析
如何提高算法性能指导方针
想让一个监督学习算法达到实用,基本上希望或者假设你可以完成两件事情:1.算法对训练集拟合很好,意味着可避免偏差很低。2.在训练集中很好,然后推广到开发集和测试集也很好,意味着方差不要太大。