该系列文章为,观看“吴恩达机器学习”系列视频的学习笔记。虽然每个视频都很简单,但不得不说每一句都非常的简洁扼要,浅显易懂。非常适合我这样的小白入门。
本章含盖
- 12.1 确定执行的优先级
- 12.2 误差分析
- 12.3 不对称性分类的误差评估
- 12.4 精确度和召回率的权衡
- 12.5 机器学习数据
12.1 确定执行的优先级
垃圾邮件分类器:y=1 表示‘垃圾邮件’
y=0 表示’非垃圾邮件’
为了应用‘监督学习’,首先需要想到的是,如何表示’邮件的特征向量x’,通过特征向量 x 和分类标签 y。我们就能训练一个分类器。比如使用逻辑回归的方法。
👇有一种选择邮件特征向量的方法:
我们可以提供一个可能包含100个单词的列表,通过这些单词来区分垃圾邮件或非垃圾邮件。
特征向量 仅表示这个词是否在邮件中出现过,而不表示出现的次数。
在实际工作中普遍的做法是,在训练集中,我们会挑选频率最多的 n 个单词,n 一般在 10000 到 50000 之间,然后将它作为你的特征向量。
如果你正在构建一个‘垃圾邮件分类器’,你会遇到的一个问题是,如何在有限的时间内,让你的‘垃圾邮件分类器’具有高精准度和低错误率。收集大量的数据
一个很容易想到的方法是,收集大量的数据,确实有一种倾向认为,数据收集的越多,算法就会越准确。
实际上在‘垃圾邮件分类器’领域就有一个正规的项目,叫做Honey Pot项目。这个项目通过创建虚假的邮箱地址,然后故意将这些地址,暴露给垃圾邮件的发送者,以此来收集大量的垃圾邮件,然后得到大量的垃圾邮件数据来训练分类算法。用更复杂的特征变量,来描述邮件。
通过邮件的标题,来构建一个更加复杂的特征,来捕获到这封邮件的来源信息关注邮件的主体部分,并构建更复杂的特征
设计更复杂的算法,来检查出单词中故意出现的拼写错误
我们可能绞尽脑汁的想出了一堆👆这样的方法去设计我们的‘垃圾邮件分类器’系统,但是,我们无法得知那个方法是有效的
12.2 误差分析
通过‘误差分析’从众多的方法中做出选择。
对错误分类的邮件进行分析、分类
a)Pharma
b)replica/fake
c)steal passwords
d)other思考有什么特征能够保证你的算法正确的分类它们。
a)检查故意的拼写错误
b)不常用的email 路由
c)不常见的邮件符号
所以,👆这样的误差分析是一种手动地去检查算法所出现的失误的过程。
对于不同的算法,不同的学习算法而言,对它们造成困难的样本总是相似的,通过一个简单粗暴的算法实现,你可以很快找到算法的不足所在和难以处理的样本类型。
词干提取只会识别单词的前几个字母,这有利也有弊。比如,’universe’和‘university’看成是一个单词。
这时,错误分析(error analysis)很难帮助我们决定使用’词干提取’是否对我们的算法有益。我们只能实现一遍带有‘词干提取’的算法来验证效果是否有所提升。
这时我们就需要’数值评估(numerical evaluation)’来对算法的记过进行评估了。如,可以将 未使用’词干提取’的算法的错误率 与 使用了’词干提取算法’的错误率 进行比较。
对这个特定的问题,这个很自然的,单一规则的数值评价指标就叫做交叉验证错误率。在这之后,这种带有‘数值评估指标’的例子,还需要进行一些其他处理。
所以,当你改进学习算法时,你总是要去尝试很多新主意和新版本的算法,如果你每次试用新方法都手动地去检测这些例子,看看表现的好不好,会让你很难去决定到底应不应该使用词干提取,该不该区分大小写。但是通过一个单一规则的数值评估指标,你可以观察误差率是变大了还是变小了,你可以通过它更快地实践你的新想法。
所以,我强烈建议在‘交叉验证’上做‘错误分析’,而不是在’测试集’上。
人工手动的分析错误例子,是为了对问题进行归类,同时对大头问题思考解决的方案,而‘数值评估’是快速帮我们验证,我们的解决方法是否有效了。
12.3 不对称性分类的误差评估
👆这种情况出现在 正例和负例的比率非常接近于一个极端的情况。我们将这种情况称之为“偏斜类”。即,一个类中的样本数与另一个类的数据相比多很多,通过总是预测y=0或y=1算法可能表现非常好。
因此,使用分类误差或者分类精确度,来作为评估度量可能出现如下问题:
比如,你算法的精确率为 99.2% (error:0.8%)
然后,你对算法做了一些改动后,精确率为 99.5%(error:0.5%),那么这个新的算法到底是否好于旧的算法了?可能,你的新算法仅是将预测值都返回了0。
所以,如果你有一个偏斜类,then,用分类精确度,并不能很好地衡量算法。因为你可能会获得一个很高的精确度,非常低错误率。但我们不知道我们是否真的提升了分类模型的质量。
因此对于’偏斜类’,我们希望有一个不同的’误差度量值’或者不同的’评估度量值’,其中一种评估度量值叫做’查准率(准确率)’和’召回率’
True Positive (真正例, TP)被模型预测为正的正样本;可以称作判断为真的正确率
True Negative(真负例 , TN)被模型预测为负的负样本 ;可以称作判断为假的正确率
False Positive (假正例, FP)被模型预测为正的负样本;可以称作误报率
False Negative(假负例 , FN)被模型预测为负的正样本;可以称作漏报率
通过使用’查准率’和’召回率’,我们发现即使我们拥有非常偏斜的类,算法不能够通过总是预测 y = 1、或 y = 0 来欺骗我们,因为它们不能够获得高的查准率和召回率。具体地说,如果一个分类模型拥有高的查准率和召回率,那么我们可以确信地说,这个算法表现很好,即便我们拥有很偏斜的类。
12.4 精确度和召回率的权衡
- 只有在我们非常确信的情况下,才会预测一个病人是否患了癌症。
这样做的一种方法,是修改算法的临界值。如,将算法的临界值从0.5修改为0.7。 - 避免遗漏掉患有癌症的人,即我们希望避免假阴性。
通常来说,对于大多数的逻辑回归模型,你得权衡查准率和召回率。
那么,这又产生了一个问题,那就是,有没有办法自动选取临界值了?或者更泛的说,如果我们有不同的算法,或者不同的想法,我们如何比较不同的’查准值’和’召回率’???
更具体的说,比如我有不同的学习算法,或者相同的学习算法,不同的临界值,我们该如何决定哪一个算法是好的了?
与此相反的是,如果我们有一个评估度量值,一个数字,能够告诉我们到底是算法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
👆可见,随着训练集数据量的增加,这些算法的性能也都对应地增强了。事实上,如果你选择一个算法,可能是选择了一个劣质的算法,如果你给这个劣质算法更多的数据,那么从这个例子中看起来的话,它看上去很有可能比其他算法更好,甚至会比优质算法更好。
许多不同的学习算法有时倾向于依赖一些细节,并表现出相当相似的性能,但是真正能提高性能的是你能够给予一个算法大量的训练数据。
像这样的结果,引起了一种在机器学习中常用说法:并不是拥有最好算法的人能成功,而是拥有最多数据的人成功。
那么,这种情况什么时候是真?什么时候是假了?👆这些算法是低偏差算法,因为我们能够拟合非常复杂的函数。因为我们有非常强大的学习算法,这些算法可以拟合非常复杂的函数。虽然我们有很多很多的特征参数,但是如果我们的训练集数量大于参数数量,那么就不太可能过度拟合。由此,我们可以推测出 'J_train(θ)训练集误差’ 可能接近于 'J_test(θ)测试集误差’。
最后,因为'J_train(θ)训练集误差’很小,而'J_test(θ)测试集误差’又接近于'J_train(θ)训练集误差’,那么这就意味着'J_test(θ)测试集误差’也会很小。
另一种考虑这个问题的方式是为了,有一个高性能的学习算法。我们希望它不要有高的偏差和方差。因此偏差问题,我们将通过确保有一个具有很多参数的学习算法来保证,以便我们能够得到一个较低偏差的算法,并且通过用非常大的训练集来保证,我们在此没有方差问题。
从根本上来说:’特征值有足够的信息量’,这是一个关键的假设。