假设使用正则化线性回归预测房价:
当把假设函数用于新的数据集,发现在预测时出现了很大误差。此时,可以执行的下一步措施包括:
- 获取更多训练样本;
- 尝试更少特征值;
- 尝试更多特征值;
- 尝试增加多项式特征值;
- 减小 λ λ 值;
- 增大 λ λ 值。
机器学习诊断法:通过执行一种测试方法,能够了解某种算法是否有用,通常也能告诉你,想要改进一种算法的效果应该做什么样的尝试。
诊断法需要花费时间,但是一种很有效的方法。
假设拥有一组训练样本,为确保可以评估假设函数,将训练样本分成两部分,70%作为训练集,30%作为测试集,
mtest
m
t
e
s
t
作为测试样本总数:
训练集:
(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))
(
x
(
1
)
,
y
(
1
)
)
,
(
x
(
2
)
,
y
(
2
)
)
,
⋯
,
(
x
(
m
)
,
y
(
m
)
)
测试集:
(x(1)test,y(1)test),(x(2)test,y(2)test),⋯,(x(mtest)test,y(mtest)test)
(
x
t
e
s
t
(
1
)
,
y
t
e
s
t
(
1
)
)
,
(
x
t
e
s
t
(
2
)
,
y
t
e
s
t
(
2
)
)
,
⋯
,
(
x
t
e
s
t
(
m
t
e
s
t
)
,
y
t
e
s
t
(
m
t
e
s
t
)
)
若训练数据存在某种规律,训练集、测试集的选取应采用随机原则。
具体执行步骤:
- 利用训练集进行学习,得到参数 θ θ ;
- 计算测试误差:
对于线性回归:
Jtest(θ)=12mtest∑i=1mtest(hθ(x(i)test)−y(i)test)2 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
对于逻辑回归:
Jtest(θ)=−1mtest∑i=1mtest(y(i)testlog(hθ(x(i)test))+(1−y(i)test)log(1−hθ(x(i)test))) 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 ( 1 − h θ ( x t e s t ( i ) ) ) )
另一种表达方式: 0/1 0 / 1 误分率:
err(hΘ(x),y)={1,0,if (hΘ(x)⩾0.5 and y=0) or (hΘ(x)<0.5 and y=1)otherwiseTest Error=1mtest∑i=1mtesterr(hΘ(x),y) e r r ( h Θ ( x ) , y ) = { 1 , i f ( h Θ ( x ) ⩾ 0.5 a n d y = 0 ) o r ( h Θ ( x ) < 0.5 a n d y = 1 ) 0 , o t h e r w i s e T e s t E r r o r = 1 m t e s t ∑ i = 1 m t e s t e r r ( h Θ ( x ) , y )
模型选择问题
在实际应用中,为了更好地评价某个假设函数,通常采用上述方法的升级版:
将一组训练样本分成三部分:训练集、交叉验证集、测试集,典型的分隔比例为
(60%:20%:20%)
(
60
%
:
20
%
:
20
%
)
训练集:
(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))
(
x
(
1
)
,
y
(
1
)
)
,
(
x
(
2
)
,
y
(
2
)
)
,
⋯
,
(
x
(
m
)
,
y
(
m
)
)
交叉验证集:
(x(1)cv,y(1)cv),(x(2)cv,y(2)cv),⋯,(x(mcv)cv,y(mcv)cv)
(
x
c
v
(
1
)
,
y
c
v
(
1
)
)
,
(
x
c
v
(
2
)
,
y
c
v
(
2
)
)
,
⋯
,
(
x
c
v
(
m
c
v
)
,
y
c
v
(
m
c
v
)
)
测试集:
(x(1)test,y(1)test),(x(2)test,y(2)test),⋯,(x(mtest)test,y(mtest)test)
(
x
t
e
s
t
(
1
)
,
y
t
e
s
t
(
1
)
)
,
(
x
t
e
s
t
(
2
)
,
y
t
e
s
t
(
2
)
)
,
⋯
,
(
x
t
e
s
t
(
m
t
e
s
t
)
,
y
t
e
s
t
(
m
t
e
s
t
)
)
训练误差:
Jtrain(θ)=12m∑i=1m(hθ(x(i))−y(i))2
J
t
r
a
i
n
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
交叉验证误差:
Jcv(θ)=12mcv∑i=1mcv(hθ(x(i)cv)−y(i)cv)2
J
c
v
(
θ
)
=
1
2
m
c
v
∑
i
=
1
m
c
v
(
h
θ
(
x
c
v
(
i
)
)
−
y
c
v
(
i
)
)
2
测试误差:
Jtest(θ)=12mtest∑i=1mtest(hθ(x(i)test)−y(i)test)2
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
若存在以下假设函数:
1.
hθ(x)=θ0+θ1x
h
θ
(
x
)
=
θ
0
+
θ
1
x
2.
hθ(x)=θ0+θ1x+θ2x2
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
θ
2
x
2
3.
hθ(x)=θ0+θ1x+θ2x2+θ3x3
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
θ
2
x
2
+
θ
3
x
3
⋯
⋯
10.
hθ(x)=θ0+θ1x+⋯+θ10x10
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
⋯
+
θ
10
x
10
选择假设函数的具体方法如下:
- 用训练集优化各假设函数的参数 θ θ ;
- 用交叉验证集找到误差最小的假设函数;
- 用测试集估算步骤2中误差最小的假设函数的泛化误差。
由于欠拟合和过拟合的存在,随着假设函数的多项式最高项的增大,训练误差和交叉验证误差的变化如下图:
上图中,交叉验证误差曲线的左边对应高偏差,右边对应高方差;
高偏差对应欠拟合:训练误差和交叉验证误差均很大,且训练误差
≈
≈
交叉验证误差,原因为多项式最高次项过低;
高方差对应过拟合:训练误差较小,交叉验证误差很大,原因为多项式最高次项过高。
正则化与偏差/方差的关系:
假设要对高阶多项式进行拟合:
hθ(x)=θ0+θ1x+θ2x2+θ3x3+θ4x4
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
θ
2
x
2
+
θ
3
x
3
+
θ
4
x
4
则:
J(θ)=12m[∑i=1m(hθ(x(i))−y(i))2+λ∑j=1nθ2j]
J
(
θ
)
=
1
2
m
[
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
+
λ
∑
j
=
1
n
θ
j
2
]
关于
λ
λ
的取值有三种情况:
- λ λ 取值很大,则 θ0≈0,⋯,θ4≈0,hθ(x)≈θ0 θ 0 ≈ 0 , ⋯ , θ 4 ≈ 0 , h θ ( x ) ≈ θ 0 ,欠拟合,高偏差;
- λ λ 取值很小, λ≈0 λ ≈ 0 ,正则化没有起作用,过拟合,高方差;
- λ λ 取值适当,拟合度正好。
为选取合适的 λ λ 参数,需要进行如下步骤:
- 创建一个 λ λ 取值列表,如 λ∈{0,0.01,0.02,⋯,10.24} λ ∈ { 0 , 0.01 , 0.02 , ⋯ , 10.24 } ;
- 创建一个模型集,即不同阶或包含其他的变量的不同假设函数;
- 迭代遍历 λ λ ,对于每个 λ λ ,都遍历所有的假设函数,用测试集得到其 θ θ 取值;
- 使用步骤3得到的 θ θ 带入假设函数,不进行正则化或 λ=0 λ = 0 ,计算交叉验证误差 Jcv(θ) J c v ( θ ) ;
- 选择 Jcv(θ) J c v ( θ ) 最小的 λ λ 和 θ θ 对应关系;
- 用选择的那对 λ λ 和 θ θ ,计算 Jtest(θ) J t e s t ( θ ) 看是否有好的泛化效果。
学习曲线
训练误差:
Jtrain(θ)=12m∑i=1m(hθ(x(i))−y(i))2
J
t
r
a
i
n
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
交叉验证误差:
Jcv(θ)=12mcv∑i=1mcv(hθ(x(i)cv)−y(i)cv)2
J
c
v
(
θ
)
=
1
2
m
c
v
∑
i
=
1
m
c
v
(
h
θ
(
x
c
v
(
i
)
)
−
y
c
v
(
i
)
)
2
当学习算法存在高偏差:
- 训练集规模较小时, Jtrain(θ) J t r a i n ( θ ) 较小,而 Jcv(θ) J c v ( θ ) 较大;
- 训练集规模较大时, Jtrain(θ) J t r a i n ( θ ) 与 Jcv(θ) J c v ( θ ) 趋近,即 Jtrain(θ)≈Jcv(θ) J t r a i n ( θ ) ≈ 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 ( θ ) 随着样本数增大而减小, Jtrain(θ) J t r a i n ( θ ) 依然小于 Jcv(θ) J c v ( θ ) ,但差距变小。
此时,增加训练样本数量对训练算法有帮助。
本文最开始提到的修正算法的措施具体作用方向如下:
- 获取更多训练样本:解决高方差;
- 尝试更少特征值:解决高方差;
- 尝试更多特征值:解决高偏差;
- 尝试增加多项式特征值:解决高偏差;
- 减小 λ λ 值:解决高偏差;
- 增大 λ λ 值:解决高方差。
诊断神经网络:
- 简单的神经网络趋近于欠拟合,但计算简单;
- 复杂的神经网络趋近于过拟合,但计算复杂,可以使用正则化(增大 λ λ )解决。