公开课地址:https://class.coursera.org/ml-003/class/index
授课老师:Andrew Ng
1、prioritizing what to work on:spam classification example(垃圾邮件分类系统)
前面学到的都是一些理论知识外加实践过程中的诊断方法,这一讲是针对一个实际问题进行分析-垃圾邮件分类系统。相信大部分用过email的人都知道什么是垃圾邮件,对垃圾邮件也深恶痛觉,如果不知道什么是垃圾邮件的请看下面:
左边很明显是一个垃圾邮件,先看发送邮箱诡异的名字,再看发送内容中各种拼写错误的单词,估计就知道这肯定不是人写的而是电脑产生的了。相比之下右边的邮件就是非垃圾邮件。为了区别出垃圾邮件,首先要做的应该是寻找一些可以标记什么是垃圾邮件的特征,找到这些特征以后,再进行有监督的分类就能把垃圾邮件找出来了。
至于特征,我们可以从单词入手:
如上所示,可以选择出现频率最高的100个单词作为候选集,得到一个100维的向量,然后从垃圾邮件中查看是否出现这些单词,如果出现就把对应位置标记为1,这样每一封垃圾邮件都能对应一个100维的向量。不过如果要更精确一些,100个单词显然是不够的。为了提高准确率,可以采用下面几种方法:
翻译过来是:
收集大量数据,显然的
从邮件路由信息着手建立较为复杂的特征,诸如发件者邮箱
对邮件正文建立复杂精确的特征库,例如是否应把discount和discounts视作同一个词等
建立算法检查拼写错误,例如针对med1cine这样拼写错误的词
2、error analysis(错误分析)
既然知道了该怎么做,那接下来就是行动了。这里Andrew Ng教授给出了他自己的见解:
翻译过来如下:
尽可能快的实现一个简单的算法,无论是逻辑回归还是线性回归也好,先利用简单的特征,然后在验证数据集上进行测试;
利用画学习曲线的方法去研究是增加数据还是增加特征对系统更有利
错误分析:人工去查看是哪些数据造成了错误的产生,错误的产生和样本之间是否存在一种趋势?
在进行简单的算法实现和验证后,我们对模型做错误分析可以把垃圾邮件再分为四类(Pharma,Replica/fake,Steal passwords,Other):
现在可以考虑针对一些词的不同形式是不是该看成一样的,这里不应该主观的去想当然,而是通过比较错误率来确定,例如下面就是针对discount这个词的各种变形判断是不是应该看成是一个词:
3、error metrics for skewed classes(倾斜类误差度量)
什么是Skewed Classes呢?一个分类问题,如果结果仅有两类y=0和y=1,而且其中一类样本非常多,另一类非常少,我们称这种分类问题中的类为Skewed Classes. 可以举个例子,如果要判断病人是否患癌症,假设采用逻辑回归的方法,误差率是1%(也就是预测1%的患者得癌症),但实际情况只有0.5%的患者得癌症,相比之下,预测没有人得癌症的误差率只不过才0.5%而已。
可以说,单纯从分类误差率来看,比我们之前的逻辑回归要强,可事实上我们清楚这种方法只是耍技巧罢了,不能用作实际使用。因此,我们引入误差度量矩阵这个概念:
考虑一个二分问题,即将实例分成正类(positive)或负类(negative)。对一个二分问题来说,会出现四种情况。如果一个实例是正类并且也被预测成正类,即为真正类(True positive),如果实例是负类被预测成正类,称之为假正类(False positive)。相应地,如果实例是负类被预测成负类,称之为真负类(True negative),正类被预测成负类则为假负类(false negative),总结如下:
TP:正确肯定的数目;
FN:漏报,没有正确找到的匹配的数目;
FP:误报,给出的匹配是不正确的;
TN:正确拒绝的非匹配对数;
于是就能得到上图左侧的那个矩阵,并且可以定义准确率(precision)和召回率(recall).
precision:正确预测正样本/所有预测为正样本的;
recall:正确预测正样本/真实值为正样本的;
关于这两个值的更多介绍可以看这里:http://en.wikipedia.org/wiki/Precision_and_recall
4、trading off precision and recall(权衡准确率与召回率)
有了前面准确率和召回率的定义后,下面在进行判断的时候就可以以这两个值作为标准。还是考虑前面的癌症诊断问题,这里存在一个阈值的选择问题,当概率大于多少时我们才能判断为癌症呢?如果阈值设定的很大,比如99%,准确率很高,但是召回率很低,相反则是准确率很低,召回率很高。我们的目的是让这两者都尽可能的大,于是出现了权衡。
也可以这样分析:如果我们希望在很确信的情况下才告诉病人有癌症,也就是说不要给病人太多惊吓,我告诉你有癌症,你肯定有癌症;我告诉你没癌症,你也有可能有癌症,那么该情况下有:高阈值,高精度,低召回率。如果我们不希望让病人错过提前治疗,与上例相反,就有:低阈值,低精度,高召回率。
既然要在两个值中权衡,那到底是怎么个权衡方法呢?让两者的均值最大?
在上面三个算法中,如果用均值来计算,则算法3胜出,其实算法3针对所有情况都预测为真,显然是不对的,为此引入F1-Score值,可以发现当P和R值都尽量大的时候才会保证F1score尽可能大,一个大一个小的情况并不能保证F1score最大。可以说,在选择算法时,只需要找到一个让F1score值最大的算法即可。
5、data for machine learning(机器学习数据)
在机器学习中,对于预测问题,可以选用很多方法,一般来说,当数据量越大时准确率会越高:
当然事实并不总是这样,前面已经提到过在一些情况下增加训练样本对预测准确性没有任何提高。这里暂时不考虑这一情况,我们需要考虑的是是否有足够的数据能让模型做预测,如果连足够的数据都没有,甚至连人类专家都无法做出预测,那我们凭什么指望机器能给出准确预测呢?
可以总结:想要保证偏差小,就要保证有足够多的特征;想要保证方差小,就要保证不产生过拟合,那么就需要很多训练集。这里需要J(train)和J(CV)都很小,才能使J(test)相对小。
-------------------------------------------------弱弱的分割线----------------------------------------------------
这一讲介绍了如何针对一个具体的垃圾邮件分类系统进行设计,同时引入了误差度量矩阵这个重要概念,在衡量一个算法好坏时,我们不应该只看误差,而应该要综合考虑准确率和召回率两个值的大小,这是一个权衡问题。不过为了方便,我们把这两个值糅到一起得到了F1score这个值,以后评价算法好坏只需要判断F1score即可。