在深度学习的任务中,回归问题也是一个常见的任务。
本文将要预测 20 世纪 70 年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。本节用到的数据集与前面两个例子有一个有趣的区别。它包含的数据点相对较少,只有 506 个,分为 404 个训练样本和 102 个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特性是比例,取值范围为 0~1;有的取值范围为 1~12;还有的取值范围为 0~100,等等。

1 回归问题模型的训练

回归问题有以下几个要点:

  • 隐藏层激活函数用relu
  • 输出层只有一个值,并且不用激活函数(相当于使用恒等函数)
  • 损失函数使用均方误差mse
  • 监控指标使用平均绝对误差mae

模型的训练代码如下:

import numpy as np
from tensorflow.keras.datasets import boston_housing
from tensorflow.keras import models
from tensorflow.keras import layers
import matplotlib.pyplot as pltdef build_model():model=models.Sequential()model.add(layers.Dense(units=64,activation='relu',input_shape=(13,)))model.add(layers.Dense(units=64,activation='relu'))#回归问题的输出问题不需要激活函数,默认就为恒等函数model.add(layers.Dense(units=1))#损失函数使用均方误差 监控指标使用平均绝对误差model.compile(optimizer='rmsprop',loss='mse',metrics=['mae'])return modelif __name__=='__main__':#准备训练数据#(404, 13) (404,)   (102, 13) (102,)#每个样本中有13个数值特征,比如人均犯罪率、每个住宅的平均房间数等#目标是房屋价格的中位数,单位是千美元(train_data,train_targets),(test_data,test_targets)=boston_housing.load_data()#将数据标准化#减去特征平均值,再除以标准差,得到特征平均值为0,标准差为1mean=train_data.mean(axis=0)train_data-=meanstd=train_data.std(axis=0)train_data/=std#测试数据必须以训练数据的均值和标准差进行变换,这样两者的变换才一致test_data-=meantest_data/=std#由于训练样本过少,采用K折交叉验证k=4num_val_samples=len(train_data)//knum_epochs=500all_val_mae_histories=[]all_scores=[]for i in range(k):print('第几折:'+str(i))#验证集val_data=train_data[i*num_val_samples:(i+1)*num_val_samples]val_targets=train_targets[i*num_val_samples:(i+1)*num_val_samples]#训练集x_train_data=np.concatenate([train_data[:i*num_val_samples],train_data[(i+1)*num_val_samples:]],axis=0)y_train_targers=np.concatenate([train_targets[:i*num_val_samples],train_targets[(i+1)*num_val_samples:]],axis=0)model=build_model()#verbose=0代表训练时用的是静默模式history=model.fit(x=x_train_data,y=y_train_targers,validation_data=(val_data,val_targets),epochs=num_epochs,batch_size=1,verbose=1)#保存验证的平均绝对误差val_mae_history=history.history['val_mae']all_val_mae_histories.append(val_mae_history)#计算所有轮次中K折验证分数的平均值average_mae_history=[np.mean([x[i] for x in all_val_mae_histories]) for i in range(num_epochs)]#绘制验证分数 不要绘制前10个数据点plt.plot(range(1+10,len(average_mae_history)+1),average_mae_history[10:])plt.xlabel('Epochs')plt.ylabel('Validation MAE')plt.show()#从上面的k折交叉验证得到验证损失图像中得出最佳的训练批次是80次#然后以这个次数训练得到最终的模型#在所有数据上得到训练模型model=build_model()model.fit(x=train_data,y=train_targets,epochs=80,batch_size=16)#在测试数据上评价test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)print('test_mse_score:'+str(test_mse_score))print('test_mae_score:'+str(test_mae_score))#保存模型model.save('./model/house.h5')

在这个例子中,由于训练样本非常少,只有四百多个,为了在调节网络参数(比如训练的轮数)的同时对网络进行评估,你可以将数据划分为训练集和验证集,正如前面例子中所做的那样。但由于数据点很少,验证集会非常小(比如大约100 个样本)。因此,验证分数可能会有很大波动,这取决于你所选择的验证集和训练集。也就是说,验证集的划分方式可能会造成验证分数上有很大的方差,这样就无法对模型进行可靠的评估。
在这种情况下,最佳做法是使用 K 折交叉验证(见图 3-11)。这种方法将可用数据划分为 K个分区(K 通常取 4 或 5),实例化 K 个相同的模型,将每个模型在 K-1 个分区上训练,并在剩下的一个分区上进行评估。模型的验证分数等于 K 个验证分数的平均值。这种方法的代码实现很简单。
下图为3折交叉验证。

交叉验证的具体代码如下:

#由于训练样本过少,采用K折交叉验证k=4num_val_samples=len(train_data)//knum_epochs=500all_val_mae_histories=[]all_scores=[]for i in range(k):print('第几折:'+str(i))#验证集val_data=train_data[i*num_val_samples:(i+1)*num_val_samples]val_targets=train_targets[i*num_val_samples:(i+1)*num_val_samples]#训练集x_train_data=np.concatenate([train_data[:i*num_val_samples],train_data[(i+1)*num_val_samples:]],axis=0)y_train_targers=np.concatenate([train_targets[:i*num_val_samples],train_targets[(i+1)*num_val_samples:]],axis=0)model=build_model()#verbose=0代表训练时用的是静默模式history=model.fit(x=x_train_data,y=y_train_targers,validation_data=(val_data,val_targets),epochs=num_epochs,batch_size=1,verbose=1)#保存验证的平均绝对误差val_mae_history=history.history['val_mae']all_val_mae_histories.append(val_mae_history)

从交叉样本得到的验证平均绝对误差图像中,主要为了得到模型最适合的训练次数。

从上图中判断出epochs的次数在80时,得到的模型效果最好,因此最终训练的模型我们以80次作为训练总批次得到最终模型。

model=build_model()model.fit(x=train_data,y=train_targets,epochs=80,batch_size=16)

最终训练得到模型文件,在测试数据上的平均绝对误差为:2.876593589782715,这表示预测的房价与真实的房价相差2876美元。
得到的模型结构图为:

2 回归问题模型的调用

调用代码如下:

import numpy as np
from sympy import re
from tensorflow.keras.datasets import boston_housing
from tensorflow.keras import models
from tensorflow.keras import layersif __name__=='__main__':#准备训练数据#(404, 13) (404,)   (102, 13) (102,)#每个样本中有13个数值特征,比如人均犯罪率、每个住宅的平均房间数等#目标是房屋价格的中位数,单位是千美元(train_data,train_targets),(test_data,test_targets)=boston_housing.load_data()#将数据标准化#减去特征平均值,再除以标准差,得到特征平均值为0,标准差为1mean=train_data.mean(axis=0)train_data-=meanstd=train_data.std(axis=0)train_data/=std#测试数据必须以训练数据的均值和标准差进行变换,这样两者的变换才一致test_data-=meantest_data/=std#载入模型model=models.load_model('./model/house.h5')model.summary()#预测测试数据中的第22个数据print('这一年的真实房价为:'+str(test_targets[22])+'(千美元)')result=model.predict(test_data[22].reshape(1,-1))print('这一年的预测房价为:'+str(result[0][0])+'(千美元)')

预测结果如下:
这一年的真实房价为:20.0(千美元)
这一年的预测房价为:21.134518(千美元)

可见,预测的价格与真实价格仅仅相差1千美元,这个回归模型效果还是可以的。

Keras深度学习(4)-回归问题之预测房价相关推荐

  1. 深度学习利用回归算法进行数据预测

    机床加工过程中,因热变形产生的热误差占机床加工总误差的40%-70%.热误差值补偿是解决热误差的主流技术,如何将神经网络建模与热误差值预测结合起来,是今天介绍的重点. 本项目研究对象为立式数控加工中心 ...

  2. Keras深度学习实战——信用预测

    Keras深度学习实战--信用预测 0. 前言 1. 任务与模型分析 1.1 数据集 1.2 信用预测任务分析 1.3 神经网络模型分析 2. 使用神经网络实现信用预测 3. 改进模型 3.1 为类别 ...

  3. 【深度学习 项目实战】Keras深度学习多变量时间序列预测的LSTM模型

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程.人工智能教程 本篇文章将介绍基于 ...

  4. Keras深度学习实战——股价预测

    Keras深度学习实战--股价预测 0. 前言 1. 股价预测 1.1 数据集介绍 1.2 神经网络模型分析 1.2 使用神经网络进行股价预测 2. 使用函数式 API 2.1 神经网络模型分析 2. ...

  5. Keras深度学习实战(32)——基于LSTM预测股价

    Keras深度学习实战(32)--基于LSTM预测股价 0. 前言 1. 模型与数据集分析 1.1 数据集分析 1.2 模型分析 2. 基于长短时记忆网络LSTM预测股价 2.1 根据最近五天的股价预 ...

  6. Keras深度学习实战(4)——深度学习中常用激活函数和损失函数详解

    Keras深度学习实战(4)--深度学习中常用激活函数和损失函数详解 常用激活函数 Sigmoid 激活函数 Tanh 激活函数 ReLU 激活函数 线性激活函数 Softmax 激活函数 损失函数 ...

  7. Keras深度学习实战(1)——神经网络基础与模型训练过程详解

    Keras深度学习实战(1)--神经网络基础与模型训练过程详解 0. 前言 1. 神经网络基础 1.1 简单神经网络的架构 1.2 神经网络的训练 1.3 神经网络的应用 2. 从零开始构建前向传播 ...

  8. Keras深度学习入门(一)

    第一部分:机器学习基础 一.机器学习的四个分支 监督学习 分类 回归 序列生成,给定一张图像,预测描述图像的文字 语法树预测,给定一个句子,预测其分解生成的语法树 目标检测,给定一张图像,在图中特定目 ...

  9. Keras 深度学习框架中文文档

    2019独角兽企业重金招聘Python工程师标准>>> Keras深度学习框架中文文档 Keras官网:http://keras.io/ Github项目:https://githu ...

  10. 为什么将表格的method改为post后就无法工作_用Python将Keras深度学习模型部署为Web应用程序...

    构建一个很棒的机器学习项目是一回事,但归根结底,你希望其他人能够看到你的辛勤工作.当然,你可以将整个项目放在GitHub上,但是怎么让你的祖父母也看到呢?我们想要的是将深度学习模型部署为世界上任何人都 ...

最新文章

  1. lua和unity如何交互_Unity中C#对象与Lua之间交互的原理
  2. 将数据库日志添加到JUnit3
  3. CGLIB动态代理使用介绍
  4. 如何制作网页棋牌游戏
  5. Microchip具有SDI和SQI接口串行SRAM存储器23LC512
  6. 可恶的零宽空格—ZWSP
  7. ffmpeg下载安装,以及springboot 整合视频点播学习
  8. JavaScript通过extend和super实现继承
  9. 克罗内克积的c++简单实现
  10. hyperopt使用
  11. python提供了几个基本的数值运算操作符_慢步学习,二级python,数字类型及其运算...
  12. 第14周—项目1(3)二叉排序树
  13. GOF23设计模式总结
  14. 大一学生WEB前端静态网页——旅游网页设计与实现(15页面)
  15. SAP中从应用角度扒一扒产品成本核算号
  16. android 手机 用短信发pdf文件,安卓手机什么pdf阅读器最好用?如何编辑pdf文件
  17. VS2010用OLEDB连接Access
  18. word文档转html在线预览Demo
  19. POI Excel复制行(支持复制样式、合并单元格、形状)
  20. 成为最大的独立开源公司,对SUSE意味着什么?

热门文章

  1. 基于idea2021.2.1版本使用git
  2. vant 索引城市不对_vue,vant,使用过程中 Swipe 轮播自定义大小遇到的坑
  3. Redis分布式锁实现OneByOne组件
  4. 用计算机算四分位数间距,四分位数间距(IQR)公式与在线计算器_三贝计算网_23bei.com...
  5. okHttp3.0下载文件
  6. 张量CP分解原理及Python实现
  7. Linux——网络编程总结性学习
  8. 【工程师有空了】安信可ESP8266系列及ESP32系列模组AT指令实现网页配网---又多了一个配网方式
  9. 【RL-TCPnet网络教程】第28章 RL-TCPnet之DNS应用
  10. C# Generics 泛型