TensorFlow机器学习(原书第2版)
上QQ阅读APP看书,第一时间看更新

第4章
使用回归进行呼叫量预测

本章内容
  • 在现实世界的数据上应用线性回归
  • 清洗数据并拟合之前未见过的曲线和模型
  • 使用高斯分布并以此预测数据
  • 评估你的线性回归的预测效果

有了回归预测和TensorFlow的力量为武装,你可以开始研究涉及机器学习过程中多个步骤的现实世界问题,例如数据清洗、在未见过的数据上拟合模型、定义不像线性或多项式曲线那么容易发现的模型。在第3章,我向你展示了当控制机器学习的所有步骤时[从使用NumPy产生吻合于线性方程(直线)或多项式方程(曲线)的模拟数据开始],如何使用线性回归。但是当现实世界中的数据如图4.1所示并没有符合你之前见过的模式时,情况如何?仔细看看图4.1,线性回归在这里会是一个很好的预测模型吗?

图4.1 一组数据,x轴对应一年的每周(0~51),y轴对应归一化的呼叫量(特定周的数据次数/所有周的最大呼叫次数)

图4.2使用线性回归模型为呼叫数据制作了两条最佳拟合曲线,但是它们看起来差别很大。你能想象在图4.2的左右两图中中间段和两端位置上预测值和实际值之间的误差吗?多项式模型也会同样糟糕,因为数据不能整洁地拟合一条曲线在对应于x轴的随机位置上发生y轴数值增减。自己画一个二阶或者三阶多项式确认一下,你能拟合这些数据吗?如果你不能,可能计算机程序也会有类似的困难。在这种情况下,你应该问自己以下问题:

  • 回归能继续帮助我预测下一组数据吗?
  • 除了直线和多项式曲线之外还有哪些回归模型?
  • 现实生活中的数据常常不是很好地以(xy)的形式(容易被绘制并且使用回归之类的方法建模)出现。那么我应该如何准备数据,使其适合特定的模型或者为混乱的数据找到适合的模型?

图4.2 图4.1中所示数据的两条线性最佳拟合曲线

在第3章以及贯穿本书的其他内容,有时为了说明问题我会使用模拟数据,例如通过NumPy的np.random.normal函数的输出,但是要知道现实世界的数据很少是这样的。

注意 我知道有几位作者正在编写关于机器学习数据清洗的书。尽管复杂的细节超出了本书的范围,但我还是会介绍数据清洗的步骤。你将获得使用TensorFlow处理整个过程的经验技巧。

将回归应用于实际问题时出现的另一个问题是,如何通过计算偏差或者预测值和实际值之间的差距来评估模型的准确性。图4.2中由回归模型生成的线看起来不正确,你可以通过定量测量和估计模型预测与ground truth之间的误差作出更进一步的论断。TensorFlow通过数据流图提供了便捷的方法,通过几行代码就可以计算误差。Matplotlib也提供了类似的功能,允许你用几行代码就可以直观地检查和估算模型的误差。

在许多现实问题中线性回归都是很好的预测模型,所以我们要选一个。一般来说,具有时间性质的问题为训练历史数据提供了x轴的自然排序,并且为未来状态(例如未来N小时或几周)提供了一个很好的预测目标,可以在其上测试回归模型。

有很多基于时间的数据集用于机器学习,Kaggle(https://www.kaggle.com,一个广为人知的开放机器学习平台)上有许多用于比赛的开放数据集可以免费获取。Kaggle提供数据集、文档、可共享的代码和一个执行机器学习的平台,它对基于TensorFlow文件和代码的支持是一流的。Kaggle有大量的时间数据集可以尝试回归机器学习模型,例如房产价格挑战(http://mng.bz/6Ady)和纽约市(NYC)311开放数据集(http://mng.bz/1gPX)。NYC 311数据集很有意思,它是基于时间的,需要一些清洗,并且无法清晰地拟合到直线或者多项式回归模型。

纽约市开放数据平台

纽约市有一个开放数据倡议,提供简单的应用程序接口(API)来下载用于机器学习和其他用途的数据。你可以通过http://opendata.cityofnewyork.us访问开放数据门户。

NYC 311数据集收集了居民向该市客户呼叫中心呼叫关于市政和其他政府非紧急服务的信息,例如废物处理、法规执行和建筑维护等。不难想象,这样的客户呼叫中心每天会接到许多电话,因为它帮助人们及时地获得需要的信息。但是呼叫中心一周会接到多少电话呢?一年又是多少呢?具体到某几个月或周,呼叫中心接到的电话数是更多还是更少?

想象一下,你负责这类业务的人员配置,特别是在节假日期间,你应该用更多的还是更少的客户服务代理来应对电话线路?呼叫的峰值与季节有关吗?你应该考虑额外的季节性员工还是全职员工就够了?回归和TensorFlow会帮助你找到这些问题的答案。