前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第十二章 机器学习系统设计

第十二章 机器学习系统设计

作者头像
tomas家的小拨浪鼓
发布2019-03-15 10:55:07
5280
发布2019-03-15 10:55:07
举报
文章被收录于专栏:木木玲木木玲

该系列文章为,观看“吴恩达机器学习”系列视频的学习笔记。虽然每个视频都很简单,但不得不说每一句都非常的简洁扼要,浅显易懂。非常适合我这样的小白入门。

本章含盖

  • 12.1 确定执行的优先级
  • 12.2 误差分析
  • 12.3 不对称性分类的误差评估
  • 12.4 精确度和召回率的权衡
  • 12.5 机器学习数据

12.1 确定执行的优先级

垃圾邮件分类器:

y=1 表示‘垃圾邮件’ y=0 表示’非垃圾邮件’

为了应用‘监督学习’,首先需要想到的是,如何表示’邮件的特征向量x’,通过特征向量 x 和分类标签 y。我们就能训练一个分类器。比如使用逻辑回归的方法。 ?有一种选择邮件特征向量的方法: 我们可以提供一个可能包含100个单词的列表,通过这些单词来区分垃圾邮件或非垃圾邮件。

特征向量 仅表示这个词是否在邮件中出现过,而不表示出现的次数。

在实际工作中普遍的做法是,在训练集中,我们会挑选频率最多的 n 个单词,n 一般在 10000 到 50000 之间,然后将它作为你的特征向量。

如果你正在构建一个‘垃圾邮件分类器’,你会遇到的一个问题是,如何在有限的时间内,让你的‘垃圾邮件分类器’具有高精准度和低错误率。

  1. 收集大量的数据 一个很容易想到的方法是,收集大量的数据,确实有一种倾向认为,数据收集的越多,算法就会越准确。 实际上在‘垃圾邮件分类器’领域就有一个正规的项目,叫做Honey Pot项目。这个项目通过创建虚假的邮箱地址,然后故意将这些地址,暴露给垃圾邮件的发送者,以此来收集大量的垃圾邮件,然后得到大量的垃圾邮件数据来训练分类算法。
  2. 用更复杂的特征变量,来描述邮件。 通过邮件的标题,来构建一个更加复杂的特征,来捕获到这封邮件的来源信息
  3. 关注邮件的主体部分,并构建更复杂的特征
  4. 设计更复杂的算法,来检查出单词中故意出现的拼写错误

我们可能绞尽脑汁的想出了一堆?这样的方法去设计我们的‘垃圾邮件分类器’系统,但是,我们无法得知那个方法是有效的

12.2 误差分析

通过‘误差分析’从众多的方法中做出选择。

  1. 对错误分类的邮件进行分析、分类 a)Pharma b)replica/fake c)steal passwords d)other
  2. 思考有什么特征能够保证你的算法正确的分类它们。 a)检查故意的拼写错误 b)不常用的email 路由 c)不常见的邮件符号

所以,?这样的误差分析是一种手动地去检查算法所出现的失误的过程。 对于不同的算法,不同的学习算法而言,对它们造成困难的样本总是相似的,通过一个简单粗暴的算法实现,你可以很快找到算法的不足所在和难以处理的样本类型。

最后,在改进学习算法时,另一个技巧是保证自己对学习算法有一种数值估计的方法。即,你在改进学习算法时,如果你的算法能够返回一个数值评价指标,来估计算法执行的效果。

词干提取只会识别单词的前几个字母,这有利也有弊。比如,’universe’和‘university’看成是一个单词。 这时,错误分析(error analysis)很难帮助我们决定使用’词干提取’是否对我们的算法有益。我们只能实现一遍带有‘词干提取’的算法来验证效果是否有所提升。 这时我们就需要’数值评估(numerical evaluation)’来对算法的记过进行评估了。如,可以将 未使用’词干提取’的算法的错误率 与 使用了’词干提取算法’的错误率 进行比较。

对这个特定的问题,这个很自然的,单一规则的数值评价指标就叫做交叉验证错误率。在这之后,这种带有‘数值评估指标’的例子,还需要进行一些其他处理。

所以,当你改进学习算法时,你总是要去尝试很多新主意和新版本的算法,如果你每次试用新方法都手动地去检测这些例子,看看表现的好不好,会让你很难去决定到底应不应该使用词干提取,该不该区分大小写。但是通过一个单一规则的数值评估指标,你可以观察误差率是变大了还是变小了,你可以通过它更快地实践你的新想法。 所以,我强烈建议在‘交叉验证’上做‘错误分析’,而不是在’测试集’上。

人工手动的分析错误例子,是为了对问题进行归类,同时对大头问题思考解决的方案,而‘数值评估’是快速帮我们验证,我们的解决方法是否有效了。

12.3 不对称性分类的误差评估

当我们不是用机器学习算法时,直接将预测值的返回设定为0,此时程序在训练集上的预测正确率为95%,甚至比我们使用机器学习算法的正确率还高。。。 ?这种情况出现在 正例和负例的比率非常接近于一个极端的情况。我们将这种情况称之为“偏斜类”。即,一个类中的样本数与另一个类的数据相比多很多,通过总是预测y=0或y=1算法可能表现非常好。 因此,使用分类误差或者分类精确度,来作为评估度量可能出现如下问题: 比如,你算法的精确率为 99.2% (error:0.8%) 然后,你对算法做了一些改动后,精确率为 99.5%(error:0.5%),那么这个新的算法到底是否好于旧的算法了?可能,你的新算法仅是将预测值都返回了0。 所以,如果你有一个偏斜类,then,用分类精确度,并不能很好地衡量算法。因为你可能会获得一个很高的精确度,非常低错误率。但我们不知道我们是否真的提升了分类模型的质量。 因此对于’偏斜类’,我们希望有一个不同的’误差度量值’或者不同的’评估度量值’,其中一种评估度量值叫做’查准率(准确率)’和’召回率’

注意,我们会将稀少数据的情况,设定为 y = 1 的情况。

True Positive (真正例, TP)被模型预测为正的正样本;可以称作判断为真的正确率 True Negative(真负例 , TN)被模型预测为负的负样本 ;可以称作判断为假的正确率 False Positive (假正例, FP)被模型预测为正的负样本;可以称作误报率 False Negative(假负例 , FN)被模型预测为负的正样本;可以称作漏报率

通过使用’查准率’和’召回率’,我们发现即使我们拥有非常偏斜的类,算法不能够通过总是预测 y = 1、或 y = 0 来欺骗我们,因为它们不能够获得高的查准率和召回率。具体地说,如果一个分类模型拥有高的查准率和召回率,那么我们可以确信地说,这个算法表现很好,即便我们拥有很偏斜的类。

12.4 精确度和召回率的权衡

  1. 只有在我们非常确信的情况下,才会预测一个病人是否患了癌症。 这样做的一种方法,是修改算法的临界值。如,将算法的临界值从0.5修改为0.7。
  2. 避免遗漏掉患有癌症的人,即我们希望避免假阴性。

通常来说,对于大多数的逻辑回归模型,你得权衡查准率和召回率。

在固定的算法公式下,你可以通过设定不同的threshold值来画出,?这个图

那么,这又产生了一个问题,那就是,有没有办法自动选取临界值了?或者更泛的说,如果我们有不同的算法,或者不同的想法,我们如何比较不同的’查准值’和’召回率’??? 更具体的说,比如我有不同的学习算法,或者相同的学习算法,不同的临界值,我们该如何决定哪一个算法是好的了?

我们之前讲到,’评估度量值’的重要性,这个概念是,通过一个具体的数字来反映你的回归模型到底如何,但是查准值和召回率的问题,我们却不能这样做。因为在这里,我们有两个可以判断的数字,因此,我们经常会不得不面对?这样的情况。

与此相反的是,如果我们有一个评估度量值,一个数字,能够告诉我们到底是算法1好还是算法2好。

实现一个’评估度量值’的方法:

  1. 求’查准率’和’召回率’的平均值 (不推荐)

缺点:可能出现’偏斜类’时,误将不好的算法当做好的算法看待(即,’查准率’和’召回率’呈极端情况,可能是正向和反向数据样本分别极端导致,也可能是因为设置的临界值太大或太小导致) 因此,我们能够通过是否具有一个非常低的’查准率’(同时,具有非常高的’召回率’)或非常低的’召回率’(同时,具有非常高的’查准率’)来判断这个算法是不是一个不好的算法。

  1. F 值,又称’F_1 值’ (推荐)

我们使用调和平均而不是简单的算术平均的原因是:调和平均可以惩罚极端情况。一个具有 1.0 的精度,而召回率为 0 的分类器,这两个指标的算术平均是 0.5,但是 F1 score 会是 0。

当然,如果你的目标是自动选择临界值,来决定你希望预测 y = 1,还是 y = 0。那么一个比较理想的办法是试一试不同的临界值,然后评估这些不同的临界值,在交叉验证上进行测试,选择能得到最高F值的那个临界值。

12.5 机器学习数据

使用不同的学习算法的效果,与将这些效果使用到不同训练数据集上,两者的比较。 如,对易混淆的单词进行分类(监督学习)

他们尝试了4中算法: Perceptron Winnow Memory-based Naive Bayes

将这4种算法应用到不同大小的训练集上

?可见,随着训练集数据量的增加,这些算法的性能也都对应地增强了。事实上,如果你选择一个算法,可能是选择了一个劣质的算法,如果你给这个劣质算法更多的数据,那么从这个例子中看起来的话,它看上去很有可能比其他算法更好,甚至会比优质算法更好。

许多不同的学习算法有时倾向于依赖一些细节,并表现出相当相似的性能,但是真正能提高性能的是你能够给予一个算法大量的训练数据。

像这样的结果,引起了一种在机器学习中常用说法:并不是拥有最好算法的人能成功,而是拥有最多数据的人成功。

那么,这种情况什么时候是真?什么时候是假了?

?这些算法是低偏差算法,因为我们能够拟合非常复杂的函数。因为我们有非常强大的学习算法,这些算法可以拟合非常复杂的函数。虽然我们有很多很多的特征参数,但是如果我们的训练集数量大于参数数量,那么就不太可能过度拟合。由此,我们可以推测出 'J_train(θ)训练集误差’ 可能接近于 'J_test(θ)测试集误差’。 最后,因为'J_train(θ)训练集误差’很小,而'J_test(θ)测试集误差’又接近于'J_train(θ)训练集误差’,那么这就意味着'J_test(θ)测试集误差’也会很小。

另一种考虑这个问题的方式是为了,有一个高性能的学习算法。我们希望它不要有高的偏差和方差。因此偏差问题,我们将通过确保有一个具有很多参数的学习算法来保证,以便我们能够得到一个较低偏差的算法,并且通过用非常大的训练集来保证,我们在此没有方差问题。

从根本上来说:’特征值有足够的信息量’,这是一个关键的假设。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.03.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本章含盖
  • 12.1 确定执行的优先级
  • 12.2 误差分析
  • 12.3 不对称性分类的误差评估
  • 12.4 精确度和召回率的权衡
  • 12.5 机器学习数据
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档