11.2 误差分析

参考视频: 11 - 2 - Error Analysis (13 min).mkv

在本次课程中,我们将会讲到误差分析(error analysis)的概念。这会帮助你更系统地 做出决定。如果你准备研究机器学习的东西,或者构造机器学习应用程序,最好的实践方法 不是建立一个非常复杂的系统,拥有多么复杂的变量;而是构建一个简单的算法,这样你可

以很快地实现它。 每当我研究机器学习的问题时,我最多只会花一天的时间,就是字面意义上的 24 小时,

来试图很快的把结果搞出来,即便效果不好。坦白的说,就是根本没有用复杂的系统,但是

只是很快的得到的结果。即便运行得不完美,但是也把它运行一遍,最后通过交叉验证来检 验数据。一旦做完,你可以画出学习曲线,通过画出学习曲线,以及检验误差,来找出你的 算法是否有高偏差和高方差的问题,或者别的问题。在这样分析之后,再来决定用更多的数 据训练,或者加入更多的特征变量是否有用。这么做的原因是:这在你刚接触机器学习问题 时是一个很好的方法,你并不能提前知道你是否需要复杂的特征变量,或者你是否需要更多 的数据,还是别的什么。提前知道你应该做什么,是非常难的,因为你缺少证据,缺少学习 曲线。因此,你很难知道你应该把时间花在什么地方来提高算法的表现。但是当你实践一个 非常简单即便不完美的方法时,你可以通过画出学习曲线来做出进一步的选择。你可以用这 种方式来避免一种电脑编程里的过早优化问题,这种理念是:我们必须用证据来领导我们的 决策,怎样分配自己的时间来优化算法,而不是仅仅凭直觉,凭直觉得出的东西一般总是错 误的。除了画出学习曲线之外,一件非常有用的事是误差分析,我的意思是说:当我们在构 造垃圾邮件分类器时,我会看一看我的交叉验证数据集,然后亲自看一看哪些邮件被算法错 误地分类。因此,通过这些被算法错误分类的垃圾邮件与非垃圾邮件,你可以发现某些系统 性的规律:什么类型的邮件总是被错误分类。经常地这样做之后,这个过程能启发你构造新 的特征变量,或者告诉你:现在这个系统的短处,然后启发你如何去提高它。

构建一个学习算法的推荐方法为:

  1. 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算

  1. 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择

  2. 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些

实例是否有某种系统化的趋势 以我们的垃圾邮件过滤器为例,误差分析要做的既是检验交叉验证集中我们的算法产生

错误预测的所有邮件,看:是否能将这些邮件按照类分组。例如医药品垃圾邮件,仿冒品垃 圾邮件或者密码窃取邮件等。然后看分类器对哪一组邮件的预测误差最大,并着手优化。

思考怎样能改进分类器。例如,发现是否缺少某些特征,记下这些特征出现的次数。 例如记录下错误拼写出现了多少次,异常的邮件路由情况出现了多少次等等,然后从 出

现次数最多的情况开始着手优化。 误差分析并不总能帮助我们判断应该采取怎样的行动。有时我们需要尝试不同的模型,

然后进行比较,在模型比较时,用数值来判断哪一个模型更好更有效,通常我们是看交叉验 证集的误差。

在 我 们 的 垃 圾 邮 件 分 类 器 例 子 中 , 对 于 “ 我 们 是 否 应 该 将 discount/discounts/discounted/discounting 处理成同一个词?”如果这样做可以改善我们算 法,我们会采用一些截词软件。误差分析不能帮助我们做出这类判断,我们只能尝试采用和 不采用截词软件这两种不同方案,然后根据数值检验的结果来判断哪一种更好。

因此,当你在构造学习算法的时候,你总是会去尝试很多新的想法,实现出很多版本的 学习算法,如果每一次你实践新想法的时候,你都要手动地检测这些例子,去看看是表现差 还是表现好,那么这很难让你做出决定。到底是否使用词干提取,是否区分大小写。但是通 过一个量化的数值评估,你可以看看这个数字,误差是变大还是变小了。你可以通过它更快 地实践你的新想法,它基本上非常直观地告诉你:你的想法是提高了算法表现,还是让它变 得更坏,这会大大提高你实践算法时的速度。所以我强烈推荐在交叉验证集上来实施误差分 析,而不是在测试集上。但是,还是有一些人会在测试集上来做误差分析。即使这从数学上 讲是不合适的。所以我还是推荐你在交叉验证向量上来做误差分析。

总结一下,当你在研究一个新的机器学习问题时,我总是推荐你实现一个较为简单快速、 即便不是那么完美的算法。我几乎从未见过人们这样做。大家经常干的事情是:花费大量的 时间在构造算法上,构造他们以为的简单的方法。因此,不要担心你的算法太简单,或者太 不完美,而是尽可能快地实现你的算法。当你有了初始的实现之后,它会变成一个非常有力 的工具,来帮助你决定下一步的做法。因为我们可以先看看算法造成的错误,通过误差分析, 来看看他犯了什么错,然后来决定优化的方式。另一件事是:假设你有了一个快速而不完美 的算法实现,又有一个数值的评估数据,这会帮助你尝试新的想法,快速地发现你尝试的这

些想法是否能够提高算法的表现,从而你会更快地做出决定,在算法中放弃什么,吸收什么

误差分析可以帮助我们系统化地选择该做什么。