# 2.2 清楚标注错误的数据（Cleaning up Incorrectly labeled data）

监督学习问题的数据由输入$$x$$和输出标签$$y$$ 构成，如果发现有些输出标签 $$y$$ 是错的，是否值得花时间去修正这些标签？

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/56f907e76f4fc8f589f1930128f77a98.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/56f907e76f4fc8f589f1930128f77a98.png)

倒数第二不是猫，是标记错误的样本。“标记错误的样本”表示学习算法输出了错误的 $$y$$ 值，如果数据有一些标记错误的样本，该怎么办？

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/a9cd24c7602100aaa8fb69eb03a3c47c.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/a9cd24c7602100aaa8fb69eb03a3c47c.png)

训练集：深度学习算法对于训练集中的随机错误是相当健壮的（**robust**）。只要这些错误样本离随机错误不太远，有时可能做标记的人没有注意或者不小心，按错键了，如果错误足够随机，放着这些错误不管可能也没问题，而不要花太多时间修复它们，只要总数据集足够大，实际错误率可能不会太高

深度学习算法对随机误差很健壮，但对系统性的错误没那么健壮。如果做标记的人一直把白色的狗标记成猫，那就成问题。因为分类器学习之后，会把所有白色的狗都分类为猫。但随机错误或近似随机错误，对于大多数深度学习算法来说不成问题

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/e5c7f1005d695914f4a2fc988aa46821.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/e5c7f1005d695914f4a2fc988aa46821.png)

开发集和测试集有标记出错的样本：在错误分析时，添加一个额外的列，统计标签 $$y=1$$错误的样本数。统计因为标签错误所占的百分比，解释为什么学习算法做出和数据集的标记不一样的预测1

是否值得修正6%标记出错的样本：

* 如果标记错误严重影响了在开发集上评估算法的能力，应该去花时间修正错误的标签
* 如果没有严重影响到用开发集评估成本偏差的能力，不应该花时间去处理

看3个数字来确定是否值得去人工修正标记出错的数据：

* 看整体的开发集错误率，系统达到了90%整体准确度，10%错误率，应该看错误标记引起的错误的数量或者百分比。6％的错误来自标记出错，10%的6%是0.6%，剩下的占9.4%，是其他原因导致的，比如把狗误认为猫，大猫图片。即有9.4%错误率需要集中精力修正，而标记出错导致的错误是总体错误的一小部分而已，应该看其他原因导致的错误
* 错误率降到了2％，但总体错误中的0.6%还是标记出错导致的。修正开发集里的错误标签更有价值

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/fc5d8fbd1124120e01fc4287896faa44.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/fc5d8fbd1124120e01fc4287896faa44.png)

开发集的主要目的是从两个分类器$$A$$和$$B$$中选择一个。当测试两个分类器$$A$$和$$B$$时，在开发集上一个有2.1%错误率，另一个有1.9%错误率，但是不能再信任开发集，因为它无法告诉你这个分类器是否比这个好，因为0.6%的错误率是标记出错导致的。现在就有很好的理由去修正开发集里的错误标签，因为右边这个样本标记出错对算法错误的整体评估标准有严重的影响，而左边相对较小

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/08c2b44a5718781eb81fe4d0a2bccdde.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/08c2b44a5718781eb81fe4d0a2bccdde.png)

如果决定要去修正开发集数据，手动重新检查标签，并尝试修正一些标签，这里还有一些额外的方针和原则需要考虑：

* 不管用什么修正手段，都要同时作用到开发集和测试集上，开发和测试集必须来自相同的分布。开发集确定了目标，当击中目标后，希望算法能够推广到测试集上，这样能够更高效的在来自同一分布的开发集和测试集上迭代
* 如果打算修正开发集上的部分数据，最好也对测试集做同样的修正以确保它们继续来自相同的分布。可以让一个人来仔细检查这些标签，但必须同时检查开发集和测试集
* 要同时检验算法判断正确和判断错误的样本，如果只修正算法出错的样本，算法的偏差估计可能会变大，会让算法有一点不公平的优势

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/9d5b710121594f5a1e1bc5e901be52a8.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/9d5b710121594f5a1e1bc5e901be52a8.png)

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/55478871edfd7d384494967008c96972.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/55478871edfd7d384494967008c96972.png)

修正训练集中的标签相对没那么重要，如果训练集来自稍微不同的分布，对于这种情况学习算法其实相当健壮，通常是一件很合理的事情

几个建议：

* 构造实际系统时，需要更多的人工错误分析，更多的人类见解来架构这些系统
* 搭建机器学习系统时，花时间亲自检查数据非常值得，可以帮你找到需要优先处理的任务，然后确定应该优先尝试哪些想法，或者哪些方向
