前言
介绍设计复杂的机器学习系统时,你将遇到的主要问题。同时会试着给出一些关于如何巧妙构建一个复杂的机器学习系统的建议。
本文以一个垃圾邮件分类器算法为例进行讨论。
正文
对特征的思考
首先想到的问题是如何表示邮件的特征x, 我们可以选择一个由100个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中出现,来获得我们的特征向量(出现为1,不出现为0),尺寸为100×1。 如下图:
这个图的意思是选择了100个可能是垃圾邮件中最常出现的100个单词, 然后按顺序排列, 可能是拼写顺序之类, 然后假如出现了这个单词对应的位置就是1, 没有就是0, 这样就可以得到邮件的特征表示。
为了构建这个分类器算法,我们可以做很多事,例如:
-
收集更多的数据,让我们有更多的垃圾邮件和非垃圾邮件的样本
-
基于邮件的标题信息开发一系列复杂的特征
-
基于邮件的正文信息开发一系列复杂的特征,包括考虑截词的处理
-
为探测刻意的拼写错误(把watch 写成w4tch)开发复杂的算法
从头进行机器学习的步骤: 误差分析
- 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法
- 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择
- 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的样本,看看这些样本是否有某种系统化的趋势
以垃圾邮件过滤器为例,误差分析要做的既是检验交叉验证集中算法产生错误预测的所有邮件,看是否能将这些邮件按照类分组。例如医药品垃圾邮件,仿冒品垃圾邮件或者密码窃取邮件等。然后看分类器对哪一组邮件的预测误差最大,并着手优化。
思考怎样能改进分类器。例如,发现是否缺少某些特征,记下这些特征出现的次数。
例如记录下错误拼写出现了多少次,异常的邮件忽略情况出现了多少次等等,然后从出现次数最多的情况开始着手优化。
误差分析并不总能帮助我们判断应该采取怎样的行动。有时我们需要尝试不同的模型,然后进行比较,在模型比较时,用数值来判断哪一个模型更好更有效,通常我们是看交叉验证集的误差。
偏斜类(Skewed Classes)的误差度量
偏斜类情况表现为我们的训练集中有非常多的同一种类的样本,只有很少或没有其他类的样本。
例如我们希望用算法来预测癌症是否是恶性的,在我们的训练集中,只有0.5%的实例是恶性肿瘤。假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有0.5%。然而我们通过训练而得到的神经网络算法却有1%的误差。这时,误差的大小是不能视为评判算法效果的依据的。所以假如你有一个偏斜类,用分类精确度不是一个好选择。
那么下面讲解适用于偏斜类的评估度量值, 叫做
P
r
e
c
i
s
i
o
n
/
R
e
c
a
l
l
Precision/Recall
Precision/Recall, 翻译为查准率
/
/
/召回率。
我们将算法预测的结果分成四种情况:
-
正确肯定(True Positive,TP):预测为真,实际为真
-
正确否定(True Negative,TN):预测为假,实际为假
-
错误肯定(False Positive,FP):预测为真,实际为假
-
错误否定(False Negative,FN):预测为假,实际为真
-
查准率 P r e c i s i o n Precision Precision=TP/(TP+FP)。例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好
-
召回率 R e c a l l Recall Recall(查全率)=TP/(TP+FN)。例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
这样,对于总是预测病人肿瘤为良性的算法,其查全率是0。
注意这里P即真为占比小的那个.
查准率和查全率之间的权衡
继续沿用刚才预测肿瘤性质的例子。假使,我们的算法输出的结果在0-1 之间,我们使用阀值0.5 来预测真和假. 下图是逻辑回顾的例子.
如果我们希望只在非常确信的情况下预测为真(肿瘤为恶性),即我们希望更高的查准率,我们可以使用比0.5更大的阀值,如0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况。
如果我们希望提高查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比0.5更小的阀值,如0.3。
下图形象的展示了这个过程:
这三个线只是说明可能的回归曲线有些区别,但都会与判断为1的阈值有关系.
我们希望有一个帮助我们选择这个阀值的方法。一种方法是计算F1 值(F1 Score),其计算公式为:
F 1 S c o r e : 2 P R P + R {{F}_{1}}Score:2\frac{PR}{P+R} F1Score:2P+RPR
我们选择使得F1值最高的阀值, 哈哈哈这玩意有没有很像并联的计算, 其实这是调和平均数, 这样使得R, P接近时才好