【TensorFlow 2.0教程】回归:预测燃油效率

  • A+
所属分类:TensorFlow 2.0

回归问题中,我们的目标是预测连续值的输出,比如价格或概率。然而在分类问题中,我们的目标是从类列表中选择一个类(例如,一幅图片包含一个苹果或一个橘子,而我们的目标就是识别出图中有哪些水果)。

本文将使用经典的汽车MPG数据集,并建立了一个模型来预测70年代末、80年代初汽车的燃油效率。为了做到这一点,我们将为模型提供当时很多汽车的属性,包括:气缸、排量、马力和重量。

我们依然使用  API来完成本例。

首先,导入本文将要使用的库:

汽车MPG数据集

该数据集可以从UCI机器学习仓库中获得。

获取数据

首先,下载数据集。

使用Pandas读取数据文件:

 MPGCylindersDisplacementHorsepowerWeightAccelerationModel YearOrigin
39327.04140.086.02790.015.6821
39444.0497.052.02130.024.6822
39532.04135.084.02295.011.6821
39628.04120.079.02625.018.6821
39731.04119.082.02720.019.4821

清理数据

检查数据集中是否包含一些未知数据(空值)。

可以看到,有6行数据的“Horsepower”列是空值,简单起见,我们直接删除这些行:

“Origin”列实际上是分类列,而不是数字的,所以我们把它转换成one-hot:

 MPGCylindersDisplacementHorsepowerWeightAccelerationModel YearUSAEuropeJapan
39327.04140.086.02790.015.6821.00.00.0
39444.0497.052.02130.024.6820.01.00.0
39532.04135.084.02295.011.6821.00.00.0
39628.04120.079.02625.018.6821.00.00.0
39731.04119.082.02720.019.4821.00.00.0

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

现在,我们将数据集拆分为训练集和测试集。我们将在对模型进行最终评估时使用测试集。

检视数据

让我们快速查看一下训练集中几列数据之间的联合分布。

【TensorFlow 2.0教程】回归:预测燃油效率

再看看整个数据集的统计结果:

 countmeanstdmin25%50%75%max
Cylinders314.05.4777071.6997883.04.004.08.008.0
Displacement314.0195.318471104.33158968.0105.50151.0265.75455.0
Horsepower314.0104.86942738.09621446.076.2594.5128.00225.0
Weight314.02990.251592843.8985961649.02256.502822.53608.005140.0
Acceleration314.015.5592362.7892308.013.8015.517.2024.8
Model Year314.075.8980893.67564270.073.0076.079.0082.0
USA314.00.6242040.4851010.00.001.01.001.0
Europe314.00.1783440.3834130.00.000.00.001.0
Japan314.00.1974520.3987120.00.000.00.001.0

从数据中取出目标值

将目标值从数据中分离出来,这个目标值是您将通过训练的模型来预测的值。

正则化数据

再次查看上面的  表,你会注意到每个特征值的范围都不同。

把具有不同范围值的特征正则化(归一化)是一个很好的实践。虽然模型在不进行特征归一化的情况下也可以收敛,但这会增加训练的难度,并使生成的模型依赖于输入数据中的单位选择。

*注意:虽然我们有意只从训练数据集生成这些统计数据,但是这些统计数据也将用于正则化测试数据集。这样做是为了将测试数据集也投射到模型所训练的相同分布中。

我们将使用这些正则化的数据来训练模型。

警告:这里用于正则化输入的统计数据(平均值和标准偏差)需要应用于任何其他提供给模型的数据,以及我们前面所做的one-hot编码,这包括在生产中使用模型时的测试集和实时数据。

模型

构建模型

让我们构建我们的模型。在这里,我们将使用一个  模型,其中包含两个全连接的隐藏层和一个返回单个连续值的输出层。模型构建步骤封装在函数  中,因为稍后我们将用该函数创建另外一个模型。

检视模型

使用模型的  函数打印模型的简单描述:

现在试试这个模型,从训练数据集中取出10个样本,调用模型的  函数进行预测。

看起来我们的模型可以正常工作,它可以产生我们预期的形状及类型的预测结果。

训练模型

对模型进行1000次迭代训练,并把训练和验证准确率保存在  对象中。

接下来,我们可以将模型的训练过程进行可视化,我们可以使用  对象中存储的状态。

 lossmaemseval_lossval_maeval_mseepoch
9951.4293950.8058081.42939514.7811303.15397514.781130995
9962.5648161.1543522.56481610.6773582.59952310.677358996
9971.4068400.7820631.40684010.4802822.47078510.480282997
9981.7240820.8872331.7240829.4113252.4642319.411325998
9991.4583400.7829951.45834011.5747522.70015611.574753999

【TensorFlow 2.0教程】回归:预测燃油效率

【TensorFlow 2.0教程】回归:预测燃油效率

这两张图显示,在大约100次迭代之后,验证错误几乎没有改善,甚至变差。让我们更新  ,当验证分数没有提高时自动停止训练。我们将使用一个  回调函数来检查每次迭代,如果在一定迭代次数后一直没有提高准确率,则自动停止训练。

【TensorFlow 2.0教程】回归:预测燃油效率

【TensorFlow 2.0教程】回归:预测燃油效率

从图中可以看出,在验证集上,平均误差通常在正负2MPG左右。

我们在训练模型时没有使用测试集,现在让我们看看把模型应用在测试集上的效果将如何。这个结果可以告诉我们,当我们在现实世界中使用这个模型时,模型的预测结果是好还是坏。

进行预测

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

【TensorFlow 2.0教程】回归:预测燃油效率

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

【TensorFlow 2.0教程】回归:预测燃油效率

它不是高斯分布的,但我们可以预料到这样的结果是因为样本的数量太小。

小结

本文介绍了一些处理回归问题的技术:

  • 均方误差(MSE)是回归问题中常用的损失函数(与分类问题中使用的损失函数不同)。
  • 类似地,用于回归的评估指标也与分类不同。一个常见的回归度量是平均绝对误差(MAE)。
  • 当数值型输入特征具有不同范围值时,应该将特征缩放到相同的范围,称为正则化(或归一化)。
  • 如果没有足够的训练数据,一种解决的技术是选择具有很少隐藏层的小型网络来避免“过拟合”。
  • 提前停止训练(  )是一种有效防止“过拟合”的技术。

本文完整代码请参考这里

weinxin
关注微信
如有疑问,欢迎扫一扫左侧二维码添加微信好友进行咨询,我会第一时间回复您!
yglong

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: