跟我一起学scikit-learn09:成本函数

成本是衡量模型与训练样本符合程度的指标。简单地理解,成本是针对所有的训练样本,模型拟合出来的值与训练样本的真实值的误差平均值。而成本函数是就是成本与模型参数的函数关系。模型训练的过程,就是找出合适的模型参数,使得成本函数的值最小。成本函数记为 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"))

figure3_2.png
如上图所示,不同的模型参数 θ \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)=2m1i=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左图使用一阶多项式拟合数据,这就是模型。而针对一阶多项式,有无穷多个模型参数,而模型训练的目的,就是找出一组最优的模型参数,使得这个模型参数所代表的一阶多项式对应的成本最低。使用三阶多项式和十阶多项式来拟合数据时,原理是相同的。
总结起来,针对一个数据集,我们可以选择很多歌模型来拟合数据,一旦选定了某个模型,就需要从这个模型的无穷多个参数里找出一个最优的参数,使得成本函数的值最小。
问题来了,多个模型之间怎么评价好坏呢?针对我们的例子,一阶多项式、三阶多项式和十阶多项式,到底哪个模型更好呢?针对驯良样本成本最小的模型就是最好的吗?在我们的例子里,十阶多项式针对训练样本的成本最小,因为它的预测曲线几乎穿过了所有的点,训练样本曲线的距离的平均值最小。那是不是意味着十阶多项式是最好的模型呢?答案是否定的,因为它过拟合了。
过拟合到底有什么不好?我们要用什么标准来评价一个模型的好坏?这些问题我们将在后面的章节给出答案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值