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