前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TensorFlow2 开发指南 | 02 回归问题之汽车燃油效率预测

TensorFlow2 开发指南 | 02 回归问题之汽车燃油效率预测

原创
作者头像
AI菌
修改2020-10-26 11:32:19
5670
修改2020-10-26 11:32:19
举报

大家好!我是【AI 菌】,一枚爱弹吉他的程序员。我热爱AI、热爱分享、热爱开源! 这博客是我对学习的一点总结与思考。如果您也对 深度学习、机器视觉、数据结构与算法、编程 等感兴趣,可以关注我的动态,我们一起学习,一起进步~

我的博客地址为:【AI 菌】的博客 我的Github项目地址是:【AI 菌】的Github

前言:

这个专栏我将分享我的 TensorFlow2 学习过程,力争打造一个的轻松而高效的TensorFlow2入门学习教程,想学习的小伙伴可以关注我的动态!我们一起学习,一起进步!

相关文章:【TF2.0深度学习实战——图像分类】


一、回归问题

机器学习中有两大基本问题:分类问题和回归问题。分类(classification) 的目的是从一系列的类别中选择出一个分类,如果是针对图片进行分类,就是图片分类问题,这一部分可参见我上一个专栏:【TF2.0深度学习实战——图像分类】。在机器学习中,另一个重要的问题就是回归问题 (regression) 。它的目的是预测出如价格或概率这样连续的输出值。

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

Auto MPG 数据集部分样本如下表所示:

Auto MPG 数据集样本数据
Auto MPG 数据集样本数据

二、数据集准备

(1)数据集下载与导入

# 下载AUTO-MPG数据集
dataset_path = keras.utils.get_file("auto-mpg.data", "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data")

# 使用pandas导入数据集
column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight',
                'Acceleration', 'Model Year', 'Origin']
raw_dataset = pd.read_csv(dataset_path, names=column_names,
                      na_values = "?", comment='\t',
                      sep=" ", skipinitialspace=True)
dataset = raw_dataset.copy()
dataset.tail()

(2)数据清洗

dataset.isna().sum()  # 数据集中包括一些未知值
dataset = dataset.dropna()  # 删除未知行

# origin列实际上代表分类,将origin列转换为独热码(one-hot)
origin = dataset.pop('Origin')  
dataset['USA'] = (origin == 1)*1.0
dataset['Europe'] = (origin == 2)*1.0
dataset['Japan'] = (origin == 3)*1.0
dataset.tail()

将origin列转换为独热码后,原来数据集样本变为:

(3)数据集划分

# 拆分训练数据集和测试数据集
train_dataset = dataset.sample(frac=0.8, random_state=0)
test_dataset = dataset.drop(train_dataset.index)

(4)数据检查

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

# 使用seaborn进行数据检查
sns.pairplot(train_dataset[["MPG", "Cylinders", "Displacement", "Weight"]], diag_kind="kde")  

联合分布如下:

(5)分离标签

由于标签MPG列存在于下载的数据集中,因此需要单独分离开来。

train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')

(6)数据规范化

def norm(x):
  return (x - train_stats['mean']) / train_stats['std']
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)

三、模型搭建与训练

(1)模型的搭建

model = keras.Sequential([
    layers.Dense(64, activation='relu', input_shape=[len(train_dataset.keys())]),
    layers.Dense(64, activation='relu'),
    layers.Dense(1)
  ])

(2)模型的装配

optimizer = tf.keras.optimizers.RMSprop(0.001)
model.compile(loss='mse',
                optimizer=optimizer,
                metrics=['mae', 'mse'])

(3)模型的训练

EPOCHS = 1000
history = model.fit(
  normed_train_data, train_labels,
  epochs=EPOCHS, validation_split=0.2, verbose=2)

(4)训练的可视化

def plot_history(history):
  hist = pd.DataFrame(history.history)
  hist['epoch'] = history.epoch

  plt.figure()
  plt.xlabel('Epoch')
  plt.ylabel('Mean Abs Error [MPG]')
  plt.plot(hist['epoch'], hist['mae'],
           label='Train Error')
  plt.plot(hist['epoch'], hist['val_mae'],
           label='Val Error')
  plt.ylim([0, 5])
  plt.legend()

  plt.figure()
  plt.xlabel('Epoch')
  plt.ylabel('Mean Square Error [$MPG^2$]')
  plt.plot(hist['epoch'], hist['mse'],
           label='Train Error')
  plt.plot(hist['epoch'], hist['val_mse'],
           label='Val Error')
  plt.ylim([0, 20])
  plt.legend()
  plt.show()
  
plot_history(history)

可视化结果:

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

四、停训与预测

(1)提前停止训练

由于训练到一定epochs后,模型的误差可能不再变化,甚至在恶化,这时就可以提前停止训练,节省时间。

# patience 值用来检查改进 epochs 的数量
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
history = model.fit(normed_train_data, train_labels, epochs=EPOCHS,
                    validation_split=0.2, verbose=1, callbacks=[early_stop])

使用 EarlyStopping callback 连续检测10个epochs,如果误差没有变小,就停止训练。结果如下:

从上图可以发现:加了 EarlyStopping callback 后,模型提前停止训练了,在训练到50个epochs左右时,误差就没有再缩小,从而提前停止训练。

(2)预测效果

以上都是在训练和验证集上的测试效果,下面我们将对测试集进行预测,来测试模型的泛化效果。

# 平均预测误差
loss, mae, mse = model.evaluate(normed_test_data, test_labels, verbose=2)
print("Testing set Mean Abs Error: {:5.2f} MPG".format(mae))
test_predictions = model.predict(normed_test_data).flatten()

# 可视化预测效果:prediction-truth图
plt.figure()
plt.scatter(test_labels, test_predictions)
plt.xlabel('True Values [MPG]')
plt.ylabel('Predictions [MPG]')
plt.axis('equal')
plt.axis('square')
plt.xlim([0,plt.xlim()[1]])
plt.ylim([0,plt.ylim()[1]])
_ = plt.plot([-100, 100], [-100, 100])

# 误差分布图
plt.figure()
error = test_predictions - test_labels
plt.hist(error, bins = 25)
plt.xlabel("Prediction Error [MPG]")
_ = plt.ylabel("Count")
plt.show()

测试集上的预测效果如下:

  1. 平均误差。平均误差为1.98。
Testing set Mean Abs Error:  1.98 MPG
  1. prediction-truth图。横轴表示真实的值,纵轴表示的是预测的值。可见预测值很贴近真实值。
  1. 误差分布。横轴是预测误差,纵轴是统计的每个误差对应的样本数。
    在这里插入图片描述
    在这里插入图片描述
    由上图可见,它不是完全的高斯分布,可以推断出,这是因为样本的数量很小所导致的。undefined

完整代码已经上传github仓库:https://github.com/Keyird/TensorFlow2-for-beginner 如果对你有帮助的话,欢迎star收藏~

<font color = orange>最好的关系是互相成就,各位的「三连」就是【AI 菌】创作的最大动力,我们下期见!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、回归问题
  • 二、数据集准备
    • (1)数据集下载与导入
      • (2)数据清洗
        • (3)数据集划分
          • (4)数据检查
            • (5)分离标签
              • (6)数据规范化
              • 三、模型搭建与训练
                • (1)模型的搭建
                  • (2)模型的装配
                    • (3)模型的训练
                      • (4)训练的可视化
                      • 四、停训与预测
                        • (1)提前停止训练
                          • (2)预测效果
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档