【转】吴恩达新书《Machine Learning Yearning》翻译连载_2

转载 微信公众号 “顶级程序员”

11.何时更改开发/测试集和评估指标

当开始一个新项目时,我会试图迅速选好开发/测试集 ,因为这可以给团队制定一个明确的目标。

我通常会要求我的团队在不到一周之内(极少多于一周时间)想出一个初始的开发/测试集和评估指标,提出一个不太完美的方案并迅速行动起来往往比过分考虑这些会更好。但是“一周”这个时间表并不适用于成熟的应用。例如,反垃圾邮件就是一个成熟的深度学习应用。我曾经见过一些开发已经成熟的系统的团队花费数月时间来获得更好的开发/测试集。

如果你后来发现你初始的开发/测试集或评估指标与你的目标并不完全一致,那么马上利用一切办法进行更改。例如,如果在你的开发集和评估指标上分类器A比分类器B表现好,但你的团队认为在实际应用中分类器B更适合你的产品,那么这就很有可能是一个你需要更改开发/测试集或评估指标的迹象。

有三个主要原因可能会造成开发集/评估指标不正确地把分类器A排得更高:

1. 你需要做得好的实际数据分布和开发/测试集是不同的。

假设你的初始开发/测试集主要是一些成年猫的照片,但是在你实际查看猫app后,发现用户上传的小猫的照片比预期多得多。所以,开发/测试集的数据分布并不能代表你需要做得好的实际的数据分布。这种情况下,你需要更新开发/测试集,使其更具代表性。

2. 你已经过拟合了开发集。 

在开发集上重复评估不同方法的过程可能导致你的算法逐渐对开发集“过拟合”。当你做完开发后,你会在测试集上评估你的算法。如果你发现算法在开发集上的表现远好于在测试集上的表现,这可能是你已经过拟合开发集的迹象。这种情况下,你需要更新你的开发集了。 
如果你需要跟踪团队的进度,你也可以每周或每月用测试集定期评估你的系统。但不要用测试集来做出任何关于改进算法的决定,包括是否回退到上一周的系统。如果这样做了,你将开始过度拟合测试集,并且不可能再依靠它来给出一个你的系统性能的完全无偏估计(你可能会在发表论文或做出重要商业决策用到这)。

3. 评估指标正在衡量的并不是项目所需要优化的东西。 

假设对于你的猫app,你的评估指标是分类准确率。该指标现在把分类器A排在分类器B前面。但是假如你尝试了这两种算法,发现分类器A会偶尔允许色情图片通过。那么即使分类器A准确率更高,偶发的色情图片所带来的坏影响也意味着这个分类器的表现是不被接受的。你需要做什么呢? 
这里,评估指标不能辨别出对产品而言算法B比算法A更好这一事实。所以,你不能再相信这个评估指标能挑选出最佳算法。现在是改变评估指标的时候了。例如,你可以改变评估指标,加重对色情图片通过的惩罚。我强烈建议你选择一个新的评估指标,用这个新的评估指标来为你的团队明确定义一个新的目标,而不是在没有可信任的评估指标下一直进行,然后在分类器中手动选择。

在项目中改变开发/测试集或评估指标是很常见的。拥有一个初始的开发/测试集和评估指标能帮助你快速迭代。如果你发现开发/测试集和评估指标使你的团队远离了正确方向,这不是什么大问题!只需要改变它们,并确保你的团队知道新的方向就可以。

12.结语:建立开发集和测试集

· 你希望在未来获得什么样的数据、并且想在上面做得好?从能反映出这个的数据分布中选择开发集和测试集。这可能不同于你的训练数据分布。

· 如果可能的话,选择来自同一分布的开发集和测试集。

· 为你的团队选择单一数字评估指标进行优化。如果你关心多个目标,考虑把它们合并到一个公式中(例如平均多个错误度量),或设定满足指标和优化指标。

· 机器学习是一个高度迭代的过程:在你发现满意的方法之前,你可能需要尝试很多的想法。

· 具有开发/测试集和单一数字评估指标可以帮助你快速评估算法,然后更快速的迭代。

· 当开始一个全新的应用时,尝试快速建立开发/测试集和评估指标,最好在一周之内。当然,在成熟的应用程序上花费更长的时间也是可以的。

· 按照70%:30%的旧比例划分训练/测试集不适用于你拥有大量数据的情况;开发集和测试集可以占有远小于30%的数据量。

· 你的开发集应足够大,大到能检测出你的算法准确性上的有意义的改变,但没必要更大。你的测试集也应足够大,大到能给你系统的最后性能一个有把握的评估。

· 如果你的开发集和评估指标使你的团队远离了正确方向,快速改变它:(i)如果你过拟合了开发集,那么就去获得更多的开发集数据。(ii)如果你所关心的实际分布和开发/测试集的分布不同,那么就去获得新的开发/测试集数据。(iii)如果你的评估指标不再能衡量对你来说最重要的东西,那么就改变评估指标。

13.快速构建第一个系统,然后迭代

你想建立一个新的反垃圾邮件系统。你的团队有以下几个想法:

· 收集一个含有大量垃圾邮件的训练集。例如,设置一个“蜜罐”:给已知垃圾邮件发送者故意发送虚假的电子邮件地址,这样就可以自动收集他们发送到这些地址的垃圾邮件。

· 开发理解电子邮件文本内容的功能。

· 开发理解电子邮件信封/标题特性的功能,以显示消息经过的网络服务器集。

· 其他。

尽管我在反垃圾邮件上做过大量工作,但我仍然很难选定其中的一个方向。如果你不是该应用领域的专家,那将更难。

所以,开始的时候不要试图设计和构建完美的系统。相反,应该快速构建和训练出一个基本系统——也许是在短短的几天内5。即使这个基本系统与你所能构建的“最佳”系统相去甚远,研究该基本系统的功能仍然很有价值:你将很快找到最值得你投入时间的方向的线索。接下来的几章将告诉您如何去解读这些线索。

14.偏误分析:查看开发集样本来评估想法

当你使用猫app时,你注意到一些狗的图片被错误识别成了猫。一些狗长的像猫! 

一个团队成员建议和第三方软件合作,使系统可以更好地处理狗样本。这些改变需要花费一个月的时间,并且团队成员热衷于这一方案。你应该要求他们这样做吗?

在投资这个任务一个之前,我建议你首先评估一下它实际上会提高多少系统的准确率。然后你才能更加理性地决定这是否值得花费这一个月的开发时间,还是使用这段时间做些别的事情更好。

具体来说,你可以做以下事情:

· 获取100个系统错误分类的样例。比如,系统出错的例子。

· 手动查看这些样本,计算其中有多少比例是狗的图像。

查看错误分类样本的这一过程被称为偏误分析(error analysis)。在该案例中,如果你发现被错误分类的图像中只有5%是狗,那么无论你在狗的图像上如何改进你的算法,你都不会消除超过5%的错误。换句话说,5%是上述建议能够达到的“天花板”(也就是最大可能的改进上限)。因此,如果整个系统当前的准确率为90%(10%的错误率),这一改进最多可能得到90.5%的准确率(或者9.5%的错误率,比原来10%的错误率少5%)。

相反,如果你发现50%的错误图像都是狗,那么你应该更相信第三方软件的介入能获得很大的效果。它能将准确率从90%提升到95%(错误率相对减少50%,从10%降到5%)。

这种偏误分析的简单计算过程能够给你一个快速的方法,来决定与第三方机构合作解决“狗”问题是否值得。它为决定是否应该做出这笔投资提供了一个定量的基准。

偏误分析通常会帮你选出不同的方向中哪些更有前景。我看到许多工程师不愿意进行偏误分析。相比于考量一个想法是否值得花时间投入,直接进行并实现通常会更让人感到更刺激。这是一个常见的错误:这可能导致你的团队花费一个月时间只获得很少的收益。

手动检查100个样本不会花费太长时间。即使你每分钟只看一张图片,两小时内就可以完成。这两个小时比你白白浪费一个月时间划算多了。

偏误分析(Error Analysis)是指检查开发集中被算法错误分类的样本的过程,以便了解错误产生的深层原因。它不仅可以帮助你重点发展项目,正如该例子所述,而且还能启发一些新的方向,下面我们就会讨论该内容。接下来的几个章节还将介绍一些偏误分析的最佳实践案例。

15.在偏误分析过程中并行评估多个想法

你的团队有以下几个想法来改进猫检测器:

· 修复算法将狗错认为是猫的问题。

· 修复算法将大型猫科类动物(狮子、豹等)被错认为是家猫(宠物)的问题。

· 提高系统在模糊图像上的表现。

· ……

你可以并行且有效地评估所有这些想法。我通常会创建一个电子表格,查看100个分类错误的开发集样本并填写在表格上,同时记下可以帮助我记住具体样本的注释。为了演示这个过程,让我们来看一下你可能生成的一个由4个示例组成的小开发集的电子表格:

表格中图片3在大型猫科动物和模糊图片两列都被勾选了。此外,由于一个例子可能与多个类别相关联,底部的百分比不一定达得到100%。

尽管你可能将这个过程首先描述为类别分类(狗、大型猫科动物和模糊图片),然后查看样例并对它们进行分类。实践中,当你在查看样例时,可能受到启发而提出一些新的错误类别。例如,也许查看过十几张图像后,你发现许多错误的图片都经过Instagram 过滤器的预处理。你可以返回并在电子表格中添加“Instagram”列。手动查看算法出错的样例,并思考人是如何/是否能正确地分类这些样例,这通常会启发你想出新的类别和解决办法。

最有用的错误类别是你有改进想法的错误类别。例如,如果你有办法“撤销” Instagram 过滤器从而恢复原始图像,那么添加Instagram类别是最有用的。但是你不必只局限于你已经有想法去改进的错误类别;这个过程的目标是建立你对最有希望关注的领域的直觉。

偏误分析是一个迭代的过程。如果开始的时候你在脑海里没有任何分类,不要担心!查看一些图片之后,你就可能会提出一些关于错误类别的想法。手动分类一些图片之后,你就可能会想出一些新的错误类别,然后根据新的类别再返回重新检查这些图片。以此类推。

假如你完成了对100个错误分类的开发集样本的偏误分析,并得到以下结果:

现在你知道了,解决狗分类错误的项目可以减少最多8%的错误。致力于大型猫科动物和模糊的图片对降低错误率帮助更大。所以,你可能会挑选后两者中的一个来进行处理。如果你的团队有足够多的人可以同时展开多个方向,你也可以让一些工程师处理大型猫科动物图片,另外一些解决模糊图像。

偏误分析并不会有一个明确的数学公式来告诉你什么才是最高优先级的任务。你还必须考虑你希望在不同错误类别上取得多少进展,以及处理每个错误类别所需要的工作量。

16.清理贴错标签的开发和测试集样本

在偏误分析中,你可能会注意到开发集中的一些样本被错误标记了。这里所说的“错误标记”,是指即使在算法遇到它之前,图片已经被打标人员贴上了错误的标签。即:样本 (x,y) 中的类别标签y的值不正确。例如,也许一些不是猫的图片被错贴标签为包含猫,反之亦然。如果你怀疑错误标记的图像占比很大,添加一个类别来记录有错误标记的样本的占比:

你应该纠正开发集中的这些标签吗?记住,开发集的目的是为了帮你快速评估算法,以便你可以判断算法A或B哪个更好。如果被错误标注的开发集的一小部分妨碍你做出这些判断,那么花时间去修正错误标注的开发集标签是值得的。

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

· 开发集的整体准确率……90%(10%整体错误率)

· 样本贴错标签导致的错误……0.6%(开发集错误率中的6%)

· 其他原因导致的错误……9.4%(开发集错误率中的94%)

在这里,由于错误标注导致的0.6%的不准确性,相对于你可以改进的9.4%的错误而言,可能没有那么重要。手动修复开发集中错误标注的图像并没有什么坏处,但这样做并不重要:不知道系统是否有10%还是9.4%的整体错误率可能没什么问题。

假设你不断改进猫分类器并达到以下性能:

· 开发集的整体准确率……98.0%(2.0%整体错误率)

· 样本贴错标签导致的错误……0.6%(开发集错误率中的30%)

· 其他原因导致的错误……1.4%(开发集错误率中的70%)

30%的错误是由于错误标注的开发集图像造成的,这将会为您的准确率估计增加显著的错误。现在去提高开发集中标签的质量是有价值的。处理错误标注的样本将帮助您算出分类器的错误是接近1.4%还是2%——这是一个相对显著的差异。

开始容忍一些错误标记的开发集样本并不罕见,只是在系统改进之后才改变主意,这样错误标记的样本相对于错误集的比例就会增加。

最后一章解释了如何通过算法的提升来改进错误类别,例如狗、大型猫科动物和模糊图片。在本章中你会了解到,你也可以通过改善数据标签在错误标记的类别上工作。

无论你采用什么方法来修正开发集标签,记得也将其用于测试集标签,以便开发集和测试集继续服从统一分布。将开发集和测试集固定在一起可以避免我们在第六章中讨论的问题,即你的团队优化了开发集的性能,只是到后来才意识到他们在根据不同的测试集进行不同的标准判断。

如果你决定提升标签的质量,那么请考虑仔细检查系统错误分类的样本的标签,以及正确分类样本的标签。在一个样本中,原始标签和学习算法有可能都是错的。如果只是修正系统已经错误分类的样本的标签,可能会在评估中引入误差。如果你有1000个开发集样本,并且分类器准确率为98%,那么检查错误分类的20个样本比检查正确分类的所有980个样本要容易的多。因为在实践中只检查错误分类的样本比较容易,所以偏差会蔓延到一些开发集中。如果你只对开发产品和应用感兴趣,那么这种偏差是可以接受的,但如果你计划在学术研究论文中使用该结果,或者需要对测试集的准确性进行完全无偏见的测量,这将会是一个问题。

17.如果你有一个大的开发集,将其分成两个子集,只着眼于其中的一个

假设你有一个含有5000个样本的大开发集,其中有20%的错误率。这样,算法将对约1000个开发图片进行错误分类。手动检查1000张图片会花费很长时间,所以我们可能会决定在偏误分析中不使用所有图片。

在这种情况下,我会明确地将开发集分成两个子集,只看其中一个,另一个不看。你将会很快的过拟合你手动查看的那部分。你可以使用未手动查看的部分来调参。

继续上面的例子,在该例子中算法将5000个开发集样本中的1000个进行了错误分类。假设我们想手动检查约100个错误样本(错误样本的10%)进行偏误分析。你应该随机选择10%的开发集,并将其放入我们口中的眼球开发集(Eyeball dev set)中,以提醒我们自己,我们正在用眼睛看它。(对于语音识别项目,你可以在其中听音频剪辑,或许可以将这个数据集称为耳朵开发集)。因此,眼球开发集有500个样本,其中我们预计算法会错误分类约100个。

开发集的第二个子集叫做黑盒开发集(Blackbox dev set),它将拥有剩余的4500个样本。你可以使用黑盒开发集,通过测量它们的错误率来自动评估分类器。也可以使用它来选择算法或调超参。但是,你应该避免用眼睛去看它。我们使用术语“黑盒”是因为我们只使用数据集的子集来获得分类器的“黑盒”评估。

为什么我们将开发集明确分为眼球开发集和黑盒开发集呢?因为你会获得眼球开发集中样本的直观认识,你就会开始更快的过拟合眼球开发集。如果你发现眼球开发集比黑盒开发集性能提升的更快,你已经过拟合眼球开发集了。这种情况下,你可能需要丢弃它并找一个新的眼球开发集,可以通过将更多黑盒开发集中的样本移到眼球开发集中,也可以通过获取新的标注数据来获得。

将开发集明确地分为眼球和黑盒可以让你知道手动偏误分析过程中什么时候会开始导致数据的眼球部分过拟合。

18.眼球和黑盒开发集应该多大?

你的眼球开发集应该足够大,大到可以让你了解到算法的主要错误类别。如果你正在从事一项人类表现很好的任务(如识别图像中的猫),以下是一些粗略的指导方针:

· 一个使你的分类器犯错10次的眼球开发集将被认为是非常小的。只有10个错误,很难准确估计不同错误类别的影响。但如果您的数据非常少,并且无法将更多的数据放入眼球开发集,那么有总比没有好,这将有助于项目的优先顺序。

· 如果分类器在眼球开发集上样本上犯了约20个错误,你将会开始大致了解主要的错误来源。

· 如果有约50个错误,你将会比较好的了解主要的错误来源。

· 如果有约100个错误,你将会很清楚主要的错误来源。我见过有人手动分析更多的错误——有时候多达500个。只要你有足够多的数据,这是没有坏处的。

假设你的分类器有5%的错误率。为了确保在眼球开发集中有约100个错误标记的样本,眼球开发集应该有约2000个样本(因为0.05 * 2000 = 100)。分类器的错误率越低,为了获得足够多的错误来分析,眼球开发集就需要越大。

如果你正在做一个连人都做不好的任务,那么检查眼球开发集将不会有什么帮助,因为很难找出算法不能正确分类一个样本的原因。这种情景下,你可能会忽略眼球开发集。我们将在后续章节中讨论这些问题的指导方针。

黑盒开发集该如何?我们之前说过,开发集有约1000-10000个样本是正常的。为了完善这个表述,尽管更多的数据几乎没什么坏处,一个有1000-10000个样本的黑盒开发集通常会为你提供足够的数据去调超参和选择模型。一个含有100个样本的黑盒开发集比较小,但仍然有用。

如果你有一个小的开发集,那么你可能没有足够的数据将其分成足够大的眼球和黑盒开发集来达到目的。相反,你的整个开发集可能不得不用作眼球开发集——也就是说,你将手动检查所有的开发集数据。

在眼球和黑盒开发集之间,我认为眼球开发集更重要(假设你正在研究一个人类能够很好解决的问题,检查这些样本能帮你获得洞察力)。如果你只有一个眼球开发集,你可以在这个开发集上进行偏误分析、模型选择和调超参。只有一个眼球开发集的缺点是过拟合开发集的风险更大。

如果你有数据的充足访问权限,那么眼球开发集的大小将主要取决于你有时间去手动分析的样本的数量。例如,我很少看到有人手动分析超过1000个错误。

19.结语:基本偏误分析

· 当你开始一个新项目时,尤其是在一个你不是专家的领域,很难正确猜测出最有前景的方向。

· 所以,不要在开始试图设计和构建一个完美的系统。相反,应尽可能快(可能在短短几天内)的构建和训练一个基本系统。然后使用偏误分析去帮助你识别最有前景的方向,并通过迭代改进你的算法。

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

· 考虑将开发集分为手动检查的眼球开发集和不手动检查的黑盒开发集。如果在眼球开发集上的性能比在黑盒开发集上好很多,那么你已经过拟合眼球开发集了,并且应该考虑为其添加更多的数据。

· 眼球开发集应该足够大,以便于算法有足够多的错误分类样本供你分析。对很多应用来说,含有1000-10000个样本的黑盒开发集已经足够了。

· 如果你的开发集没有大到可以按照这种方式进行拆分的程度,那么就使用眼球开发集来用于手动偏误分析、模型选择和调超参。

20. 偏差和方差:错误的两大来源

假设你的训练集、开发集和测试集都来自相同的分布。那么你应该试图去获取更多的训练数据,因为这样能只提高性能,对吗?

尽管有更多的数据是没有坏处的,但是也不总是如我们期望的那样有帮助。获取更多的数据可能是浪费时间。所以,你需要决定何时该加数据,何时不用这么麻烦。

机器学习中有两个主要错误来源:偏差和方差。理解它们将有助于你决定添加数据以及其他提高性能的策略是否是对时间的良好利用。

假设你希望构建一个5%错误率的猫识别器。目前,你的训练集错误率为15%,并且你的开发集错误率为16%。在这种情况下,添加训练数据可能不会有太多帮助。你应该着眼于其他改变。实际上,在你的训练集上添加更多的样本只会让你的算法难以在训练集上做的更好。(我们会在后面的章节中说明原因。)

如果你在训练集上的错误率是15%(85%的准确率),但是你的目标是5%错误率(95%准确率),那么第一个要解决的问题是提高算法在训练集上的性能。你的开发/测试集上的性能通常比在训练集上要差。所以,如果算法在见过的样本上得到85%的准确率,那么是不可能在没见过的样本上得到95%的准确率的。

假设如上所述你的算法在开发集上有16%的错误率(84%的准确率)。我们将这16%的错误分为两部分:

· 第一,算法在训练集上的错误率。在该例中,它是15%。我们非正式地将此认为是算法的偏差(bias)

· 第二,算法在开发(或测试)集上比训练集上差多少。在该例中,开发集比训练集差1%。我们非正式地将此认为是算法的方差(variance)6。

对学习算法的一些修改能解决错误的第1个组成部分——偏差,并且提高算法在训练集上的性能;一些修改能解决错误的第2个组成部分——方差,并帮助算法从训练集到开发/测试集上更好的泛化7。为了选择最有希望的改变,了解这两组错误中哪个更亟待解决是很有用的。

开发关于偏差和方差的良好直觉将帮助你为算法选择有效的改变。

备注:

6(统计领域对偏差和方差有更正式的定义,我们不用担心这些。粗略地说,偏差是当你有一个非常大的训练集时,你的算法在训练集上的错误率。方差是与此设置中的训练集相比,你在测试集上差多少。当你的误差衡量是均方差(mean squared error)时,你可以写下指定这两个量的公式,并证明总误差 = 偏差 + 方差(Total Error = Bias + Variance)。但是你的目的是如何在机器学习问题上取得进展,这里给出的偏差和方差的更非正式的定义就足够了。)

7(这里还有一些通过对系统架构做出大的改变的方法,能够同时减少偏差和方差。但是这些方法往往难以识别和实施。)

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
城市应急指挥系统是智慧城市建设的重要组成部分,旨在提高城市对突发事件的预防和处置能力。系统背景源于自然灾害和事故灾难频发,如汶川地震和日本大地震等,这些事件造成了巨大的人员伤亡和财产损失。随着城市化进程的加快,应急信息化建设面临信息资源分散、管理标准不统一等问题,需要通过统筹管理和技术创新来解决。 系统的设计思路是通过先进的技术手段,如物联网、射频识别、卫星定位等,构建一个具有强大信息感知和通信能力的网络和平台。这将促进不同部门和层次之间的信息共享、交流和整合,提高城市资源的利用效率,满足城市对各种信息的获取和使用需求。在“十二五”期间,应急信息化工作将依托这些技术,实现动态监控、风险管理、预警以及统一指挥调度。 应急指挥系统的建设目标是实现快速有效的应对各种突发事件,保障人民生命财产安全,减少社会危害和经济损失。系统将包括预测预警、模拟演练、辅助决策、态势分析等功能,以及应急值守、预案管理、GIS应用等基本应用。此外,还包括支撑平台的建设,如接警中心、视频会议、统一通信等基础设施。 系统的实施将涉及到应急网络建设、应急指挥、视频监控、卫星通信等多个方面。通过高度集成的系统,建立统一的信息接收和处理平台,实现多渠道接入和融合指挥调度。此外,还包括应急指挥中心基础平台建设、固定和移动应急指挥通信系统建设,以及应急队伍建设,确保能够迅速响应并有效处置各类突发事件。 项目的意义在于,它不仅是提升灾害监测预报水平和预警能力的重要科技支撑,也是实现预防和减轻重大灾害和事故损失的关键。通过实施城市应急指挥系统,可以加强社会管理和公共服务,构建和谐社会,为打造平安城市提供坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值