Machine learning system design
优先做什么——构建特征向量
以垃圾邮件分类为例
很容易看出,左边的是垃圾邮件,我们用“y=1”表示;右边的不是垃圾邮件,用“y=0”表示。
这是人工看出来的,如果是垃圾邮件分类器,它是怎么看出来的呢?
垃圾邮件分类器并不能像我们一样思考语义,揣测意图。它能做的就是根据“垃圾邮件的说明”来判断。什么意思呢?我们告诉它,如果一个邮件里,有很多下面这些单词出现,它就是垃圾邮件。
所以x1=Deal,x2=Buy,x3=Discount,x4=buy……它们构成了特征向量X={x1,x2,x3……}这些单词,构成“垃圾邮件的特征”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个高频单词,人工绞尽脑汁想出来已经有一定困难了,如果要得到更多垃圾邮件特征单词,就更困难了。这时,我们的做法就是从训练集中选出出现频率最高的10000到50000的单词,作为特征。
如何训练精确度高错误率低的垃圾邮件分类器呢?
(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 positive和True 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也会很小。