继续是机器学习课程的笔记,本节课的内容主要是介绍如何设计一个机器学习系统。
首先要做什么
这节课将介绍如何设计一个机器学习系统,首先是以设计一个垃圾邮件分类器算法作为例子。
为了解决这个问题,首先要决定的是如何选择并表达特征向量x,然后使用
然后这里的特征x,可以选择100个最常出现在垃圾邮件中的词来构成一个向量,那么将得到一个
实践中,一般会使用出现频率最多的n个词语(10000到50000个)作为训练集,而不是手动选择100个单词。
接下来就是考虑如何优化算法,即提高算法的效果了。
对于垃圾邮件分类器算法,我们可以选择下列其中一个方法来去改进算法:
- 首先是收集更多的数据,这样可以有更多的垃圾邮件和非垃圾邮件的样本,而且这个也是一个解决过拟合的办法
- 基于邮件的路由信息开发一系列复杂的特征
- 基于邮件的正文信息开发一系列复杂的特征,比如对于像单词”discount”和”diccounts”是否视为同一个单词处理,如何处理如”deal”和”Dealer”,还有就是有关标点符号的问题
- 为探测刻意的拼写错误开发复杂的算法,比如写成m0rtgage,med1cine(medicine),w4tches(watches)
这些方法很难决定应该在哪个方法上花费时间和精力,可以任意挑选其中一个方法来专研下去,但是切记首先需要做的是列出可行的方法有哪些,然后再挑选,而不是凭着感觉想到什么方法就用什么方法。
误差分析
误差分析可以帮助我们系统化地选择该做什么。
构建一个学习算法的推荐方法如下:
- 先设计一个简单快速实现的算法,实现该算法并用交叉验证集测试这个算法
- 绘制学习曲线,即判断是低拟合还是过拟合,然后再决定是增加数据,或者增加特征,还是做其他选择
- 进行误差分析,即人工检查交叉验证集中算法错误分类的实例,看看这些实例是否有某种系统化的趋势。
这里还是用垃圾邮件分类器为例,误差分析要做的是检验交叉验证集中我们算法产生错误预测的所有邮件,看:
- 是否能将这些邮件按照类分组。例如医药品垃圾邮件,仿冒品垃圾邮件或者密码窃取邮件等。然后看分类器对哪一组邮件的预测误差最大,并着手优化。
- 思考如何改进分类器。如发现是否缺少某些特征,记下这些特征出现的次数。比如记录错误拼写出现了多少次,异常的邮件路由情况出现了多少次等,然后从出现次数最多的情况开始着手优化。
误差分析并不能总帮助我们判断应该采取什么办法,有时我们需要尝试不同的模型,然后进行比较,而在模型进行比较的时候,使用数值来判断那一个模型更好更有效,通常我们是看交叉验证集的误差。
比如在垃圾邮件分类器例子中,对于“我们是否应该将discount/discounts/discounted/discounting处理成同一个词语?”,如果这样子可以改善我们的算法,这里看采用一些词干提取软件来查看单词的前几个字母是否相同,当然这里可能会有误判断的情况,比如universe(宇宙)和university(大学)这两个单词前面7个字母都是相同的,很有可能被认为是同一个单词。
但是这里一旦尝试采用词干提取软件来改进算法,我们就可以通过对比使用前后的交叉验证集误差来判断是否需要使用。而这就是使用数值检验的好处了。
类偏斜的误差度量
类偏斜情况表现为训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。
假设我们希望用算法来预测癌症是否是恶性的,在训练集中只有0.5%的实例是恶性肿瘤。假设我们编写一非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有0.5%。但是通过训练而得到的神经网络算法却有1%的误差,那么,此时误差的大小是不能视为算法效果的依据的。
这里就引入查准率(Precision)和查全率(Recall)。
我们将算法预测的结构分成4种情况:
- 正确肯定(True Positive,TP): 预测为真,实际为真
- 错误否定(False Negative,FN): 预测为假,实际为真
- 错误肯定(False Positive,FP): 预测为真,实际为假
- 正确否定(True Negative,TN): 预测为假,实际为假
如下图所示:
上图左侧表格就是一个比较形象的表示,行表示的是预测结果,列表示实际的结果。
所以,
- 查准率=TPTP+FP,例如,在所有预测为恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
- 查全率=TPTP+FN,例如,在所有实际有恶性肿瘤的病人中,被预测为由恶性肿瘤的病人的百分比,也是越高越好。
那么对于刚刚总是预测肿瘤为良性的算法,其查全率是0,因为其正确肯定TP=0。
查全率和查准率之间的平衡
这里继续使用预测恶性肿瘤的例子。这里使用逻辑回归算法,然后使用阈值是0.5来预测是否是恶性肿瘤。
假设我们希望只在非常确信的情况下预测为真,即肿瘤是恶性的,也就是希望更高的查准率,那么可以使用比0.5更多的阈值,即0.7,0.9等,这样的确可以减少无措预测病人为恶性肿瘤的情况,但是也会增加未能成功预测肿瘤为恶性的情况。
另一种情况,就是希望提供查全率,也就是尽可能让所有有可能是恶性肿瘤的病人得到进一步地检查和诊断,那么就可以使用比0.5更小的阈值,如0.3,0.1等。但是这也必然会增加错误预测为恶性肿瘤的数量,也就是会降低查准率。
我们可以将不同阈值情况下,查全率和查准率的关系绘制成图表,如下所示:
所以我们希望有一个帮助我们选择这个阈值的方法。一种方法是计算F1值,其计算公式如下:
我们选择使得F1值最高的阈值。这里其实还是有很多其他方法结合考虑查准率和查全率,但是出于历史原因以及习惯原因,大多数使用的还是F1方法。
机器学习的数据
最后来探讨下一个关键的因素,就是使用的数据集的数据量大小。
视频中举出一个例子,有两个人研究一个如何对混淆的词语进行分类的问题。这里使用的算法有如逻辑回归算法,一种叫Winnow的算法,一种基于内存的算法,以及朴素贝叶斯方法。而下面是这不同算法的准确率随着训练集数量增多而变化的曲线图。
从上图中可以看出,尽管数据量非常大的时候,所有算法的效果都是非常好的。
通常情况下需要思考,在使用的这些特征面前,一个真人专家是否可以有信心地预测结果。如果回答是肯定的,我们需要思考的就是我们的模型是如何的。如果算法是高偏差,即过拟合了,那么增加训练集的数据量就不太可能导致过拟合,这样可以使得交叉验证集误差和训练集误差的差距更小,这种情况就必须使用更多数据。
也可以这样认识这个问题,我们是希望我们的算法低偏倚和低偏差的,所以做法就应该是选择更多的特征来降低偏倚,再增加数据量来降低偏差。
小结
本节课主要是介绍如何设计一个机器学习系统,也就是针对某个问题,如何设计一个机器学习算法来解决,包括一开始先设计一个简单的快速实现方法,然后通过误差分析,学习曲线等来继续改进算法,提高算法的效果。然后还介绍了查全率和查准率的概念。