Coursera机器学习笔记 第6周 第十一章 机器学习系统的设计

版权声明:本文为博主原创文章,如有转载请标注来源。 https://blog.csdn.net/shengchaohua163/article/details/79915725

第十一章 机器学习系统的设计

第1节 建立一个垃圾邮件分类器(Building a Spam Classifier)

11.1 优先考虑要做什么

参考视频: 11 - 1 - Prioritizing What to Work On (10 min).mkv

在接下来的视频中,我将谈到机器学习系统的设计。我将会谈及在设计机器学习系统时,你将遇到的主要问题,同时会给出一些建议。

以一个垃圾邮件分类器为例进行讨论。为了解决这样一个问题,我们要做的是如何表示邮件内容。选择100个最常出现在邮件中的词并组成一个列表,根据这些词是否有在邮件中出现得到特征向量,其中元素为 1 表示出现,为 0 表示不出现。为了构建这个分类器,我们可以做很多事:

  1. 收集更多的数据,让我们有垃圾邮件和非垃圾邮件的样本
  2. 基于邮件的路由信息开发一系列复杂的特征
  3. 基于邮件的正文信息开发一系列复杂的特征,如考虑截词的处理
  4. 为探测刻意的拼写错误(把watch携程w4tch)开发复杂的算法

在上面这些选项中,很难决定应该在哪一项上花费时间和精力。可以进行头脑风暴,列出所有可能方法,然后从这些方法中做出明智的选择,比跟着感觉尝试要好。我们将在下一节讲误差分析,会告诉你一个更加系统性的方法,如何从不同的方法中选取合适的。

11.2 误差分析

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

我们将会讲到错误分析(error analysis),这会帮助你更系统地做出决定。如果你准备研究机器学习的东西,或者构造机器学习应用程序,最好的实践方法不是建立一个非常复杂的系统,而是构建一个简单的算法,这样你可以很快地实现它。

解决机器学习问题的推荐方法是:

  • 从一个简单的算法开始,快速地实现它并在交叉验证数据上进行早期测试
  • 绘制学习曲线,以决定是否增加更多数据或更多特征或其它
  • 进行误差分析:手动检查交叉验证集中有错误的例子,并尝试找出大多数错误发生的趋势。

例如,假设我们有500封电子邮件,我们的算法将其中的100个错误分类。我们可以手动检查这100封电子邮件,并根据他们的邮件类型对其进行分类。然后,我们可以尝试提出新的线索和特征,帮助我们正确地对这100封电子邮件进行分类。因此,如果我们的大多数错误分类的邮件都是那些试图窃取密码的邮件,那么我们就可以找到一些特定于这些邮件的特征,并将它们添加到我们的模型中,就可以降低分类错误率。

误差分析并不总能帮助我们判断采取怎样的行动,有时我们需要尝试不同的模型,这就需要用到了数值评估(numerical evaluation)。数值评价是用一个数值评价算法的表现:

  1. 将错误结果作为一个单独的数值结果是非常重要的,否则,很难评估算法的性能。如果你正在开发一种算法,给出一个真实的数字来评价你它的运行结果。
  2. 例如,如果我们使用词干分析,把一个单词的不同形式(fail/failing/failed)看成一个单词(fail),然后我们得到了3%的错误率而不是5%,那么应该把它加入到我们的模型当中。然而,如果我们试图区分大小写字母和小写字母,最终得到3.2%的错误率而不是3%,那么应该避免使用这个新特性。
  3. 一定要在交叉验证集上实施误差分析,而不是在测试集上。一个实际的数字结果可能是很难计算的,但是可以更容易地评估对算法的影响。

总结一下,当你在研究一个新的机器学习问题时,推荐你实现一个较为简单快速、即便不那么完美的算法。然后看看算法的错误,进行误差分析,决定下一步做什么;如果你有数值评估算法,还可以尝试新的想法,看看是否能提高算法表现。

第2节 处理倾斜数据(Handling Skewed Data)

11.3 倾斜类的误差度量

参考视频: 11 - 3 - Error Metrics for Skewed Classes (12 min).mkv

进行错误分析时,我们用一个误差度量方法评估算法,但是有时很难找到较好的误差度量方法,例如倾斜类(skewed classes)。倾斜类意味着数据集中有非常多的同一类的实例,只有很少或没有其他类的实例。

例如用算法预测癌症,在训练集中,只有0.5%的实例是恶性肿瘤。如果一个算法直接预测肿瘤都是良性的,那么误差只有0.5%,而我们训练得到的神经网络算法可能有1%的误差。这时,误差就不能作为评判算法效果的依据。

下面介绍查准率(Precision, 也叫准确率)和查全率(Recall, 也叫召回率)。用查准率和查全率我们可以把算法预测的结果分为四种情况:

  • 真正例(True Positive, TP): 预测为1(真),实际为1(真)
  • 假正例(False Negative, FP): 预测为1,实际为0
  • 真负例(True Negative, TN): 预测为0,实际为0
  • 假负例(False Positive, FP): 预测为0,实际为1

也可以看下表:

结果 实际为1 实际为0
预测为1 TP FP
预测为0 FN TN

查准率P=TP/(TP+FP), 意思是:在所有预测有恶性肿瘤的人中,实际为有恶性肿瘤的人的比例。查全率R=TP/(TP+FN), 意思是:在所有实际有恶性肿瘤的人中,正确预测为有恶性肿瘤的人的比例。二者都是越高越好。这样对于那个总是预测病人肿瘤为良性的算法,其查全率就是0。

11.4 权衡查准率和查全率

参考视频: 11 - 4 - Trading Off Precision and Recall (14 min).mkv

之前我们谈到查准率和查全率,作为倾斜类问题的评估度量方法。在很多应用中,我们希望保证二者相对平衡。

沿用预测肿瘤的例子,看一下如何权衡查准率和查全率。算法模型是逻辑回归,模型采用阈值0.5,大于等于阈值判断为真,反之则为假。如下图:
这里写图片描述
查准率就是在所有预测有恶性肿瘤的人中,实际为有恶性肿瘤的人的比例;查全率就是在所有实际有恶性肿瘤的人中,正确预测为有恶性肿瘤的人的比例。

如果我们希望只在非常确信的情况下预测为真(是恶性肿瘤),即我们希望得到更高的查准率,那么我们应该使用比0.5更大的阈值,如0.7, 0.9。这样预测为恶性肿瘤的情况就会减少,导致查准率高,查全率低。

如果我们希望提高查全率,尽可能地让所有可能是恶性肿瘤的人都被发现,那么我们应该使用比0.5更小的阈值,如0.3。这样预测为恶性肿瘤的情况就会增加,导致查准率低,查全率高。

我们可以将不同阈值情况下,查全率和查准率的关系绘制成图表,曲线的形状根据数据的不同而不同,但大体上如下图:
这里写图片描述
既然有了两个评价指标,两个数值很难取比较结果孰优孰劣,我们希望有能够把二者转化为一个评价指标。平均数不是一个好的选择,我们更多的采用F1ScoreF1Score=2*P*R/(P+R),并认为F1Score越高则算法的效果越好。

如果你想找到比较好的阈值用于逻辑回归模型,一种方法是尝试一系列的阈值并在交叉验证集中进行评估,选择F1Score最大时对应的阈值即可。

第3节 使用大型数据集(Using Large Data Sets)

11.5 机器学习的数据

参考视频: 11 - 5 - Data For Machine Learning (11 min).mkv

之前我们讨论了评价指标,现在讨论一下机器学习系统设计中另一个重要的方面——数据。构建机器学习系统时,不能盲目地开始,应该花一些时间收集足够的数据,数据是唯一能实际起作用的。大量的数据会帮助学习模型达到良好的性能,但前提是某些条件对于你的问题都成立并且能够得到大量的数据。

问题举例:早餐我吃了__个鸡蛋(to,two,too),这是一个易混淆的单词填空。研究人员把这样的问题当作机器学习中的监督学习问题。他们使用不同的算法并在不同大小的数据集测试分类准确率,如下图:
这里写图片描述

这些趋势比较明显:大部分算法都聚有相似的性能;随着训练数据集的增大,从0.1百万到1000百万,算法的性能都相应地增强了。

事实上,如果你选择了不太好的算法但是用大量的数据集去训练,它的效果很可能比其他算法要好,甚至比那些没有足够数据训练的优等算法更好。这项结果表明,许多不同的学习算法有时倾向于表现出非常相似的结果,但是真正能提高性能的是,用于训练算法的数据集有多大。这引起了一种在机器学习中的普遍共识:“取得成功的人不是拥有最好算法的人,而是拥有最多数据的人”。

那么这种说法什么为真呢,什么时候为假呢?如果为真,那我们只要选择一个一般的学习算法,然后用大量的数据训练就可以得到很高的性能。为真的条件是,机器学习问题中的特征X包含了足够的信息,可以帮助我们预测y,对于“早餐我吃了__个鸡蛋(to,two,too)”,相邻的词语(X)就提供了足够的信息来确定应该选什么词(y)。

特征X包含足够的信息,或者说学习算法有大量参数,或者说模型足够复杂。比如有很多特征的逻辑回归和线性回归,带有许多隐藏单元的神经网络等等,它们都是很强大的学习算法。当它们有很多参数时,可以拟合非常复杂的函数。假设使用非常非常大的训练集去训练这些算法,尽管算法中有很多参数,但是它们就不太可能过拟合,也就说训练误差有希望接近于交叉训练误差。

偏差问题可以用一个带有很多参数的学习算法来解决,方差问题可以用非常大的数据集来保证。所以,用大量的数据集去训练一个带有很多参数的学习算法,我们将得到一个低误差和低方差的模型,这使得我们能够很好地应用到测试数据集上,是我们想要的结果。

猜你喜欢

转载自blog.csdn.net/shengchaohua163/article/details/79915725
今日推荐