机器学习和人工智能入门大数据,机器学习,人工智能程序员

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

2019-03-06  本文已影响23人  tomas家的小拨浪鼓

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

本章含盖

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. 求’查准率’和’召回率’的平均值 (不推荐)



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

  2. 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(θ)测试集误差’也会很小。

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

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

上一篇下一篇

猜你喜欢

热点阅读