以一个垃圾邮件分类器算法为例进行讨论。
y=1表示垃圾邮寄,y=0表示非垃圾邮件。
如何构造一个分类算法来区分垃圾邮件与非垃圾邮件呢?
为了应用监督学习,首先考虑如何表示邮件的特征向量X?
通过特征向量X和分类标签Y,我们就能训练一个分类器,比如使用逻辑回归的方法。
选择邮件的特征向量
我们可以选择一个由 100 个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中出现,来表达我们的特征向量(出现为 1,不出现为 0),尺寸为 100×1。
比如词汇有:deal、buy、discount、name、now…
我们可以将邮件的各个片段编码成如下的一个特征变量:Xj=1表示该邮件中出现了该词汇
这样我们就可以使用特征变量表示这封邮件。
通常,特征变量中的词汇是训练样本中出现最频繁的词,一般在10000到50000之间。
如何使垃圾邮件分类算法具有高精确度和低错误率?
- 收集更多的数据,让我们有更多的垃圾邮件和非垃圾邮件的样本
- 基于邮件的路由信息构造一系列复杂的特征
- 基于邮件的正文信息构造一系列复杂的特征,包括考虑截词的处理
- 为探测刻意的拼写错误(把 watch 写成 w4tch)开发复杂的算法
误差分析
构建一个学习算法的推荐方法为:
- 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法
- 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择
- 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些实例是否有某种系统化的趋势
以我们的垃圾邮件过滤器为例,误差分析要做的是检验交叉验证集中我们的算法产生错误预测的所有邮件,看:是否能将这些邮件按照类分组。例如医药品垃圾邮件,仿冒品垃圾邮件或者密码窃取邮件等。然后看分类器对哪一组邮件的预测误差最大,并着手优化;或者发现是否缺少某些特征,记下这些特征出现的次数,例如记录下错误拼写出现了多少次,异常的邮件路由情况出现了多少次等等,然后从
出现次数最多的情况开始着手优化。
误差分析并不总能帮助我们判断应该采取怎样的行动。有时我们需要尝试不同的模型,然后进行比较,在模型比较时,用数值来判断哪一个模型更好更有效,通常我们是看交叉验证集的误差。
例如:在 我 们 的 垃 圾 邮 件 分 类 器 例 子 中 , 对 于 “ 我 们 是 否 应 该 将discount/discounts/discounted/discounting 处理成同一个词?”如果这样做可以改善我们算法,我们会采用一些截词软件。误差分析不能帮助我们做出这类判断,我们只能尝试采用和不采用截词软件这两种不同方案,然后根据单一规则数值检验的错误率比较来判断哪一种更好。可以使用交叉验证的方式来测试两种方案,比较两种采用不同特征的方法的实际应用错误率,最终采用最低的一种特征方案。
总结一下,在研究一个新的机器学习问题时,总是推荐先实现一个较为简单快速、即便不是那么完美的算法(不要担心你的算法太简单,或者太不完美,而是尽可能快地实现你的算法),当你有了初始的实现之后,它会变成一个非常有力的工具,来帮助你决定下一步的做法;先看看算法造成的错误,通过误差分析,来看看他犯了什么错,然后来决定优化的方式;另一件事是:假设你有了一个快速而不完美的算法实现,又有一个**数值的评估数据,**这会帮助你尝试新的想法,快速地发现你尝试的这些想法是否能够提高算法的表现,从而你会更快地做出决定,在算法中放弃什么,吸收什么误差分析可以帮助我们系统化地选择该做什么。
类偏斜的误差度量
类偏斜情况表现为我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。此时,用分类精确度并不能很好地衡量算法,非常高的精确度和非常低的错误率并不能意味着我们有效提高了分类模型的质量。我们希望有不同的误差度量值或者不同的评估度量值。
例如我们希望用算法来预测癌症是否是恶性的,在我们的训练集中,只有 0.5%的实例是恶性肿瘤。假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有 0.5%。然而我们通过训练而得到的神经网络算法却有 1%的误差。这时,误差的大小是不能视为评判算法效果的依据的。
查准率(Precision)和查全率(Recall)
我们将算法预测的结果分成四种情况:
- 正确肯定(True Positive,TP):预测为真,实际为真
- 正确否定(True Negative,TN):预测为假,实际为假
- 错误肯定(False Positive,FP):预测为真,实际为假
- 错误否定(False Negative,FN):预测为假,实际为真
查准率=TP/(TP+FP) ,例在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
查全率=TP/(TP+FN),在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
这样,对于我们刚才那个总是预测病人肿瘤为良性的算法,其查全率是 0。
查准率和查全率之间的权衡
假使,我们的算法输出的结果在 0-1 之间,我们使用阀值 0.5 来预测真和假。
如果我们希望只在非常确信的情况下预测为真(肿瘤为恶性),即我们希望更高的查准率,我们可以使用比 0.5 更大的阀值,如 0.7,0.9。
如果我们希望提高查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比 0.5 更小的阀值,如 0.3。
我们可以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同:
我们希望有一个帮助我们选择这个阀值的方法。一种方法是计算 F值(F1 Score),其计算公式为:
,结合了查准率和查全率,我们选择使得 F1 值最高的阀值。
关于机器学习的数据集
事实上,如果你选择任意一个算法,可能是选择了一个"劣等的"算法,如果你给这个劣等算法更多的数据,那么从这些例子中看起来的话,它看上去很有可能会其他算法更好,甚至会比"优等算法"更好。
那么在什么情况下这种现象成立呢?
特征信息充足
假如有这样一些假设,在这些假设下有大量我们认为有用的训练集,我们假设在我们的机器学习问题中,特征值𝑥包含了足够的信息,这些信息可以帮助我们用来准确地预测Y。
例如,如果我们采用了一些容易混淆的词,如:two、to、too,假如说它能够描述𝑥,捕捉到需要填写的空白处周围的词语,那么特征捕捉到之后,我们就希望有对于“早饭我吃了__鸡蛋”,那么这就有大量的信息来告诉我中间我需要填的词是“两个”(two),而不是单词 to 或too,因此特征捕捉,哪怕是周围词语中的一个词,就能够给我足够的信息来确定出标签Y;而在房价预测问题中,如果特征值只关于房子大小,而忽略其他的一些影响房价的因子,如:房间数、设施等,这个时候就算有足够多的训练集也不会得到很好的预测模型。
另一种考虑这个问题的角度是为了有一个高性能的学习算法,我们希望它不要有高的偏差和方差。
偏差问题,我们将通过确保有一个具有很多参数的学习算法来解决,以便我们能够得到一个较低偏差的算法,并且通过用非常大的训练集来保证较小的方差,最终可以得到一个低误差和低方差的学习算法。