「吴恩达机器学习」12.机器学习系统设计
本章主要讲解机器学习系统的设计,给出一些构建复杂机器学习系统的建议,可以在构建大型机器学习系统时节约时间。
Prioritizing what to work on: Spam classification example
本章以构建一个垃圾邮件分类器为例讲解机器学习系统设计。
下面有两封邮件,左边为垃圾邮件,右边为正常邮件。可以看到左边邮件会出现一些故意拼写错误的单词,就是为了逃过垃圾邮件分类器的识别。
为了解决这样一个问题,我们首先要考虑的就是如何选择并表达特征向量\(x\)。
我们可以选择一个由100个最常出现在垃圾邮件中的单词所构成的列表,根据这些单词是否出现在邮件中,生成一个\(100 \times 1\)的特征向量(出现为1,不出现为0)。
实际中,通常采用出现频率最高的10000到50000个单词,而不是人工选择100个单词。
构建好特征向量之后,我们还有很多事情需要做:
- 收集大量数据。
- 根据邮件标题开发一系列复杂特征。
- 根据邮件内容开发一系列复杂特征 (E.g. “discount” 和 “discounts”是否应该算作同一个单词?“deal” and “Dealer”是否应该算作同一个单词?要不要关注标点符号?)
- 开发复杂算法检测错误拼写 (e.g. m0rtgage, med1cine, w4tches.)
在上面这些事情中,很难决定应该重点花费时间在哪一项上。
下一节课的误差分析,会讲解怎样用一个更加系统性的方法,从一堆不同的方法中,选择合适的那一个。
Error analysis
本节课主要讲解误差分析的概念,如何通过误差分析引导我们学习算法的改进方向。
Recommended approach
研究机器学习问题的推荐步骤:
-
实现一个简单粗暴的机器学习算法,然后在验证集上面进行测试。
-
绘制学习曲线,以确定是否需要更多的数据、更多的特征等。
-
误差分析:人工检查算法出错的数据(在验证集中),看能否发现某些系统性的规律,什么类型的数据容易出错。
研究机器学习问题时,最多只花24个小时先实现一个简单粗暴的算法(即使效果不好)。实现完之后再通过绘制学习曲线,检查算法是否有高偏差或高方差的问题,然后再以此决定下一步改进的方向。
这么做的原因是,在你刚接触这个问题时,你并不能提前知道是否需要更复杂的特征,或者更多的数据,还是别的什么的。我们必须用证据来引导我们的决策,而不是通过直觉来过早优化算法(这通常是错误的)。
总结起来就是:小步试错,快速迭代。
Error Analysis
通过垃圾邮件分类的例子讲解误差分析。
假如我们的验证集有500个示例,学习算法错误分类了100个邮件,那么我们可以手动检查100个错误,并根据以下内容进行分类:
- 邮件的类型是啥? (E.g. pharma, replica, steal passwords, ...)
- 你认为哪些特征能帮助算法将其正确分类?
假如最终的分类结果如下,那么我们就可以着手针对最主要的分类错误的类别进行优化。
The importance of numerical evaluation
我们是否应该把“discount/discounts/discounted/discounting”这些单词当作同一个单词?
在自然语言处理中,我们可以采用“词干提取”技术,从上面的一系列单词中提取出相同的词干“disc”,然后把它们判定为同一个单词。但是这是一个双刃剑,如“universe/university”这中本不应该被认为是同一个单词的也会被认为是同一个单词。
对于这类问题,误差分析并不总是能够帮助我们判断应该采取什么样的行动,有时候我们需要尝试不同的模型,然后进行比较,我们就可以通过数值化的方式来评估哪个模型更好,比如采用验证误差作为一个判断指标。
Error metrics for skewed classes
主要讲解了什么是偏斜类,以及如何更好地评估偏斜类的准确度。
Cancer classification example
以癌症分类问题为例,假如我们对逻辑回归模型\(h_\theta(x)\)(\(y=1\) if cancer, \(y=0\) otherwise)进行训练,最终在训练集上只有1%的错误(99%正确诊断),这个结果表面上看起来似乎很好。但是考虑到只有0.5%的病人患癌症,这种各个类别之间占比相差非常大的情况就称为斜偏类(skewed classes)。
假如我们不使用机器学习算法,而是使用下面这种简单的程序:
由于这个程序只会预测0,而数据集中只有0.5%的结果为1,那么上面程序的准确率就高达99.5%,比我们的机器学习算法还要高,说明在斜偏类中采用这种评估方式显然是不合理的。
Precision/Recall
为了更好地评估在斜偏类下机器学习算法的表现,我们提出了查准率(precision)和查全率/召回率(recall)的概念。
\(y=1\)表示我们想要检测出来的,样本比较少的那个类别,在这里就是恶性肿瘤的类别。
首先将算法预测的结果分为4类:TP、TN、FP和FN。
查准率:在预测有癌症的所有人中,有多少真的得了癌症?
查全率/召回率:在所有得了癌症的人中,有多少被预测出来?
对于刚才那个总是预测病人肿瘤为良性的算法,其\(Recall=0\)。
Trading off precision and recall
通过引入F Score讲解如何平衡precision和recall.
Trading off precision and recall
在癌症分类预测问题中,我们采用了下面的逻辑回归模型。
- 假如想要在非常有信心的情况下才预测\(y=1\) (cancer),那么我们可以提高阈值,比如把0.5提高到0.7;
- 假如我们想要避免癌症患者没有被检查出来,那么我们可以降低阈值,比如把0.5降低到0.3。
对于不同的阈值,precison和recall的关系曲线如下图所示,对于不同的模型可能会有不同的曲线。
F1 Score (F score)
那么问题来了,我们如何才能找到合适的阈值?或者说不同的模型有不同的precison和recall,那么我们如何才能进行对比呢?
我们能想到的最简单的办法就是对precison和recall求平均,结果是Algorithm3的效果最好,这显然是不合理的,因为根据我们之前的经验,precison或recall中任何一个参数非常低都是不可取的情况(在斜偏类中)。
所以我们就提出了\(F_1\) Score,综合评估precison和recall,我们只要选取F Score最高的阈值即可。
Data for machine learning
主要讲解了数据对于机器学习模型的重要性。
Designing a high accuracy learning system
在一个通过机器学习算法区分常见易混淆单词的任务中,研究人员将其当作一个分类任务进行处理,他们尝试了许多不同的算法,最后发现数据量非常大的时候,这些不同类型的算法都表现得很好。
一个普通的算法在大量数据的训练下,也能优于一个只有少量训练数据的优秀算法。
Large data rationale
大量数据有用的前提是什么呢?——前提是数据集的特征\(x\)拥有足够的信息去预测\(y\)。
E.g. 仅仅通过房屋面积这个特征去预测房价,即使数据量非常大也只能得到不好的效果。
通常判断特征值的信息量是否足够的有效方法是,对于输入的特征\(x\),一个人类领域专家能够自信地预测出结果\(y\)。
使用一个拥有大量参数的学习模型 (e.g. logistic regression/linear regression with many features; neural network with many hidden units),输入大量的训练数据,通常训练误差\(J_{train}(\theta)\)会非常小,同时使用大量数据的情况下模型通常不会过拟合,因此训练误差约等于测试误差\(J_{train}(\theta) = J_{test}(\theta)\),也就是说最终得到的测试误差\(J_{test}(\theta)\)也会非常小。