文章目录
评价算法(Evaluating a Learning Algorithm)
1.机器学习调试
本周学习的前半部分内容是在设计机器学习系统或者进行系统改进的时候,遇到问题怎么调试的问题。
以房价预测为例:假如使用了正则化线性回归,那最小化代价函数为:
J
(
θ
)
=
1
2
m
[
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
+
λ
∑
j
=
1
n
θ
j
2
]
J(\theta)=\displaystyle\frac{1}{2m}[\displaystyle\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum_{j=1}^n\theta_j^2]
J(θ)=2m1[i=1∑m(hθ(x(i))−y(i))2+λj=1∑nθj2]
如果在测试数据集上验证发现误差很大,那么接下来怎么办?
获取更多的训练样本
尝试增加或减少特征数量
尝试加入多项式特征
尝试减少或增加 λ \lambda λ
上面这几种方法,在使用时怎么选择,下面内容详细描述。
机器学习诊断(Diagnostic)是一种测试法,利用它可以深入了解某种算法是否有用,并可以从中获得最大化改进算法的指示。虽然执行和实现是需要时间的,但是使用它能让我们更高效地利用时间。
2.评估假设函数
训练集中假设函数的误差小,并不能保证验证集上有同样的误差。因为可能存在过拟合的问题,假设函数在新数据集上的泛化能力差。下面介绍评估假设函数的标准方法
2.1评估假设函数的标准方法
首先,我们把数据集按照 70% 和 30% 的比例分成训练集(Training Set)和测试集(Test Set)。
如果数据集的分布有规律,则要随机取 70%70% 作为训练集,剩下 30%30% 作为测试集;如果数据集已经是随机分布,则可以直接取前 70%70% 作为训练集,后 30%30% 作为测试集。
评估线性回归的假设函数
步骤如下:
- 利用训练集的数据最小化代价函数 J ( θ ) J(\theta) J(θ),确定参数 θ \theta θ
- 计算训练集的误差:
J t e s t ( θ ) = 1 2 m t e s t ∑ i = 1 m t e s t ( h θ ( x t e s t ( i ) ) − y t e s t ( i ) ) 2 J_{test}(\theta)=\displaystyle\frac{1}{2m_{test}}\displaystyle\sum_{i=1}^{m_{test}}(h_\theta(x_{test}^{(i)})-y_{test}^{(i)})^2 Jtest(θ)=2mtest1i=1∑mtest(hθ(xtest(i))−ytest(i))2
评估逻辑回归的假设函数
步骤如下:
- 利用训练集的数据最小化代价函数 J ( θ ) J(\theta) J(θ),确定参数 θ \theta θ
- 计算训练集的误差:
J t e s t ( θ ) = − 1 m t e s t ∑ i = 1 m t e s t y t e s t ( i ) l o g h θ ( x t e s t ( i ) ) + ( 1 − y t e s t ( i ) ) l o g h θ ( x t e s t ( i ) ) J_{test}(\theta)=\displaystyle-\frac{1}{m_{test}}\displaystyle\sum_{i=1}^{m_{test}}y_{test}^{(i)}logh_\theta(x_{test}^{(i)})+(1-y_{test}^{(i)})logh_\theta(x_{test}^{(i)}) Jtest(θ)=−mtest1i=1∑mtestytest(i)loghθ(xtest(i))+(1−ytest(i))loghθ(xtest(i))
2.2误分类率
定义: e r r ( h θ ( x ) , y ) = { 1 if h θ ( x ) ⩾ 0.5 , y = 0 o r h θ ( x ) ⩽ 0.5 , y = 1 0 otherwise err(h_\theta(x),y)=\\ \begin{cases} 1 &\text{if } h_{\theta}(x)\geqslant0.5,y= 0\quad or \quad h_{\theta}(x)\leqslant0.5,y=1\\ 0 &\text{otherwise} \end{cases} err(hθ(x),y)={10if hθ(x)⩾0.5,y=0orhθ(x)⩽0.5,y=1otherwise
误分类率: T e s t s e r r o r = 1 m t e s t ∑ i = 1 m t e s t e r r ( h θ ( x t e s t ( i ) ) , y t e s t ( i ) ) Testserror=\displaystyle\frac{1}{m_{test}}\displaystyle\sum_{i=1}^{m_{test}}err(h_\theta(x_{test}^{(i)}),y_{test}^{(i)}) Testserror=mtest1i=1∑mtesterr(hθ(xtest(i)),ytest(i))
3.模型的选择
令假设函数的次数为 d, d=1,2,3,…,10 ,即下图所示,我们要从中选择一个作为假设函数。
我们可以执行下列步骤选出合适的模型:
在训练集上通过最小化代价函数,即 m i n θ J ( θ ) min_θJ(θ) minθJ(θ),求出上述每一个模型的参数 θ \theta θ,即得到 θ ( 1 ) , θ ( 2 ) , ⋯ , θ ( 10 ) θ^{(1)},θ^{(2)},⋯,θ^{(10)} θ(1),θ(2),⋯,θ(10)
利用这些参数计算不同次数的假设函数在测试集上的误差,即 J t e s t ( θ ( 1 ) ) , J t e s t ( θ ( 2 ) ) , . . . J t e s t ( θ ( 10 ) ) J_{test}(θ^{(1)}),J_{test}(θ^{(2)}),...J_{test}(θ^{(10)}) Jtest(θ(1)),Jtest(θ(2)),...Jtest(θ(10))
从中选择 J t e s t J_{test} Jtest 最小的假设函数(例如:d=5)作为选择
上面只能说明 d=5(其实也算一个参数)是最适合测试集的,对于新的数据集 d=5 是否合适,我们无法判断,我们不能再用测试集去评估假设函数的泛化能力,因为这个参数就是按照最能拟合测试集标准来选择的。
为了解决这个问题,我们可以把数据集分为三个部分:训练集(Training Set)、交叉验证集(Cross Validation Set)、测试集(Test Set)。这三者的分配比例可以是:60%,20%,20%。
这三部分的误差计算公式如下:
之前使用测试集来选择模型,现在要根据交叉验证集来选择模型:
在训练集上通过最小化代价函数,即 m i n θ J ( θ ) min_θJ(θ) minθJ(θ),求出上述每一个模型的参数 θ \theta θ,即得到 θ ( 1 ) , θ ( 2 ) , ⋯ , θ ( 10 ) θ^{(1)},θ^{(2)},⋯,θ^{(10)} θ(1),θ(2),⋯,θ(10)
利用这些参数计算不同次数的假设函数在测试集上的误差,即 J c v ( θ ( 1 ) ) , J c v ( θ ( 2 ) ) , . . . J c v ( θ ( 10 ) ) J_{cv}(θ^{(1)}),J_{cv}(θ^{(2)}),...J_{cv}(θ^{(10)}) Jcv(θ(1)),Jcv(θ(2)),...Jcv(θ(10))
从中选择 J c v J_{cv} Jcv最小的假设函数(例如:d=4)作为选择
用测试集评估泛化误差 J c v ( θ ( 4 ) ) J_{cv}(\theta^{(4)}) Jcv(θ(4))
4.偏差(Bias)和方差(Variance)
4.1高偏差和高偏差
当你运行一个算法结果不理想时,多半是出现两种情况:要么是高偏差(High Bias),要么是高方差(High Variance),换句话说就是欠拟合(Underfitting)或者过拟合(Overfitting)。
当我们判断出是哪一种情况,就能够找到最有效的改进算法的方法。
例如上述假设函数的多项式次数 d 的选择会影响拟合效果,d 太小会欠拟合(高偏差),太大会过拟合(高方差),如下图:
训练集的误差
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ) 以及交叉验证集的误差
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ) 随多项式次数 d 的变化曲线如下图:
曲线左边多项式的次数过小,欠拟合(Underfitting),导致无论在训练集还是交叉验证集上拟合效果都不好,即,高偏差(High Bias)。
曲线右边多项式的次数太大,过拟合(Overfitting),虽然在训练集上拟合得很好,但在交叉验证集上的误差则很大,泛化性能差,即高方差(High Variance)。
高偏差(欠拟合): J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ) 较大, J c v ( θ ) ≈ J t r a i n ( θ ) J_{cv}(θ)≈J_{train}(θ) Jcv(θ)≈Jtrain(θ)
高方差(过拟合): J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ)较小, J c v ( θ ) > > J t r a i n ( θ ) J_{cv}(θ)>>J_{train}(θ) Jcv(θ)>>Jtrain(θ)
4.2 正则化线性回归
我们已经知道正则化可以防止过拟合。但正则化参数λ的选择至关重要,λ 太小则没有起到正则化的效果,会过拟合(高方差);λ 太大则正则化过度,会导致欠拟合(高偏差),如下图:
那么我们应该如何选择参数 λ 呢?请注意,
J
c
v
(
θ
)
J_{cv}(θ)
Jcv(θ),
J
t
e
s
t
(
θ
)
J_{test}(θ)
Jtest(θ) 的定义都不包含正则化项。
为选择模型和正则化参数
λ
\lambda
λ,步骤入下:
- 创建要尝试的 λλ 值列表 i . e . λ ∈ 0 , 0.01 , 0.02 , 0.04 , 0.08 , 0.16 , 0.32 , 0.64 , 1.28 , 2.56 , 5.12 , 10.24 i.e.\lambda \in{0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24} i.e.λ∈0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24
- 创建不同多项式次数或变量的模型
- 遍历 λ值,对于每一个 λ值,遍历不同的模型求出对应的参数 Θ \Theta Θ
- 利用学到的参数 Θ \Theta Θ值,求出对应的 J c v ( θ ) J_{cv}(θ) Jcv(θ)(不包含正则化 或 λ=0)
- 选出使交叉验证集误差最低的组合
- 将上一步中选出的最佳组合 Θ \Theta Θ 和 λ \lambda λ,应用于测试集,求出 J t e s t ( θ ) J_{test}(θ) Jtest(θ)(不包含正则化 或 λ=0),检验其泛化能力。
下面给出 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ)和 J c v ( θ ) J_{cv}(θ) Jcv(θ) 随 λ \lambda λ 的变化曲线:
该图的左边对应着高方差的情况,即 λ小,拟合出的
Θ
\Theta
Θ 参数较大,可能会过拟合,
J
t
r
a
i
n
(
θ
)
J_{train}(θ)
Jtrain(θ)小,
J
c
v
(
θ
)
J_{cv}(θ)
Jcv(θ) 大;
右边对应着高偏差的情况,即 λ大,拟合出的 Θ \Theta Θ 参数很小,可能会欠拟合, J t r a i n ( θ ) J_{train}(θ) Jtrain(θ)和 J c v ( θ ) J_{cv}(θ) Jcv(θ) 都较大。
4.3学习曲线
上面我们使用画曲线图的方法研究了是否存在高方差/高偏差问题,以及正则化对偏差/方差的影响,这种曲线图我们称为学习曲线。学习曲线可以用来判断某个算法是否处于偏差、方差问题或者二者都有。
- 对于训练误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) ,当只有几个数据训练算法时(例如1、2、3),我们很容易就可以得到零误差,因为我们总能找到一条二次曲线与它们完美拟合。但是随着数据的增加,二次曲线的误差就会越大,经过一定的 m 值以后,误差就会趋于稳定。
- 对于交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ),当训练集大小 mm 很小时,拟合出的假设函数泛化到新样本的能力很差,交叉验证误差就很大,随着训练集不断增大,可能会拟合出更好的假设函数,泛化到新样本的能力增强,交叉验证误差会逐渐减小。
高偏差情况下的学习曲线
- 当训练集大小 m 很小时,拟合出的直线泛化到新样本的能力很差,交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ) 很大,但因为训练集很小,对于每个样本的拟合效果较好,训练误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 也较小;
- 随着训练集不断增大,训练出的直线更好的适应训练集,泛化到新样本的能力略有增强,交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ) 稍有减小, mm 大到一定值之后,训练出的还是一条差不多的直线,交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ)将不再变化,成为水平的。训练集不断增大,对于训练样本的拟合就没那么准确了,故训练误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ)会持续增大直到接近交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ)。
由此可以看出,高偏差时,随着训练集不断增大,最终
J
t
r
a
i
n
(
θ
)
J_{train}(θ)
Jtrain(θ) 和
J
c
v
(
θ
)
J_{cv}(θ)
Jcv(θ)都较大。
意义:高偏差(欠拟合)时,增加训练数据是没有用的,因为
J
c
v
(
θ
)
J_{cv}(θ)
Jcv(θ)稍微降低后就变为水平。
高方差情况下的学习曲线
- 当训练集大小 m 很小时,因为存在过拟合,训练误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 会非常小,同时过拟合的存在使假设函数泛化到新样本的能力不足,交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ)很大 ;
- 随着训练集不断增大,想要完美拟合所有训练数据变得没那么容易,训练误差 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 会稍微增大,但因为 h θ ( x ) h_\theta(x) hθ(x) 的阶次很高,仍然存在过拟合,总体来说 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 还是很小的。训练集增大让交叉验证误差 J c v ( θ ) J_{cv}(θ) Jcv(θ) 有减小的趋势,但因为过拟合依然存在,故 J c v ( θ ) J_{cv}(θ) Jcv(θ) 只是稍微减小,仍然较大, J c v ( θ ) J_{cv}(θ) Jcv(θ) 与 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ)间还是有很大差距。
意义:高方差(过拟合)时,增加训练数据可能会有用,因为随着训练数据增多 J c v ( θ ) J_{cv}(θ) Jcv(θ) 与 J t r a i n ( θ ) J_{train}(θ) Jtrain(θ) 越来越接近。
学习曲线能让我们发现是否存在高方差/高偏差问题,以及采取某些手段(如:增加训练样本数)是否有意义,避免我们在调试学习算法时浪费时间。
5.总结
对于提出的一些改进算法的方法,我们应该能分析出它们适用的情况:
获取更多训练样本(高方差)
尝试使用更少的特征(高方差)
尝试增加特征(高偏差)
尝试加入多项式特征(高偏差)
尝试减小 λ(高偏差)
尝试增大 λ(高方差)
神经网络:
简单的神经网络参数少,容易欠拟合,但优势是计算量小;复杂的神经网络参数多,容易过拟合(可以通过正则化修正),计算量大,即使选择了使用复杂的神经网络还要继续选择是使用一个隐藏层还是多个隐藏层等等。
通常使用正则化的复杂神经网络的效果比使用简单神经网络的效果更好,具体实现时要靠考虑时间代价和计算复杂度代价等等。