Andrew Ng Machine Learning (6) Machine Learning Advice

此文是斯坦福大学 Andrew Ng 所开设的 Coursera 课程:Machine Learning 的课程笔记。
课程网址:
https://www.coursera.org/learn/machine-learning/home/welcome


1. Evaluating a Learning Algorithm

如果一个机器学习方法的结果不令人满意,可能有各种方法来解决。例如:

1
2
3
4
获取更多的训练样本(最为耗时,不作为优先考虑)
尝试更少 / 更多的特征
尝试引入多项式特征
增加 / 减少正则化系数 λ

究竟应该使用哪种方法来解决问题,需要一个诊断过程,称为 Maching Learning Diagnostic。为了更好的阐述,我们先引入两个名词:欠拟合、过拟合

欠拟合:对于训练集,hypothesis 得到的结果,与真实的结果差距较大,并不能对样本集有效拟合;

过拟合:对于训练集,hypothesis 得到的结果,与真实的结果差距较小;但是对于测试集,hypothesis 得到的结果,与真实的结果差距较大。这说明 hypothesis 的泛化能力较差,只是在训练集上得到的效果较好

通常情况下,我们会得到一组数据而不是区分好的训练集与测试集。这时就需要我们做一些处理

首先打乱数据的次序,然后将其之前大约70%的部分来作为训练集,训练样本总数记为m,训练样本记为

剩下的30%部分作为测试集,测试样本总数记为mtest,测试样本记为

在测试集上,我们会计算 hypothesis 与真实数据的偏差。对于线性回归与逻辑回归,有一些不同。这些在之前的系列中都有提及:

线性回归
逻辑回归

我们在训练集、测试集的基础上,再次添加一种数据集:交叉验证集(cross validation set)

比例大约是训练集60%,测试集20%,交叉验证集20%,交叉验证样本总数记为mcv,交叉验证样本记为。而Jcv(θ)的计算方式与Jtest(θ)相同,只是适用的数据集范围不同。

那么问题来了,为什么要区分这三个集合?以及它们的区别是什么呢?

这三个名词在机器学习领域的文章中极其常见,但很多人对他们的概念并不是特别清楚,尤其是后两个经常被人混用。Ripley, B.D(1996)在他的经典专著《Pattern Recognition and Neural Networks》中给出了这三个词的定义。

1
2
3
Training set: A set of examples used for learning, which is to fit the parameters [i.e., weights] of the classifier.
Validation set: A set of examples used to tune the parameters [i.e., architecture, not weights] of a classifier, for example to choose the number of hidden units in a neural network.
Test set: A set of examples used only to assess the performance [generalization] of a fully specified classifier.

显然,training set是用来训练模型或确定模型参数的,如ANN中权值等; validation set是用来做模型选择(model selection),即做模型的最终优化及确定的,如ANN的结构;而 test set则纯粹是为了测试已经训练好的模型的推广能力

当然,test set这并不能保证模型的正确性,他只是说相似的数据用此模型会得出相似的结果。但实际应用中,一般只将数据集分成两类,即training set 和test set,大多数文章并不涉及validation set。
Ripley还谈到了Why separate test and validation sets?

1
2
The error rate estimate of the final model on validation data will be biased (smaller than the true error rate) since the validation set is used to select the final model.
After assessing the final model with the test set, YOU MUST NOT tune the model any further.

对于过拟合,如何选择 model?使用多高次方的多项式拟合?答案是遍历尝试,如下图所示。分别在训练集上计算得到各个θ的值之后,再在交叉验证集(而不是测试集)上计算Jcv(θ),选择Jcv(θ)最小的一个model作为hypothesis.

如此一来,测试集上的Jtest(θ)就可以用于其他评估方向,而依靠交叉验证集来决定多项式拟合的次数。

2. Bias vs. Variance

Bias 与 Variance 并非是通常意义上的名词偏差、方差。而是用于描述两种机器学习中出现的问题。

high bias意味着欠拟合,high variance意味着过拟合。下图可以直观看出来:

接下来,我们从另一些角度来看看 Bias 与 Variance 的表现
以 hypothesis 的多项式次数 d 为横轴,error 为纵轴,我们可以得到在训练集与交叉验证集上的误差曲线为:

对于 Bias 与 Variance 也有了各自的概念:

Bias:Jtrain(θ)较大,Jcv(θ)较大,Jtrain(θ)≈Jcv(θ)。一般是 d(维度)较小的时候,才会产生 bias,欠拟合阶段;

Variance:Jtrain(θ)较小,Jcv(θ)较大,Jtrain(θ)≪Jcv(θ)。一般是 d(维度)较高的时候,才会产生 variance,过拟合阶段

以 hypothesis 的正则化系数 λ 为横轴,error 为纵轴,我们可以得到在训练集与交叉验证集上的误差曲线与上图左右反转:

Bias:Jtrain(θ)较大,Jcv(θ)较大,Jtrain(θ)≈Jcv(θ)。一般是 λ 较大的时候,才会产生 bias,欠拟合阶段;

Variance:Jtrain(θ)较小,Jcv(θ)较大,Jtrain(θ)≪Jcv(θ)。一般是 λ 较小的时候,才会产生 variance,过拟合阶段

那么如何选择 λ 呢?其实类似于选择多项式的维度 d,依次尝试。在确定了多项式维度之后,依次增大 λ 的值后再次计算 Jcv(θ) 的值,找到使得 Jcv(θ) 最小的 λ 值。增大的幅度可以较大,例如 λ=0,0.01,0.02,0.04,0.08,…

3. Learning Curve

learning curve 同样是以 error 为纵轴,只不过这次的横轴换成了训练集的样本数目,但同样是 Jcv(θ) 与 Jtest(θ) 的曲线。一般形状是这样:

在样本较少的时候,训练集很容易被拟合,因此误差较小,但是因为训练样本少所以很难保证对于交叉验证集也是有效的,因此误差较大。

在样本较多的时候,训练集较难被拟合,因此误差升高,但是因为训练样本更多所以有更大可能保证对于交叉验证集也是有效的,因此 Jcv(θ) 会下降。

那么对于 high bias 与 high variance 而言,如果我们使用增加样本个数(最为耗时的方法)m,可否起到什么作用?

由图可以看出,在 high bias 情况下,一般都是由于本身选择的 hypothesis 的模型错误,而与训练集样本个数无关。错的模型训练再多次还是错的。

由图可以看出,在 high variance 情况下,很可能是过拟合问题,而增加训练集样本个数会使得模型的泛化能力进一步增强,从而消除过拟合问题,使得误差降低。

4. Deciding What to Do Next Revisited

回想一下最开始提出的若干种优化方案,各自适用情况有:

1
2
3
4
5
6
获取更多的训练样本 ⇒ high variance
尝试更少的特征 ⇒ high bias
尝试更多的特征 ⇒ high variance
尝试引入多项式特征 ⇒ high bias
增加正则化系数 λ ⇒ high variance
减少正则化系数 λ ⇒ high bias

将以上所有内容,如果引用到神经网络中,同样适用。

小规模(层数少、各层神经元数目少)的神经网络容易出现欠拟合问题;大规模的神经网络容易出现过拟合问题。

那么使用多少个隐藏层?可以使用依次递增层数,交叉验证集上误差来确定。

λ 该如何确定?根据上文,利用交叉验证集,依次递增选择误差最小的确定即可。

5. Building a Spam Classifier

让我们以“垃圾邮件分类(Spam-Classifier)”问题作为例子:如何判断一封邮件是垃圾邮件,还是正常邮件?

很容易我们会想到,依据某些单词作为特征,这些单词的出现与否决定这封邮件的性质。

所以,我们会想到一个0,1组成的特征向量,1代表邮件具备这个特征(出现这个单词),0代表邮件不具备这个特征(没出现这个单词)。

有了基本大方向之后,就要开始一场头脑风暴了,以求提高机器学习的效果。这种行为,不存在标准答案,任何结果都是有可能的:

1
2
3
4
增加数据
采用更为复杂的特征(邮件路径)
基于正文寻找更为精确复杂的特征(discount, discounts 视为同一单词;deal, dealer 视为同一单词)
算法改进(故意拼错隐瞒检查的单词?deeler = dealer)

头脑风暴之后,谁说的才更有道理呢?自然需要各种方法对于误差的分析(error analysis)。这里需要注意:所有的 error analysis 都是在交叉验证集上完成的。

一般来说,机器学习算法的设计会经历以下几个过程:
以最快的速度(一天之内?)用最简单的方法,尝试去解决眼下的问题,并在交叉验证集上验证;

画出 learning curve,去观察,发现现在的问题是 high bias,还是 high variance,需不需要更多的特征?更多的数据集?

error analysis:上面已经在cross-validation数据集上测试了系统性能,现在我们人工去看哪些数据造成了大error的产生?是否可以通过改变systematic trend减少error?

Spam-Classifier 举例,我们看一下进行Error Analysis的步骤:
所有 spam 分为四类:pharma,replica/fake,Steal password 和 其他

如下图,寻找一些可能有助于改善分类效果的features

然后,在是否引入特征的问题上,一定要做实验:例如,可以比较引入此特征前后,预测的准确率是否提高?

error analysis 的核心在于:一定要找到一种数值化的评定方法,以求判断 error 的大小。

6. Handling Skewed Data

首先,我们需要介绍,什么样的数据称为偏斜数据(skewed data)。这次,我们举的例子是预测癌症。

预测癌症例子:实际生活中,癌症的发病率极低,可能在人群中只有0.5%的发病率。假设我们手头有一种预测方法,预测出来有1%的人会发病。这样,按照之前的评价标准,有0.5%的误诊率。但是,如果我不做任何的检查,直接判断病人是没病的,是不是同样有着0.5%的误诊率?这是不应该的,我们化验检查一番力气之后的答案竟然和瞎猜的误诊率相同。

当分类问题中,某一类所占比例极小(一般将较小比例的类别置为1),就会有偏斜数据的问题。

这时候,直接用 error 来描述在这种数据集上的问题不合适,我们需要寻求更新的数值化评价标准。

引入新的标准 precision 和 recall 之前,我们需要介绍几个新名字:

1
2
3
4
True positive:预测结果为真,并且实际分类同样为真
True negative:预测结果为假,并且实际分类同样为假
False positive:预测结果为真,但是实际分类为假
False negative:预测结果为假,但是实际分类为真

说起来有点复杂,来看下面这张图一目了然:

接下来,我们在此基础上,介绍两个评价标准:

查准率(precision):在查出有癌症的患者中,实际患病的概率,公式见上图。precision 越高算法越好

召回率(recall):所有身患癌症的病人中,有多少概率被查出,公式见上图。 recall越高算法越好

再回到一开始的例子,如果我全部将病人视为健康,准确率是99.5%,但是我的查准率和召回率极低。可以判定不是一个好算法。

回到预测癌症例子

如果为了保证确诊率,可以将逻辑回归的分类值由0.5改为0.7,这样一来 precision 必然会升高,但是也会导致 recall 的下降

如果为了引起大家的更多重视,可以将逻辑回归的分类值由0.5改为0.3,这样一来 precision 必然会下降,但是也会导致 recall 的升高

貌似 precision(记为P) 和 recall(记为R) 总是背道而驰,偏偏两者还都是重要的偏斜类上的算法评价标准,如何将这两个标准合为一个?平均值显然是不行的,P=1且R=0时平均值为0.5,看不出端倪。

F值(F-score):F=2PR/(P+R),完美地解决了这个问题。F值的中心思想就是:赋予P、R中更低的值更大的权值,因为P、R总是此消彼长,这样就制约两者必须同时保持在较大值才使得F值较高。可以用于所有有着此消彼长关系的标准的综合评价

7. Using Large Data Sets

一般来说,增大数据集,可以提高算法的 accuracy,但也不全是这样。比如房价预测,如果我仅仅给你房子的面积,而没有房子在市中心还是偏远地区?房龄多少?等信息,我们是无法进行良好预测的。所以,我们需要知道的前提条件是:

如果当前的特征已经足够预测,增大数据集的确可以提高准确性
总结:

  1. 想要保证bias小,就要保证有足够多的feature,即linear/logistics regression中有很多parameters,neuron networks中应该有很多hidden layer neurons

  2. 想要保证variance小,就要保证不产生overfit,那么就需要很多data set(只要样本数远远大于特征数,是无法过拟合每个点)。这里需要Jcv和Jtrain都很小,才能使Jtest相对小

综上所述,对数据及进行理性分析的结果是两条:

首先,x中有足够多的feature,以得到low bias;
其次,有足够大的training set,以得到low variance