Advice for Applying ML
本节内容:机器学习系统设计的过程中,很可能会出现训练的模型预测误差较大的情况。选用最正确、有效的方法来改进算法是机器学习成功的关键,它可以帮我们节省大量时间。本节就是关于如何高效训练模型,把时间用在刀刃上。
相关机器学习概念:
1. 训练集(training set)、交叉验证集(cross validation set)、测试集(test set)
2. 模型选择(model selection)
3. 学习曲线(learning curves)
1. Evaluating a Learning Algorithm
1.1 Evaluating a hypothesis
评估假设函数拟合效果:
- 特殊方法:画图,观察图形趋势
- 标准方法:
Step1: 随机选择数据集的70%作为训练集(training set),30%作为测试集(test set)
Step2: 用训练集训练参数
θ
θ
Step3: 用测试集计算测试误差
Jtest(θ)
J
t
e
s
t
(
θ
)
对于回归问题,
对于分类问题,如逻辑回归,有
分类问题的测试误差还有另一种更好理解的表达方式,也被称作0/1错分率(misclassification error)
其中
1.2 Model selection and training/validation/test sets
1.2.1 Model selection
模型的特征数不是越多越好,过多的特征数容易导致过拟合。确定模型的多项式次数d(d=polynomial level)是机器学习系统设计中重要的一环,这也被称作模型选择(model selection)问题。
假设我们有十个多项式次数递增的备选模型(d=1,2,…,10),确定多项式次数的步骤如下:
Step1: 用训练集训练每个模型,得到参数
θ(1),θ(2),...,θ(10)
θ
(
1
)
,
θ
(
2
)
,
.
.
.
,
θ
(
10
)
Step2: 用测试集计算每个模型的测试误差。假设
θ(5)
θ
(
5
)
时的误差最小,我们选择d=5
到这一步看起来都很合理,接下来我们想计算该五次函数模型的泛化误差(generalized error),看看它能不能很好地推广到新样本。
此时如果我们沿用测试集的误差值并把它当做泛化误差,结果显然是不公平的。因为我们已经用测试集选择了使其表现最好的d,而这不能反映我们的假设函数在遇到新样本时的表现。这和我们不能用训练集来计算测试误差是一个道理。
1.2.2 Training/validation/test error
因此,将数据集分为两部分不能满足要求,我们将其分成三段,分别称作训练集、交叉验证集和测试集,这一比例建议为6:2:2. 我们用交叉验证集(cross validation set)选择模型,用测试集估计所选模型的泛化误差。
对于上图的线性回归问题,误差计算方法如下:
Training error:
Cross validation error:
Test error:
实践中,也有人不区分cross validation set和test set,但这只限于样本量较大的情况,而且Ng不建议这样做。
2. Bias vs. variance
2.1 Deciding what to try next
模型效果不好时,大多是出现两种情况,要么偏差比较大(欠拟合),要么方差比较大(过拟合)。机器学习诊断法(ML diadiagnostic)可以判断问题究竟是过拟合还是欠拟合,帮助我们从以下改进方法中选择最行之有效的一种:
- Get more training examples
- Try smaller set of features
- Try getting additional features
- Try adding polynomial features
- Try decreasing
λ
λ
- Try increasing
λ
λ
2.2 Diagnosing bias vs. variance
我们可以利用之前掌握的训练集、验证集和测试集的概念和计算,画出下面的多项式次数-误差图。
随着多项式次数的增加,模型对训练集的拟合效果越来越好,
Jtrain(θ)
J
t
r
a
i
n
(
θ
)
一直下降。交叉验证误差
Jcv(θ)
J
c
v
(
θ
)
先下降后增加,曲线最低点d=2,这就是我们最终选择的多项式次数。
这幅图还能帮助我们判断偏差和方差的问题。d=2左侧,模型偏差大,为欠拟合,d=2右侧,模型方差大,为过拟合。
换句话说,我们可以得到
欠拟合时:
Jtrain(θ)
J
t
r
a
i
n
(
θ
)
很大,
Jcv(θ)≈Jtrain(θ)
J
c
v
(
θ
)
≈
J
t
r
a
i
n
(
θ
)
过拟合时:
Jtrain(θ)
J
t
r
a
i
n
(
θ
)
很小,
Jcv(θ)>>Jtrain(θ)
J
c
v
(
θ
)
>>
J
t
r
a
i
n
(
θ
)
2.3 Regularization and bias/variance
在https://blog.csdn.net/weixin_42395916/article/details/80941975中,我们学习了正则化,在损失函数后增加正则项可用于解决过拟合问题,但过大的 λ λ 也会导致欠拟合。因此,选择合适的 λ λ 至关重要。
选择
λ
λ
的方法和选择多项式次数d的方法类似。假设我们选取了一系列想要尝试的
λ
λ
值,首先可能考虑不使用正则化的情形(
λ=0
λ
=
0
),再从0.01开始,以两倍步长递增,最终取值10.24(图中取值是10,两者其实非常接近,因为小数点后的数字对最终结果影响不大)。这样我们就得到了12个需要训练的模型。
Step1: 用训练集训练每个模型,得到参数
θ(1),θ(2),...,θ(12)
θ
(
1
)
,
θ
(
2
)
,
.
.
.
,
θ
(
12
)
Step2: 用验证集计算每个模型的误差,选择误差最小的
θ
θ
Step3: 用测试集报告所选模型的泛化误差
需要提醒的是,我们定义的训练误差
Jtrain(θ)
J
t
r
a
i
n
(
θ
)
不同于模型的优化目标函数
J(θ)
J
(
θ
)
。训练误差
Jtrain(θ)
J
t
r
a
i
n
(
θ
)
、验证集误差
Jcv(θ)
J
c
v
(
θ
)
和测试集误差
Jtest(θ)
J
t
e
s
t
(
θ
)
都是不含正则化参数的。
我们可以作出
λ
λ
-误差图,来看看正则化项与偏差、方差的关系。当
λ
λ
很小时,拟合一个高阶多项式通常会得到高方差和过拟合的结果,此时
Jtrain(θ)
J
t
r
a
i
n
(
θ
)
很小而
Jcv(θ)
J
c
v
(
θ
)
很大。当
λ
λ
很大时,我们会面临高偏差问题,对训练集的拟合效果不好,该假设在交叉验证集上的表现也比较差,
Jtrain(θ)
J
t
r
a
i
n
(
θ
)
和
Jcv(θ)
J
c
v
(
θ
)
都很大。
2.4 Learning curves
将上述概念结合起来,可以建立机器学习诊断法,用于判断模型存在的问题为何种类型。这种方法也称为学习曲线(learning curves)。
学习曲线绘制的是 Jtrain(θ) J t r a i n ( θ ) , Jcv(θ) J c v ( θ ) 和训练集样本量之间的关系。一方面,随着训练样本的增加,拟合难度越来越大,因此训练误差 Jtrain(θ) J t r a i n ( θ ) 会逐渐增加。另一方面,训练样本越多,模型的泛化程度越好,因此交叉验证集误差 Jcv(θ) J c v ( θ ) 会逐渐下降。 Jtrain(θ) J t r a i n ( θ ) 和 Jcv(θ) J c v ( θ ) 曲线会随着训练样本的增加而不断接近,因为模型已在训练集上达到了最优的拟合效果,对新数据集的预测效果不会优于这一水平,显然有 Jcv(θ)>Jtrain(θ) J c v ( θ ) > J t r a i n ( θ ) .
训练样本很大时,两条曲线的接近程度和其值的大小可以反映模型存在的是高方差问题还是高偏差问题。
高偏差时,如我们用一条直线去拟合下图中的样本,即使不断增大样本容量,我们的得到的依旧是差不多的误差很大的直线。此时训练误差和验证误差曲线有以下特点:
1、训练误差和验证误差很快便为水平不再变化
2、水平时两条曲线非常接近
3、水平时两者误差值都很大
高方差时,如我们用一个100阶的多项式来拟合下图中的样本,模型对训练集的拟合效果非常好,随着样本量的增加,训练误差虽然会增大,但也保持在一个较低的水平。而模型对验证集的误差则一直很大,但这种误差会随着样本量的增加而下降。此时训练误差和验证误差曲线有以下特点:
1、训练误差一直较小
2、验证误差和训练误差之间的差距一直较大
通过学习曲线可以知道,在高方差的情况下增大样本量有助于改善模型效果,但在高偏差的情况下增大样本容量是毫无意义的,我们需要寻求其他的解决办法。
2.5 Deciding what to try next (summary)
下图是对2.1中提到的各种改进方法所针对的问题的总结: