成本是衡量模型与训练样本符合程度的指标。简单地理解,成本是针对所有的训练样本,模型拟合出来的值与训练样本的真实值的误差平均值。而成本函数是就是成本与模型参数的函数关系。模型训练的过程,就是找出合适的模型参数,使得成本函数的值最小。成本函数记为
J
(
θ
)
J(\theta)
J(θ),其中
θ
\theta
θ标识模型参数。
针对上一节的例子,我们用一阶多项式来拟合数据,则得到的模型是
y
=
θ
0
+
θ
1
x
y={\theta}_0+{\theta}_1x
y=θ0+θ1x。此时,
[
θ
0
,
θ
1
]
[{\theta}_0,{\theta}_1]
[θ0,θ1]构成的向量就是模型参数。
for m in models:
print('model coeffs: {0}'.format(m.coeffs))
输出的结果:
model coeffs: [0.86447757 0.23851626]
model coeffs: [ 2.11261632 -3.99908027 2.93001647 0.01790155]
model coeffs: [ 4.58669635e+03 -1.72895005e+04 2.20881094e+04 -4.84211048e+03
-1.50375813e+04 1.66199939e+04 -7.75460614e+03 1.83123104e+03
-2.13802260e+02 1.27183992e+01 -6.36651154e-02]
训练这个模型的目标,就是找出合适的模型参数 [ θ 0 , θ 1 ] [{\theta}_0,{\theta}_1] [θ0,θ1],使得所有的点到这条直线上的距离最短。
# 针对一阶多项式的模型,不同的参数拟合出来的直线和训练样本对应的位置关系
coeffs_1d = [0.2, 0.6]
plt.figure(figsize=(9, 6))
t = np.linspace(0, 1, 200)
plt.plot(x, y, 'ro', t, models[0](t), '-', t, np.poly1d(coeffs_1d)(t), 'r-')
plt.annotate(r'L1: $y = {1} + {0}x$'.format(coeffs_1d[0], coeffs_1d[1]),
xy=(0.8, np.poly1d(coeffs_1d)(0.8)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
plt.annotate(r'L2: $y = {1} + {0}x$'.format(models[0].coeffs[0], models[0].coeffs[1]),
xy=(0.3, models[0](0.3)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
如上图所示,不同的模型参数
θ
\theta
θ对应不同的直线,明显可以看出来L2比L1更好的拟合数据集。根据成本函数的定义,我们可以容易地得到模型的成本函数公式:
J
(
θ
)
=
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta)=J({\theta}_0,{\theta}_1)=\tfrac{1}{2m}\sum_{i=1}^{m}{(h({x}^{(i)})-{y}^{(i)})}^{2}
J(θ)=J(θ0,θ1)=2m1∑i=1m(h(x(i))−y(i))2
其中,
m
m
m是训练样本的个数,这里m=20,而
h
(
x
(
i
)
)
h({x}^{(i)})
h(x(i))就是模型对每个样本的预测值,
y
(
i
)
{y}^{(i)}
y(i)是每个样本的真实值。这个公式实际上就是线性回归算法的成本函数的简化表达。
一个数据集可能有多个模型可以用来拟合它,而一个模型有无穷多个模型参数。针对特定的数据集和特定的模型,只有一个模型参数能最好的拟合这个数据集,这就是模型和模型参数的关系。回到上一节的例子中的3个图片,针对生成的20个训练样本,我们用3个模型来拟合这个数据集,分别是一阶多项式、三阶多项式和十阶多项式。图3-1左图使用一阶多项式拟合数据,这就是模型。而针对一阶多项式,有无穷多个模型参数,而模型训练的目的,就是找出一组最优的模型参数,使得这个模型参数所代表的一阶多项式对应的成本最低。使用三阶多项式和十阶多项式来拟合数据时,原理是相同的。
总结起来,针对一个数据集,我们可以选择很多歌模型来拟合数据,一旦选定了某个模型,就需要从这个模型的无穷多个参数里找出一个最优的参数,使得成本函数的值最小。
问题来了,多个模型之间怎么评价好坏呢?针对我们的例子,一阶多项式、三阶多项式和十阶多项式,到底哪个模型更好呢?针对驯良样本成本最小的模型就是最好的吗?在我们的例子里,十阶多项式针对训练样本的成本最小,因为它的预测曲线几乎穿过了所有的点,训练样本曲线的距离的平均值最小。那是不是意味着十阶多项式是最好的模型呢?答案是否定的,因为它过拟合了。
过拟合到底有什么不好?我们要用什么标准来评价一个模型的好坏?这些问题我们将在后面的章节给出答案。