4.5 可视化结果并绘制误差
你的线性回归预测每周的311呼叫量效果如何?从mu_val
和sig_val
中获取mu
和sig
的值并使用它们绘制从清单4.4和图4.5中学得的模型。Matplotlib根据初始的周数(x轴)和归一化的呼叫量(y轴)绘制散点图。然后将学习得到的mu_val
和sig_val
参数代入清单4.4中展开的模型方程中。这样做而不是重用模型函数并传入mu_val
和sig_val
作为参数的原因是,你不需要再创建一个TensorFlow图或者传递一个会话来评估模型。相反,你可以使用NumPy及其类似的函数,如np.exp
(指数)和np.power
。这些函数等价于TensorFlow的同名函数,只是NumPy不需要TensorFlow会话及其相关的资源来计算每个节点的值。trY2
是最终学习到的呼叫量预测,由于它们被归一化为0到1之间的值来学习高斯函数,因此你必须将学到的值乘以maxY
得到实际的非归一化的每周呼叫量预测。用曲线在原始训练数据中间画出结果,并打印出任意一周的呼叫量预测,并与原始训练数据值进行比较来测试模型。
图4.5 对于1~52周(索引从0开始),学得的TensorFlow模型(曲线)对一年(0~51)中每周的呼叫量预测。每周呼叫量的实际值用点表示
清单4.5 可视化学习到的模型
清单4.5的结果大致如下:
虽然你的模型预测出的呼叫量与实际值差了大约15 000,这看起来很疯狂,但是请记住在第3章讨论的方差和偏差。你并不是在寻找一个过于拟合了数据的模型,并且以各种方式扭曲以确保通过了每一个点。这些模型表现出高方差和低偏差,因此说,它们在训练数据上过拟合了。相反,你希望模型显示出低偏差和低方差,并在未见过的数据上表现良好。
当提供未见过的新数据时,只要NYC 311总量似乎都集中在季节性的春季和夏季,你的模型就表现得不错。只要输入在标准差之内或者特定的中心平均值对应了最大的呼叫量,模型甚至可以处理分布的移动(呼叫量在季节间移动)。你可以更新你的模型,让其学习新的mu
和sig
值即可。
不过你可能对这个讨论有疑问。通过研究预测值与实际值之间的距离来评估模型的性能,你可以使用一些已经见过的工具——Jupyter和Matplotlib——来定量地测量误差。运行清单4.6来计算模型的误差、平均误差和准确率,并将其可视化,如图4.6所示。变量error
被定义为预测数据和训练数据之间平方差的平方根(你可以回忆第1章,这是L2范数)。这个误差变量得到每一个按周预测呼叫量与训练数据的距离,并且最好用条形图可视化。变量avg_error
为trY2
中每个预测值与Y_train
之间的方差除以总的周数,从而得到预测每周呼叫量的平均误差。该算法的总体准确率为1(每周预测呼叫平均误差除以周最大呼叫量)。结果保存在acc
变量中并在清单的最后打印出来。
图4.6 可视化每周的呼叫预测误差。模型在高呼叫量的周里面表现非常好
清单4.6 计算误差并可视化
结果的绘图展示了每周的呼叫预测误差,也类似于预测曲线。
尽管看起来总体误差很高,并且分布在两侧,但由于该模型的准确预测,在呼叫量大的周里面总体的平均误差只有205次。你可以在清单4.6的输出中看到模型的平均误差和准确率(99%):
你在第3章学习了正则化和拆分训练测试集。我将在4.6节中简要介绍它们。