回归

tensorflow-header

在 回归 (regression) 问题中,我们的目的是预测出如价格或概率这样连续值的输出。相对于分类(classification) 问题,分类(classification) 的目的是从一系列的分类出选择出一个分类 (如,给出一张包含苹果或橘子的图片,识别出图片中是哪种水果)。

本 notebook 使用经典的 Auto MPG 数据集,构建了一个用来预测70年代末到80年代初汽车燃油效率的模型。为了做到这一点,我们将为该模型提供许多那个时期的汽车描述。这个描述包含:气缸数,排量,马力以及重量。

本示例使用 tf.keras API,相关细节请参阅 本指南

# 使用 seaborn 绘制矩阵图 (pairplot)
pip install -q seaborn
2.3.0

Auto MPG 数据集

该数据集可以从 UCI机器学习库 中获取.

获取数据

首先下载数据集。

使用 pandas 导入数据集。

数据清洗

数据集中包括一些未知值。

为了保证这个初始示例的简单性,删除这些行。

"Origin" 列实际上代表分类,而不仅仅是一个数字。所以把它转换为独热码 (one-hot):

拆分训练数据集和测试数据集

现在需要将数据集拆分为一个训练数据集和一个测试数据集。

我们最后将使用测试数据集对模型进行评估。

数据检查

快速查看训练集中几对列的联合分布。

<seaborn.axisgrid.PairGrid at 0x7f708ca93e80>
png

也可以查看总体的数据统计:

从标签中分离特征

将特征值从目标值或者”标签”中分离。 这个标签是你使用训练模型进行预测的值。

数据规范化

再次审视下上面的 train_stats 部分,并注意每个特征的范围有什么不同。

使用不同的尺度和范围对特征归一化是好的实践。尽管模型可能 在没有特征归一化的情况下收敛,它会使得模型训练更加复杂,并会造成生成的模型依赖输入所使用的单位选择。

注意:尽管我们仅仅从训练集中有意生成这些统计数据,但是这些统计信息也会用于归一化的测试数据集。我们需要这样做,将测试数据集放入到与已经训练过的模型相同的分布中。

我们将会使用这个已经归一化的数据来训练模型。

警告: 用于归一化输入的数据统计(均值和标准差)需要反馈给模型从而应用于任何其他数据,以及我们之前所获得独热码。这些数据包含测试数据集以及生产环境中所使用的实时数据。

模型

构建模型

让我们来构建我们自己的模型。这里,我们将会使用一个“顺序”模型,其中包含两个紧密相连的隐藏层,以及返回单个、连续值得输出层。模型的构建步骤包含于一个名叫 ‘build_model’ 的函数中,稍后我们将会创建第二个模型。 两个密集连接的隐藏层。

检查模型

使用 .summary 方法来打印该模型的简单描述。

现在试用下这个模型。从训练数据中批量获取‘10’条例子并对这些例子调用 model.predict 。

它似乎在工作,并产生了预期的形状和类型的结果

训练模型

对模型进行1000个周期的训练,并在 history 对象中记录训练和验证的准确性。

使用 history 对象中存储的统计信息可视化模型的训练进度。

png
png

该图表显示在约100个 epochs 之后误差非但没有改进,反而出现恶化。 让我们更新 model.fit 调用,当验证值没有提高上是自动停止训练。 我们将使用一个 EarlyStopping callback 来测试每个 epoch 的训练条件。如果经过一定数量的 epochs 后没有改进,则自动停止训练。

你可以从这里学习到更多的回调。

png
png

如图所示,验证集中的平均的误差通常在 +/- 2 MPG左右。 这个结果好么? 我们将决定权留给你。

让我们看看通过使用 测试集 来泛化模型的效果如何,我们在训练模型时没有使用测试集。这告诉我们,当我们在现实世界中使用这个模型时,我们可以期望它预测得有多好。

做预测

最后,使用测试集中的数据预测 MPG 值:

png

这看起来我们的模型预测得相当好。我们来看下误差分布。

png

它不是完全的高斯分布,但我们可以推断出,这是因为样本的数量很小所导致的。

结论

本笔记本 (notebook) 介绍了一些处理回归问题的技术。

  • 均方误差(MSE)是用于回归问题的常见损失函数(分类问题中使用不同的损失函数)。
  • 类似的,用于回归的评估指标与分类不同。 常见的回归指标是平均绝对误差(MAE)。
  • 当数字输入数据特征的值存在不同范围时,每个特征应独立缩放到相同范围。
  • 如果训练数据不多,一种方法是选择隐藏层较少的小网络,以避免过度拟合。
  • 早期停止是一种防止过度拟合的有效技术。