吴恩达新书-机器学习学习笔记-(二)基础误差分析

书籍资料可以在以下链接中找到:中文版,英文版

1.快速构建并迭代你的第一个系统

当你想要构建一个新的垃圾邮件过滤系统时,团队可能会有各式各样不同的想法:

1.收集海量的垃圾邮件作为训练集。

2.开发用于理解邮件文本内容的功能。

3.开发用于理解邮件信封或邮件头部特征的功能,据此了解邮件经由了哪些网络服务器进行中转。

2.误差分析:根据开发集样本评估想法

在使用猫咪app时,你注意到它将一些狗的图片误分类为猫了,因为有些狗的照片的确很像猫。我们可以对其进行误差分析,具体而言,你可以这样:

1.收集100个开发集中被误分类的样本,即造成系统误差的样本。

2.人为查看这些样本,并计算其中狗的比例。

查看误分类样本的这一过程称为误差分析。在上面的例子中,如果只有5%误差分类的图像是狗,那么无论你在狗问题上做多少算法改进,最终都不会消除原有超过5%误差。举个例子说:

当我们的系统的精度为90%(对应误差为10%),那么这种改进最多能将精度提升到90.5%(对应误差下降到9.5%,改进了原有10%误差中的5%)。

相反,如果你发现50%的误分类图像是狗,那就可以很自信地说这个项目将效果明显,它可以将精度从90%提升到95%(相对误差减少50%,整体误差由10%下降到5%)。

这种简单的误差分析能够更好地提升你项目的性能。

误差分析(Error Analysls):指的是检查被算法误分类的开发集样本的过程,以便帮助你找到造成这些误差的原因。这将协助你确定各项目的优先级(就像上面的例子所提到的那样)并且获得探索新方向的灵感,我们将会在之后再讨论这些内容。

3.在误差分析时并行评估多个想法

对于改进猫检测器,你的团队有一些想法:

1. 修正算法,解决将狗误分类为猫的问题。

2. 修正算法,将大型猫科动物(比如狮子、黑豹等等,下面用大猫指代)误分类家猫的问题。

3. 改善系统在模糊图像上的表现。

上面的想法可以一起进行评估,将被错误分类的图片列成一个表格,如下图所示:

表格底部的百分比加起来大于100%说明一个样本可能与多个类别都有关联。假设你已经检查了100个开发集的误差分类样本,并得到了下面的表格:

现在的话可以判断出,对于解决狗的误分类问题项目最多可以改进8%,处理大猫和模糊类则可以改进更多。如果你的团队有足够的人力并行处理多个方向,则可要求一部分成员处理大猫类别,另一部分成员处理模糊类别。

4.清洗误标注的开发集和测试集样本

在进行误差分析的时候,我们可能会注意到一些开发集的样本被误标注(mislabeled)了。此处的“误标注”指的是图像在算法处理之前,已经被负责标注的人员进行了错误的标注,也就是说,某个样本(x,y)的分类标签(label)y的值并不正确。那这个时候需要修正开发集中的标签吗?

举个例子,假设你的分类器表现如下:

相对于你正在改进的9.4%误差,误标记的0.6%的误差看起来就不那么重要了。在开发集中,手动修正误标注样本不会带来不好的影响,这样的做法并不是必要的;

当这个开发集误差所占的比例较大的话,那么就应该考虑改进开发集样本中的标签质量。

无论使用什么方式修正开发集标签,请记住,要将同样的方式用于你的测试集,这可以保持二者服从相同的分布。假设你有 1000 个开发集样本,同时分类准确率为 98%,那么检查20 个误分类的样本会比检查 980 个正确分类的样本要容易得多。这样你只检查了开发集的的误分类样本,而没有检查训练集上面的样本,这就会导致开发集衍生出一定的偏差。

5.将大型开发集拆分为两个子集,专注其一

假设你有一个含有5000个样本的大型开发集,该开发集的误差为20%,这意味着算法将误分类1000张开发集图片。人工手动检查这1000张图片会花费很长时间,所以我们在误差分析时没必要使用所有的图片。

在这种情况下,我们会将开发集明确地分成两个子集,但只人工检查其中的一个。你将使得那些经人工查看的图片更快地过拟合,而另一部分没有被人工查看的图片可以在调参时使用。

继续上面的例子:在该例子中,算法将5000个开发集样本中的1000个样本误分类。假设我们想要对经人工检查的大约100个错误样本(整体的10%)进行误差分析,你应该随机选择10%的开发集,并将其放入Eyeball开发集中,以提醒我们自己,我们正在用眼睛看着它。对于语音识别项目,你可能需要听一些音频的剪辑,此时则将数据集称为Ear开发集)因此Eyeball开发集将有500个样本,其中,预计被算法误分类样本约100个。

第二个子集叫做Blackbox开发集,它由剩余的4500个样本组成。你可以使用Blackbox开发集,通过测量错误率来自动评估分类器,也可以使用它来选择算法或调整参数。

为什么我们要把开发集明确分为Eyeball开发集和Blackbox开发集呢?因为当你在Eyeball开发集中建立了对样本的直观认识之后,可使得Eyeball开发集更快地过拟合,如果你发现Eyeball开发集的性能比Blackbox开发集提升得更快,说明已经过拟合到Eyeball开发集了。此时可能需要丢弃它并寻找一个新的Eyeball开发集,比如可以将更多Balckbox开发集中的样本移到Eyeball开发集中,也可以考虑去获取新的标注数据。

6.Eyeball和Blackbox开发集该设置多大:

Eyeball开发集应该大到能够让你对算法的主要错误类别有所察觉。如果你正在处理一项实际情况中人类表现良好的任务(例如识别图像中的猫),下面是一些粗略的指导方案:

如果分类器在 Eyeball 开发集上只出现 10 次误判,这个开发集就有点小了。若只有 10 个错误样本,很难准确估计不同错误类别的影响。但如果数据非常少且无法提供更多 Eyeball开发集样本时,聊胜于无,这将有助于确立项目的优先级。

如果分类器在 Eyeball 开发集样本上出现了约 20 次误判,你将可以开始大致了解主要的误差来源。

如果有约 50 个错误样本,你将能够比较好地了解主要的误差来源。

如果有约 100 个错误样本,你将会非常清楚主要的误差来源。我见过有人手动分析更多的错误样本——有时候多达500个。只要你有足够多的数据,这将是无害的。

通过手动检查约 100 个被算法错误分类的开发集样本来执行误差分析,并计算主要的错误类别。使用这些信息来确定优先修正哪种类型的错误。

考虑将开发集分为人为检查的 Eyeball 开发集和非人为检查的 Blackbox 开发集。如果在Eyeball 开发集上的性能比Blackbox 开发集上好很多,说明你已过拟合 Eyeball 开发集,下一步应该考虑为其获取更多数据。

Eyeball 开发集应该足够大,以便于算法有足够多的错误分类样本供你分析。对大多数应用来说,含有1000-10000个样本的 Blackbox 开发集已足够。

如果你的开发集不够大,无法按照这种方式进行拆分,那么就使用 Eyeball 开发集来执行人工误差分析、模型选择和调超参。

猜你喜欢

转载自blog.csdn.net/weixin_39059031/article/details/83479288