Machine Learning(Andrew)Week6(下)

Machine learning system design

优先做什么——构建特征向量

以垃圾邮件分类为例 

很容易看出,左边的是垃圾邮件,我们用“y=1”表示;右边的不是垃圾邮件,用“y=0”表示。

这是人工看出来的,如果是垃圾邮件分类器,它是怎么看出来的呢?

垃圾邮件分类器并不能像我们一样思考语义,揣测意图。它能做的就是根据“垃圾邮件的说明”来判断。什么意思呢?我们告诉它,如果一个邮件里,有很多下面这些单词出现,它就是垃圾邮件。


所以x1=Dealx2=Buyx3=Discountx4=buy……它们构成了特征向量X={x1x2x3……}这些单词,构成“垃圾邮件的特征”feature 向量X。

Andrew举例到,列100个属于“垃圾邮件”的高频词汇,组成X。

现在,来了一封邮件email。我们要看X中的单词在email中是否出现。

发现Deal,Buy,Now都出现了,Discount没出现。所以要标记x1=1,x2=1,x3=0,x4=1……

也就是代表“是垃圾邮件”的100个高频单词xj如果出现在email中,令xj=1,否则为0。(j=1……100)

100个高频单词,人工绞尽脑汁想出来已经有一定困难了,如果要得到更多垃圾邮件特征单词,就更困难了。这时,我们的做法就是从训练集中选出出现频率最高的1000050000的单词,作为特征。

如何训练精确度高错误率低的垃圾邮件分类器呢?

(1)收集大量数据:借助“honeypot”project。一个专门收集垃圾邮件的项目

(2)从垃圾邮件的路由信息(在邮件头部)建立一些复杂的特征(比如发件人的邮箱不存在;邮件头部有3个以上有3个以上的“Recived:”)

(3)对正文部分建立复杂的特征库,要考虑如:是否将“discount”和“discounts”视为同一个单词?“discount”和“discounts”又是否相同?标点符合是否作为特征?

(4)用复杂的算法去检查拼写错误,如m0rtgage,med1cine,w4tches

错误分析Error analysis

建议:

(1)快速实现一个简单的算法(Andrew说他一天实现),用交叉验证来检验。

(2)画学习曲线来决定是增加数据量,增加特征,或者其他的使算法更好的方式

(3)错误分析:用交叉验证集,人工看看哪些数据造成了大错误。看看关注的数据和错误之间是不是存在系统化的趋势?

仍以垃圾邮件分类为例看看错误分析:

Mcv=500封交叉验证的email

算法错误的分了100封email

现在我们要人工的看看这100封是为什么分错了。需要考虑两个问题:

(1)email是什么类型?(我们把垃圾邮件分为四类:Pharma、Replica/fake、Steal passwords、Other)

(2)什么样的特征有利于修正算法错误?

针对上面的两个问题不是乱猜,而是提供数据上的支持。

对问题(1),我们将100封邮件分成上述的四组,看看哪一组分错的最多,进行优化,如

发现Steal passwords分错最多,那就要对这种类型的垃圾邮件特征进行更精确描述

对于问题(2),我们要考虑什么样的特征描述犯错比较严重,如

发现不寻常的标点符号导致错分了很多,就要对标点符号特征更加用心关注。

数值评估的重要性

如果判断是否将discount/discounts/discounted/discounting看做同一个单词有助于我们提高算法性能,可以用Porter stemmer软件,来分析它们是否是同一个单词。错误分析却不能做出这种判断来看它们是否是同一个单词,但是它提供一种思路来看看使用软件做这种判断是否有效。

数值评估就是将软件判断的有效性用数字呈现。

比如,我们不使用Porter stemmer软件时,错误率是5%;使用后错误率是3%

Error metrics for skewed classes 

用“病人是否有癌症”来说明什么是skewed classes。

训练逻辑回归模型hθ(x),如果是癌症y=1;否则y=0。

你可以想象,毕竟得癌症还是少数人,所以y=1的人还是占少数的。假设1000个病人,其中有5个有癌症,如果人工预测全都没有得癌症,也就0.5%的错误率;但是如果用逻辑回归模型来做的话,在交叉验证集上的错误率却是1%。

所以,我们完全可以写一个算法:

该算法,不管病人资料输入的是什么,预测所有病人都没有得癌症。

这个算法和我们人为预测一样准确,0.5%的错误率,比逻辑回归做的要好。可是,显然这是一种自欺欺人的行为,肯定不能作为实际预测。

上述的癌症预测就是skewed classes问题,即分类问题中,一类问题比另一类多太多了。如(图片来自网络):

对于这类问题,用error metric 来度量(Hsuan-Tien Lin第八讲的Choice of Error Measure

也提到,只是称法有点不同)。

来看看error metric


True positiveTrue negative是没有error的,预测和实际是一样。用1 表示有癌症,0表示没有癌症。

False positive就是Hsuan-Tien Lin讲的False accept:本来你是没有癌症的,结果说你有癌症

False negative就是Hsuan-Tien Lin讲的False reject:本来你是有癌症的,结果说没有癌症

精确率Precision:预测为有癌症的病人中,真的有癌症的比例。

召回率Recall:真的有癌症的病人中,预测为有癌症的比例。


现在我们算算假设1000个病人,其中有5个有癌症,如果算法全都预测为没有癌症时的Precision和Recall。


计算Precision=0;Recall=0。

所以,那个算法是不切实际的。

从上面看出,我们希望precision和recall越高越好,但是这不太可能。

Trading off precision and recall

如果用Logistic regression回归做预测,模型是hθ(x),0≤hθ(x)≤1

if hθ(x)≥0.5,y=1

if hθ(x)<0.5,y=0

在逻辑回归的时候说过,hθ(x)是病人有癌症的概率,如果我们认为只有非常有把握的时候,才确定为有癌症。这样我们就把阈值调大。比如0.7,0.9;这样预测就变为:

if hθ(x)≥0.7,y=1

if hθ(x)<0.7,y=0

或者是

if hθ(x)≥0.9,y=1

if hθ(x)<0.9,y=0

这样会减少False positive的数量,即误诊为癌症的个数。也会使False negative数量增加,即“有癌症,但因为不够有把握而说没有”。所以,增加阈值,higher precision,lower recall。

但是,如果我们认为,不应该放过疑似的情况,不然病人会错过就诊。那么,我们就会把阈值设置的低点。比如0.3

if hθ(x)≥0.3,y=1

if hθ(x)<0.3,y=0

这时,我们会使False negative减少,但是False positive会增多,因为误诊。所以,降低阈值,lower precision,higher recall。

二者的关系可以用这个图:

F score

不同的算法或者不同的阈值造成不同的精确率和召回率,所以,我们应该怎么选算法使得,精确率和召回率之间有一个很好的平衡。

假设我们有三个算法:

我们有可能想算一个precision和recall的平均值来比较三个算法哪个好。

(Precision+Recall)/2

但是这显然是不可行,我们算出算法3的均值最高,但是它的recall是1,也就是说算法3把所有的病人都预测为有癌症。这和我们前面说的不靠谱的算法没什么不同。

所以,我们用F score,即:

来选择算法。

我们计算上面三个算法的F1值:

F1Algorithm1=2*0.5*0.4/(0.5+0.4)=0.44

F1Algorithm2=2*0.7*0.1/(0.7+0.1)=0.175

F1Algorithm3=2*0.02*1/(0.02+1)=0.0392

可见算法1是最好的。

Data for machine learning

Designing a high accuracy learning system

Banko and Brill[2001]设计了一个分类器,区分易混淆的单词如{two,too,to},{then,than}……

该学习系统要在特定的句子中选出对的单词,如:

For breakfast I ate ___ eggs 。

A :two   B :too  C:to

他们用了这些算法:

-Perceptron Logistic regression

-Winnow

-Memory-based

-Naïve Bayes

他们对这四种算法的准确率和训练数据的数量之间的关系,做了比较,绘制了张图:

最后得出了个结论说“It’s not who has the best algorithm that wins .It’s who has the most data”

但是,我们在week6(上)说到了高variance时适合采取增加训练数据数量。

要在特征的信息足够做准确预测时选用大数据。比如说,要预测房屋价格,如果只给了面积的特征,而没有其他的如房龄、房间数等。这时,即使给了再多的数据也没法做准确预测。

所以使用大数据的前提是,算法有足够参数时,如逻辑回归或线性回归有很多特征时;神经网络有很多隐藏单元。这些算法有low bias,Jtrain会很小。这样的前提下,在使用更多的训练数据,会降低拟合,使variance减小,因为Jtrain≈Jtest,这样Jtest也会很小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值