2.2.4 计算误差
可以使用这样的一种策略来寻找最接近样本数据的一条直线。想象一下,如果有一个关于样本数据(X和Y)和直线(w)的函数,用于测量这直线与样本数据之间的误差。直线越接近样本,误差值就越小。如果我们有这样一个函数,那么就可以使用这个函数来计算很多条直线,直到找到一条误差足够小的直线。
除了“误差”这个名字,机器学习研究人员还给这个函数起了另外一个名字,叫作损失。
我们可以这样表示一个损失函数。假设获得一个随机值w,如1.5。可以使用这个w进行预测,如果有14个座位预订数,那么能够卖出多少个比萨呢?调用函数predict(14,1.5),可得块比萨。
但是,这里有一个关键要点:这个预测值并不与Roberto文件中的实际值相匹配。回头看看前几个样本数据:
某天晚上有14个座位预订数,那天晚上Roberto卖出了32个比萨,而非21个。因此,可以算出相应的误差。这个误差值就是预测值与实际值之间的差值,即下图中的加粗线段:
下面是在代码中计算的样子:
上面的计算有一个小问题:误差可以是零、正的或者负的。然而,误差值应该总是正的。如果你把多个误差加在一起,肯定不会想让两个异号的误差相加变成一个对的。为保证误差值总是正的,我们对其做如下平方运算:
其实我们也可以用误差的绝对值来代替平方。然而,使用误差的平方会有一些额外的好处。这些好处在下一章中就会变得很明显。
现在我们对所有样本数据的平方误差求平均值,瞧!我们终于得到了损失函数。这种计算损失的方法称为均方误差法,在统计学家中很流行。下面是关于均方误差的代码:
还记得我们使用NumPy加载数组X和Y吗?这两个变量都是NumPy数组,因此代码非常简洁。在loss()函数的第一行中,我们将数组X中的每个元素都乘以w,得到一个预测数组;对于每一个预测值,我们相应地计算误差——预测和实际标签之间的差异;使用幂运算符算出每个误差的平方;最后,我们要求NumPy对均方误差求平均值,即求出均方误差。
既然我们已经完成了loss()函数,那就可以得到学习程序的最后一个函数了。
被行话淹没
“均方误差”“模型”“损失”……在本书的开头部分,这些新名称不断出现。温馨提示:大部分重要术语都在附录B中有定义。如果你没有在附录中找到一个特定的术语,那么请在本书的索引中查找。