机器学习实战:基于Scikit-Learn、Keras和TensorFlow(原书第3版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 放眼大局

欢迎来到机器学习房产公司!你的首要任务是使用加州的人口普查数据构建该州的房价模型。该数据包括加州每个街区组的人口、收入中位数和房价中位数等指标。街区组是美国人口普查局发布样本数据的最小地理单位(一个街区组通常有600~3000人)。我将它们简称为“地区”。

你的模型应该从这些数据中学习,并能够在给定所有其他指标的情况下预测任何地区的房价中位数。

由于你是一位井井有条的数据科学家,因此你应该做的第一件事就是拿出你的机器学习项目清单。你可以从附录A中的那个开始;对于大多数机器学习项目,它应该可以工作得相当好,但请确保根据你的需求进行调整。在本章中,我们将经历许多清单项目,但我们也会跳过一些,有些是因为它们是不言自明的,有些是因为它们将在后面的章节中讨论。

2.2.1 框定问题

你问老板的第一个问题应该是业务目标到底是什么。建立模型可能不是最终目标。公司期望如何使用该模型并从中受益?了解目标很重要,因为它将决定你如何框定问题、你将选择哪些算法、你将使用哪种性能指标来评估你的模型,以及你将花费多少精力来调整它。

老板回答说,你的模型的输出(对一个地区房价中位数的预测)将连同许多其他信息一起输入到另一个机器学习系统(见图2-2)[2]。这个下游系统将决定在给定的区域是否值得投资。做到这一点至关重要,因为它直接影响收入。

图2-2:用于房地产投资的机器学习流水线

下一个要问老板的问题是当前的解决方案是什么样的(如果有的话)。当前的情况往往会给你一个绩效参考,以及如何解决问题的见解。你的老板回答说,地区房价目前是由专家手动估算的:一个团队收集有关地区的最新信息,当他们无法得到房价中位数时,会使用复杂的规则进行估算。

这既费钱又费时,估算也不好。在设法找出实际房价中位数的情况下,他们通常会意识到估计偏差会超过30%。这就是为什么公司认为,在给定有关该地区的其他数据的情况下,训练一个模型来预测该地区的房价中位数会很有用。人口普查数据看起来是一个很好的数据集,可以用于此目的,因为它包括数千个地区的房价中位数以及其他数据。

流水线

一系列数据处理组件称为数据流水线。流水线在机器学习系统中非常常见,因为有大量数据需要操作并且需要应用很多的数据转换。

组件通常是异步运行的。每个组件都会拉取大量数据,对其进行处理,然后将结果输出到另一个数据存储器中。然后,一段时间后,流水线中的下一个组件拉取此数据并给出自己的输出。每个组件都是相当独立的:组件之间的接口就是数据存储。这使得系统易于掌握(借助于数据流图),不同的团队可以专注于不同的组件。此外,如果一个组件发生故障,下游组件通常可以仅使用损坏组件的最后输出继续正常运行(至少一段时间)。这使得架构非常健壮。

另外,如果没有实施适当的监控,损坏的组件可能会在一段时间内被忽视。数据变得陈旧,整个系统的性能会下降。

有了所有这些信息,你现在就可以开始设计你的系统了。首先,确定模型需要什么样的训练监督:它是监督学习、无监督学习、半监督学习、自监督学习还是强化学习任务?它是分类任务、回归任务还是其他任务?你应该使用批量学习还是在线学习技术?在继续阅读之前,请暂且先尝试自己回答这些问题。

你找到答案了吗?让我们来看看。这显然是一个典型的监督学习任务,因为模型可以用已标记的样例来进行训练(每个实例都有预期的输出,即该地区的房价中位数)。这是一个典型的回归任务,因为模型被要求预测一个值。更具体地说,这是一个多元回归问题,因为系统使用多个特征进行预测(地区人口、收入中位数等)。这也是一个单变量回归问题,因为我们只是试图预测每个地区的单个值。如果我们试图预测每个地区的多个值,那将是一个多元回归问题。最后,没有连续的数据流进入系统,所以没有特别需要来对快速变化的数据做调整,而且数据足够小,可以放在内存中,所以普通的批量学习应该就能胜任。

如果数据量很大,你可以将批量学习工作拆分到多个服务器(使用MapReduce技术)或使用在线学习技术。

2.2.2 选择性能指标

下一步是选择性能指标。回归问题的典型性能度量是均方根误差(Root Mean Square Error,RMSE)。它给出了系统在其预测中通常会产生多大误差,并为较大的误差赋予较高的权重。公式2-1显示了计算RMSE的数学公式。

公式2-1:均方根误差

符号

这个公式引入了几个非常常见的机器学习符号,我将在本书中使用这些符号:

· m是你测量RMSE的数据集中的实例数。

  ◆ 例如,如果你在2000个地区的验证集上评估RMSE,则m=2000。

· xi是数据集中第i个实例的所有特征值(不包括标签)的向量,yi是它的标签(该实例的期望输出值)。

  ◆ 例如,如果数据集中的第一个地区位于经度-118.29°,纬度33.91°,居民有1416人,收入中位数为38 372美元,房屋价值中位数为156 400美元(暂时忽略其他特征),那么

y(1)=156 400

· X是一个矩阵,包含数据集中所有实例的所有特征值(不包括标签)。每个实例有一行,第i行等于x(i)的转置,记为(xi))[3]

  ◆ 例如,如果第一个地区如前所述,则矩阵X如下所示:

· h是系统的预测函数,也称为假设。当给系统一个实例的特征向量xi时,它会输出该实例的预测值

  ◆ 例如,如果系统预测第一区的房价中位数为158 400美元,则。该地区的预测误差为

· RMSE(Xh)是使用假设h在样例集上测量的代价函数。

我们对标量值(例如myi)和函数名称(例如h)使用小写斜体,对向量(例如xi)使用小写粗斜体,对矩阵(例如X)使用大写粗斜体。

虽然RMSE通常是回归任务的首选性能度量,但在某些情况下,你可能更喜欢使用其他函数。例如,假设有很多异常地区。在这种情况下,你可以考虑使用平均绝对误差(Mean Absolute Error,MAE,也称为平均绝对偏差),见公式2-2:

公式2-2:平均绝对误差

RMSE和MAE都是衡量两个向量(预测向量和目标向量)之间距离的方法。各种距离度量或范数是可能的:

· 计算平方和的根(RMSE)对应于欧几里得范数:这是我们都熟悉的距离概念。它也被称为2范数,记为‖·‖2(或简称为‖·‖)。

· 计算绝对值之和(MAE)对应于1范数,记为‖·‖1,这有时被称为曼哈顿范数,因为如果你只能沿着正交的城市街区行动,那么它会测量城市中两点之间的距离。

· 一般而言,包含n个元素的向量vk范数定义为0给出向量中的非零元素的数量,给出向量中的最大绝对值。

范数指数越高,它就越关注大值而忽略小值。这就是RMSE比MAE对异常值更敏感的原因。但是当异常值呈指数级减少时(例如在钟形曲线中),RMSE表现非常好,并且通常是首选。

2.2.3 检查假设

最后,列出并验证到目前为止(由你或其他人)所做的假设是一种很好的做法。这可以帮助你尽早发现严重的问题。例如,你的系统输出的地区价格被输入到下游的机器学习系统中,并且你假设这些价格将被原样使用。但是,如果下游系统将价格转换为类别(例如,“便宜”“中等”或“昂贵”),然后使用这些类别而不是价格本身呢?在这种情况下,得到完全正确的价格根本不重要,你的系统只需要获得正确的类别。如果是这样,那么问题应该被定义为分类任务,而不是回归任务。你肯定不想在回归任务上工作几个月后才发现这一点。

幸运的是,在与负责下游系统的团队交谈后,你确信他们确实需要实际的价格,而不仅仅是类别。很好!一切就绪,指示灯是绿灯,那现在可以开始编程了!