Building a Spam Classifier
Prioritizing What to Work On
假设我们现在有一个任务,是建立一个垃圾邮件分类器。首先我们想到可以通过邮件里的内容来进行分类,比如人工选出100个词,作为100个特征xjx_jxj,如果该词存在于邮件当中就将该词对应的xjx_jxj置为1,否则为0。当我们建立好训练集,就可以开始对模型进行训练,训练完成之后就可以开始分类了。
实际中,人工选择特征是不太准确的,一般我们选取训练集中出现频率最高的nnn个词(10000~50000),这样更具有实际意义。
当我们建立好模型,也训练好了。接下来我们的任务就是如何提高我们分类器的准确率了。对于垃圾邮件分类器来说,我们有三个方向的选择:
- 收集大量的数据
- 选择、运用复杂的特征(如利用email的header数据)
- 编写精细复杂的算法去处理我们的输入(如识别垃圾邮件中的故意的错误单词拼写)
如果不进行任何分析,很难说我们需要从哪方面入手对我们的模型进行优化。
Error Analysis
由于机器学习算法有很多优化方向,而且实际中任何优化方向都会花费我们很多的时间。凭直觉选择或者随意选择都是不合理的,于是我们需要对我们的算法模型进行error analysis。
接下来为Andrew Ng教授给出的推荐步骤:
- 首先给出一个可以很快编写和运行的简单算法和模型,然后进行训练,最后用验证集进行测试。(不要一开始就去追求复杂的算法,不要想着一开始就能取得一个理想的test error,而浪费更多的时间)
- 画出学习曲线,决定模型是需要使用更多的数据,还是需要更多的特征等
- 误差分析:除了使用学习曲线,还有一种非常有效的方法叫作误差分析。人工地检查在验证集中被我们的算法错误分类的数据,从这些分离出的数据集中我们探究是否存在某种趋势或某种特征导致分类失误,例子如下。
通过上图,我们发现有一半的错误分类邮件都是关于盗取密码的,这关于盗取密码的53封错误分类邮件中,又有32封邮件有着胡乱使用标点符号的特征。那么我们就可以有针对性的对这类邮件进行处理并添加标点符号这一特征。
当我们完成了改进,很重要的一点,我们需要一个单一的数值结果来表征我们的error,否则我们很难去描述我们的模型算法的效果。通过这个单一数值,我们就能知道,当我们使用了新的特征,新的数据处理算法,模型是否变好了。