Building a Spam Classifier
Prioritizing What to Work On
假设我们现在有一个任务,是建立一个垃圾邮件分类器。首先我们想到可以通过邮件里的内容来进行分类,比如人工选出100个词,作为100个特征
x
j
x_j
xj,如果该词存在于邮件当中就将该词对应的
x
j
x_j
xj置为1,否则为0。当我们建立好训练集,就可以开始对模型进行训练,训练完成之后就可以开始分类了。
Error Analysis
由于机器学习算法有很多优化方向,而且实际中任何优化方向都会花费我们很多的时间。凭直觉选择或者随意选择都是不合理的,于是我们需要对我们的算法模型进行error analysis。
接下来为Andrew Ng教授给出的推荐步骤:
- 首先给出一个可以很快编写和运行的简单算法和模型,然后进行训练,最后用验证集进行测试。(不要一开始就去追求复杂的算法,不要想着一开始就能取得一个理想的test error,而浪费更多的时间)
- 画出学习曲线,决定模型是需要使用更多的数据,还是需要更多的特征等
- 误差分析:除了使用学习曲线,还有一种非常有效的方法叫作误差分析。人工地检查在验证集中被我们的算法错误分类的数据,从这些分离出的数据集中我们探究是否存在某种趋势或某种特征导致分类失误,例子如下。
当我们完成了改进,很重要的一点,我们需要一个单一的数值结果来表征我们的error,否则我们很难去描述我们的模型算法的效果。通过这个单一数值,我们就能知道,当我们使用了新的特征,新的数据处理算法,模型是否变好了。
Handling Skewed Data
Error Metrics for Skewed Classes
刚刚我们提到单一数值的误差度量是很重要的,我们需要通过这个数值来评判我们模型的好坏和泛化能力。对于分类问题,如果我们一般采用classification accuracy(classification error),即正确分类的样本数除以总样本数。但是这样的误差度量对于带有skewed class(倾斜类)的样本来说不是很准确。所谓skewed class就是样本中,一类样本特别少,另一类样本特别多的情况。下图为例:
- Precision
对于所有我们判定
y
=
1
y=1
y=1的类,实际上有多少比例是真正的
y
=
1
y=1
y=1 - Recall
对于所有的真正
y
=
1
y=1
y=1的类,实际上我们判定了多少比例的
y
=
1
y=1
y=1
对于刚刚的情况(只有0.5%的人患有癌症,如果我们全部判定没有癌症),accuracy为99.5%,recall为0,那么显然这个算法就有问题,不能使用。
Trading Off Precision and Recall
有了Precision和Recall,我们就能解决带有skewed class的样本问题。在实际问题中,很多时候我们需要对Precision和Recall进行一定的权衡。我们依然以判定是否病人有癌症为例。
我们知道运用逻辑回归,一般我们将阈值设置为0.5,即当
h
θ
(
x
)
≥
0.5
h_\theta(x) \ge 0.5
hθ(x)≥0.5预测
y
=
1
y=1
y=1,
h
θ
(
x
)
<
0.5
h_\theta(x) < 0.5
hθ(x)<0.5预测
y
=
0
y=0
y=0。但其实我们可以调整阈值来达到不同的效果:
1. 阈值高
我们希望我们判断的准确度高,即要么我们不下判断,一旦下了判断
y
=
1
y=1
y=1,那么这个样本实际上就属于
y
=
1
y=1
y=1(即判断一个病人有癌症,那么他就有癌症),但是这种情况容易漏掉很多
y
=
1
y=1
y=1的样本(即他有癌症,但是我们判定他没有癌症),召回率低。
2. 阈值低
我们希望我们需要判断出样本中所有的
y
=
1
y=1
y=1,即宁可错判,也不要放过一个(为了避免错将有癌症的人判定为没有癌症,耽误他们的治疗)。这样做的话,召回率就高,当然准确率就会比较低了。
那么接下来的问题是如何判定这个算法和模型的好坏呢,如果是只有单一数值度量,那么当然我们就可以直接运用这个度量来进行评判。但是对于带有skewed class的样本有了两个测量值(准确度和召回率),就需要把它们结合起来转化为一个数值度量,因此我们引入
F
1
Score
F_1 \ \text{Score}
F1 Score。
Using Large Data Sets
对于机器学习任务来说,很多时候不是谁的算法好谁就能取得很高的accuracy,而是取决于谁的训练数据大,如果训练数据大小差上好几个量级,再好的算法也是无济于事的。
但是我们前面也经常提到过,并不是所有的情况下,只要增大数据集就有效,这与上面的说法并不矛盾,因为训练集大正确率就高是有前提条件的。就是我们选取的feature带有足够的信息以至于能够很好的预测
y
y
y 。那么怎么判断我们选取的特征带有足够的信息呢,我们只需要知道在人类相应领域的专家能否通过这些特征很好的预测出
y
y
y 就行了,如果可以说明这些特征足够了,如果不行,说明这些特征不够或者特征选取有误。因为一味增加数据集对欠拟合的模型是没有帮助的。
最后下面这张图就是讲述了大数据集能够取得很好的error的道理。