11 机器学习系统设计
11.1 首先做什么
比如我们要做一个垃圾邮件分类器,那首先就要选择并表达特征向量。邮件的主要内容是单词,所以我们可以根据出现在邮件中的单词是正常单词还是不正常单词来决定这是不是垃圾邮件。
选择一个由 100 个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中出现,来获得我们的特征向量(出现为 1,不出现为 0),尺寸为 100×1(实际上这个单词量可以很大)
为了构建这个分类器算法,我们可以做很多事,例如:
- 收集更多的数据,让我们有更多的垃圾邮件和非垃圾邮件的样本
- 基于邮件的路由信息开发一系列复杂的特征
- 基于邮件的正文信息开发一系列复杂的特征,包括考虑截词的处理
- 为探测刻意的拼写错误(把 watch 写成 w4tch)开发复杂的算法
头脑风暴出一个好的方法是很有意义的。
11.2 误差分析
解决问题时可以想一个简单的算法,然后用学习曲线或者检验误差来验证得到的结果,然后再进行优化。这样才能高效的解决问题。
学习曲线:可以解决的问题是高方差和高偏差的问题。
误差分析:我们在构造垃圾邮件分类器时,看一看交叉验证数据集,然后亲自看一看哪些邮件被算法错误地分类。因此,通过这些被算法错误分类的垃圾邮件与非垃圾邮件,可以发现某些系统性的规律:什么类型的邮件总是被错误分类。经常地这样做之后,这个过程能启发你构造新的特征变量,或者告诉你:现在这个系统的短处,然后启发你如何去提高它。
量化的数值评估:直观的看数字的大小来判断你的想法是否是正确的。要在交叉验证集上实施误差分析
11.3 类偏斜的误差度量
一个实际问题:加入病人患有恶性肿瘤的几率是0.5%,如果误差度量值是1%,那么一个很简单的算法(如y=0)都能让误差保持在很好的范围内,但是却没有用。
这类问题叫做偏斜类问题。类偏斜情况表现为我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。
查准率(Precision)和查全率(召回率)(Recall) 我们将算法预测的结果分成四种情况:
- 正确肯定(True Positive,TP):预测为真,实际为真
- 正确否定(True Negative,TN):预测为假,实际为假
- 错误肯定(False Positive,FP):预测为真,实际为假
- 错误否定(False Negative,FN):预测为假,实际为真
则:查准率=TP/(TP+FP)。例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
查全率(召回率)=TP/(TP+FN)。例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
所以查准率和召回率高的模型是一个好模型。(但是能同时达到吗)
11.4 查准率和查全率(召回率)之间的权衡
如果我们希望只在非常确信的情况下预测为真(肿瘤为恶性),即我们希望更高的查准率,我们可以使用比 0.5 更大的阀值,如 0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况(即降低召回率)
如果我们希望提高查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比 0.5 更小的阀值,如 0.3。 (但是也会降低查准率)
以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同:
我们希望有一个帮助我们选择这个阀值的方法。一种方法是计算F1 值(F1 Score),其计算公式为:
11.5 机器学习的数据
不要盲目地开始,花大量的时间来收集大量的数据,因为数据有时是唯一能实际起到作用的。
但是什么时候期望获得更多数据,而不是修改算法?
事实上,如果你选择任意一个算法,可能是选择了一个"劣等的"算法,如果你给这个劣等算法更多的数据,那么从这些例子中看起来的话,它看上去很有可能会其他算法更好,甚至会比"优等算法"更好。
当我们有一个含有大量参数的学习算法,而且有一个更大的训练集,,那么这些算法就不太可能会过度拟合。也就是说训练误差有希望接近测试误差。
但是事实上我们得不到一组庞大的训练集然后训练一个有很多参数的学习算法,所以更多时候我们是找到一个性能很好的学习算法。