各位同学好,今天和大家分享一下TensorFlow2.0深度学习中的一个小案例。案例内容:现有348个气温样本数据,每个样本有8项特征值和1项目标值,进行回归预测,构建神经网络模型。

数据集免费:神经网络回归预测--气温数据集-机器学习文档类资源-CSDN文库https://download.csdn.net/download/dgvv4/49801464


1. 数据获取

导入所需要的库文件,获取气温数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
# 使用keras建模方法
from tensorflow.keras import layers
import warnings
warnings.filterwarnings('ignore')#(1)数据获取
filepath = 'C:\\...\\temps.csv'
features = pd.read_csv(filepath)

temp_2代表前天的最高温度,temp_1代表昨天的最高温度,预测目标值为actual


2. 数据可视化

我们绘制日期-温度曲线,首先需要将特征year、month、day组合在一起,拼接成一个字符串,再转变成一个datetime类型的数据。

# 处理时间数据,将年月日组合在一起
import datetime
# 获取年月日数据
years = features['year']
months = features['month']
days = features['day']# 将年月日拼接在一起--字符串类型
dates = []  # 用于存放组合后的日期
for year,month,day in zip(years,months,days):date = str(year)+'-'+str(month)+'-'+str(day)  #年月日之间用'-'向连接dates.append(date)# 转变成datetime格式
times = []
for date in dates:time = datetime.datetime.strptime(date,'%Y-%m-%d')times.append(time)
# 看一下前5行
times[:5]

处理好了x轴的数据,我们现在来对几个特征绘制曲线

# 可视化,对各个特征绘图
# 指定绘图风格
plt.style.use('fivethirtyeight')
# 设置画布,2行2列的画图窗口,第一行画ax1和ax2,第二行画ax3和ax4
fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,figsize=(20,10))# ==1== actual特征列
ax1.plot(times,features['actual'])
# 设置x轴y轴标签和title标题
ax1.set_xlabel('');ax1.set_ylabel('Temperature');ax1.set_title('actual temp')
# ==2== 前一天的温度
ax2.plot(times,features['temp_1'])
# 设置x轴y轴标签和title标题
ax2.set_xlabel('');ax2.set_ylabel('Temperature');ax2.set_title('temp_1')
# ==3== 前2天的温度
ax3.plot(times,features['temp_2'])
# 设置x轴y轴标签和title标题
ax3.set_xlabel('Date');ax3.set_ylabel('Temperature');ax3.set_title('temp_2')
# ==4== friend
ax4.plot(times,features['friend'])
# 设置x轴y轴标签和title标题
ax4.set_xlabel('Date');ax4.set_ylabel('Temperature');ax4.set_title('friend')
# 轻量化布局调整绘图
plt.tight_layout(pad=2)


3. 特征处理

首先我们需要划分特征值和目标值。在原数据中提取特征值和目标值,'actual'存放的是当日最高温度。

# 获取目标值y,从Series类型变成数组类型
targets = np.array(features['actual'])
# 获取特征值x,即在原数据中去掉目标值列,默认删除行,需要指定轴axis=1指向列
features = features.drop('axtual',axis=1)
# 把features从DateFrame变成数组类型
features = np.array(features)

由于特征值中存在字符串类型的数据,'week'列都是字符串,因此我们需要对特征值进行one-hot编码将字符串类型转变成数值类型

# week列是字符串,重新编码,变成数值型
features = pd.get_dummies(features)

处理完字符串数据以后,所有数据变成数值型。为防止由于数据单位不一,跨度大等问题导致的模型准确度不高的问题,对数值型数据进行标准化处理 

# 导入标准化方法库
from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)

到此,对原始数据的处理结束,接下来构建神经网络模型。


4. 构建网络模型

我们使用keras建模方法,常用参数如下:

activation: 激活函数,一般选relu

kernel_initializer, bias_initializer: 权重与偏置参数的初始化方法,有时候不收敛换个初始化方法就好了

kernel_regularizer, bias_regularizer:权重与偏置的正则化

inputs:输入

units:神经元个数

所有参数设置方法的参考:Module: tf  |  TensorFlow Core v2.7.0 (google.cn)


(1)网络搭建

首先我们导入keras序列模型,tf.keras.Sequential(),按顺序一层一层添加网络层。layers代表不同层次的实现。

每个隐含层的神经元个数是随意改变的,大家可以自己去试,我们这里需要预测最高温度,因此输出值层只需要一个神经元。权重初始化方法各不相同,大家可以在上面那个文档中寻找合适的。

# 构建层次
model = tf.keras.Sequential()
# 隐含层1设置16层,权重初始化方法设置为随机高斯分布,加入正则化惩罚项
model.add(layers.Dense(16,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
# 隐含层2设置32层
model.add(layers.Dense(32,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
# 输出层设置为1,即输出一个预测结果
model.add(layers.Dense(1,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))

(2)优化器和损失函数

接下来需要指定优化器和损失函数 model.compile(),在这里优化器使用梯度下降法,损失函数使用MSE均方误差。大家要根据自己的任务来选择,损失函数的选择对网络的结果影响很大。

# 优化器和损失函数
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')

(3)网络训练

制定完成后就可以开始训练了,网络训练函数 model.fit()。输入特征值input_features,目标值targets,validation_split=0.25指测试集在输入数据中抽取0.25用于测试,epochs指迭代次数100次,每一次迭代128个样本。

# ==3== 网络训练
model.fit(input_features,targets,validation_split=0.25,epochs=100,batch_size=128)

返回训练损失和测试损失,可看到迭代100次后,训练集的损失24.675和测试集的损失29.01相差不大,证明没有出现过拟合现象。如果出现训练集的损失很小,测试集的损失很大,说明存在过拟合,需要调整参数。

(4)网络模型结构

我们也可以看一下我们构建的网络模型结构,model.summary(),隐含层1有240个参数,它是怎么计算的呢?输入层的shape为[348,14],14个特征;第一个全连接层W的shape为[14,16],16代表隐含层1的特征个数,偏置参数b的shape为[1,16],y=Wx+b。因此参数个数为14*16+16=240。

(5)预测结果

网络模型预测函数 model.predict()

# ==5== 预测模型结果
predict = model.predict(input_features)

我们这里对有所的样本都预测一下,来比较预测结果和实际结果的差异


5. 结果展示

简单绘制一个散点图来看一下,可以看出预测结果和实际结果大体保持相同,稍微存在偏差。感兴趣的同学可以进一步进行特征工程、调节参数,来达到更好的效果。

# 真实值,蓝色实现
fig = plt.figure(figsize=(10,5))
axes = fig.add_subplot(111)
axes.plot(dates,targets,'bo',label='actual')
# 预测值,红色散点
axes.plot(dates,predict,'ro',label='predict')
axes.set_xticks(dates[::50])
axes.set_xticklabels(dates[::50],rotation=45)plt.legend()
plt.show()


完整代码

# 回归预测温度
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
# 使用keras建模方法
from tensorflow.keras import layers
import warnings
warnings.filterwarnings('ignore')#(1)数据获取
filepath = 'C:\\..\\temps.csv'
features = pd.read_csv(filepath)
# tenmp2代表前两天的温度,temp1代表前一天的温度,目标值为actual#(2)数据预处理
# ==1== 处理时间数据,将年月日组合在一起
import datetime
# 获取年月日数据
years = features['year']
months = features['month']
days = features['day']
# 将年月日拼接在一起--字符串类型
dates = []
for year,month,day in zip(years,months,days):date = str(year)+'-'+str(month)+'-'+str(day)dates.append(date)
# 转变成datetime格式
times = []
for date in dates:time = datetime.datetime.strptime(date,'%Y-%m-%d')times.append(time)
# 看一下前5行
times[:5]#(3)可视化,对各个特征绘图
# 指定绘图风格
plt.style.use('fivethirtyeight')
# 设置画布,2行2列的画图窗口,第一行画ax1和ax2
fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,figsize=(20,10))# ==1== actual特征列
ax1.plot(times,features['actual'])
# 设置x轴y轴标签和title标题
ax1.set_xlabel('');ax1.set_ylabel('Temperature');ax1.set_title('actual temp')
# ==2== 前一天的温度
ax2.plot(times,features['temp_1'])
# 设置x轴y轴标签和title标题
ax2.set_xlabel('');ax2.set_ylabel('Temperature');ax2.set_title('temp_1')
# ==3== 前2天的温度
ax3.plot(times,features['temp_2'])
# 设置x轴y轴标签和title标题
ax3.set_xlabel('Date');ax3.set_ylabel('Temperature');ax3.set_title('temp_2')
# ==4== friend
ax4.plot(times,features['friend'])
# 设置x轴y轴标签和title标题
ax4.set_xlabel('Date');ax4.set_ylabel('Temperature');ax4.set_title('friend')
# 轻量化布局调整绘图
plt.tight_layout(pad=2)#(4)对字符型数据one-hot编码
# week列是字符串,重新编码,变成数值型
features = pd.get_dummies(features)#(5)划分特征值和目标值
# 获取目标值y,从Series类型变成数值类型
targets = np.array(features['actual'])
# 获取特征值x,即在原数据中去掉目标值列,默认删除行,需要指定轴axis=1指向列
features = features.drop('actual',axis=1)
# 把features从DateFrame变成数组
features = np.array(features)#(6)标准化处理
from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)#(7)keras构建网络模型
# ==1== 构建层次
model = tf.keras.Sequential()
# 隐含层1设置16层,权重初始化方法设置为随机高斯分布
# 加入正则化惩罚项
model.add(layers.Dense(16,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
model.add(layers.Dense(32,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
model.add(layers.Dense(1,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
# ==2== 指定优化器
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')
# ==3== 网络训练
model.fit(input_features,targets,validation_split=0.25,epochs=100,batch_size=128)
# ==4== 网络模型结构
model.summary()
# ==5== 预测模型结果
predict = model.predict(input_features)#(7)展示预测结果
# 真实值,蓝色实现
fig = plt.figure(figsize=(10,5))
axes = fig.add_subplot(111)
axes.plot(dates,targets,'bo',label='actual')
# 预测值,红色散点
axes.plot(dates,predict,'ro',label='predict')
axes.set_xticks(dates[::50])
axes.set_xticklabels(dates[::50],rotation=45)plt.legend()
plt.show()

【神经网络】(1) 简单网络,实例:气温预测,附python完整代码和数据集相关推荐

  1. 【机器学习入门】(8) 线性回归算法:正则化、岭回归、实例应用(房价预测)附python完整代码和数据集

    各位同学好,今天我和大家分享一下python机器学习中线性回归算法的实例应用,并介绍正则化.岭回归方法.在上一篇文章中我介绍了线性回归算法的原理及推导过程:[机器学习](7) 线性回归算法:原理.公式 ...

  2. 【机器学习入门】(9) 逻辑回归算法:原理、精确率、召回率、实例应用(癌症病例预测)附python完整代码和数据集

    各位同学好,今天我和大家分享一下python机器学习中的逻辑回归算法.内容主要有: (1) 算法原理:(2) 精确率和召回率:(3) 实例应用--癌症病例预测. 文末有数据集和python完整代码 1 ...

  3. 【机器学习入门】(13) 实战:心脏病预测,补充: ROC曲线、精确率--召回率曲线,附python完整代码和数据集

    各位同学好,经过前几章python机器学习的探索,想必大家对各种预测方法也有了一定的认识.今天我们来进行一次实战,心脏病病例预测,本文对一些基础方法就不进行详细解释,有疑问的同学可以看我前几篇机器学习 ...

  4. 【机器学习入门】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集

    各位同学好,今天和大家分享一下python机器学习中的决策树算法,在上一节中我介绍了决策树算法的基本原理,这一节,我将通过实例应用带大家进一步认识这个算法.文末有完整代码和数据集,需要的自取.那我们开 ...

  5. 【机器学习入门】(3) 朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)附python完整代码及数据集

    各位同学好,今天我和大家分享一下朴素贝叶斯算法中的三大模型.在上一篇文章中,我介绍了朴素贝叶斯算法的原理,并利用多项式模型进行了文本分类预测. 朴素贝叶斯算法 -- 原理,多项式模型文档分类预测,附p ...

  6. 【机器学习入门】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍python机器学习中的朴素贝叶斯算法.内容有:算法的基本原理:案例实战--新闻文档的分类预测. 案例简介:新闻数据有20个主题,有10万多篇文章,每篇文章对应不同的主题, ...

  7. 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍一下python机器学习中的K近邻算法.内容有:K近邻算法的原理解析:实战案例--红酒分类预测.红酒数据集.完整代码在文章最下面. 案例简介:有178个红酒样本,每一款红酒 ...

  8. 【opencv】(11) 背景建模,帧差法、混合高斯模型,实战:行人检测,附python完整代码和数据集

    各位同学好,今天和大家分享一下opencv背景建模相关操作.主要介绍两种背景建模方法,帧差法和混合高斯模型. 案例简介:现有一份路口摄像机拍摄的行人流视频,通过背景建模方法,区分背景和前景,完成行人识 ...

  9. 【opencv】(9) 图像识别实战:银行卡数字识别,附python完整代码和数据集

    各位同学大家好,今天我和大家分享一下opencv机器视觉实战项目,识别银行卡上的数字,该方法也同样适用于车牌数字识别. 数据集免费: https://download.csdn.net/downloa ...

最新文章

  1. 网络摄像机ip修改工具_网络监控怎么连接网络
  2. Windons Server2008R2_向域中批量创建用户
  3. Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践
  4. css 外弧_css 伪类实现弧形
  5. ArcGIS Desktop软件安装和试用说明
  6. Oracle项目管理系统的BIM应用
  7. ADS学习笔记—3.仿真实例
  8. “牙医”教你用450行Go代码自制编程语言 | Gopher Daily (2021.01.15) ʕ◔ϖ◔ʔ
  9. C#实现一个局域网文件传输工具
  10. 纯净版PE系统安装全套流程
  11. PHP 登录注册附带邮箱手机号验证
  12. 两数互素有什么性质_两个数互质是什么意思 判断互质数的方法有哪些
  13. 关于android的nfc问题 Ultralight c (通用卡)
  14. Oracle OCP 11g 常见单词(不定期更新)
  15. 新锐房地产销售管理系统(部分流程)技术解析(八) 销售管理_预定管理
  16. 数学常用语的英文表示
  17. python实现windows ie代理切换
  18. Chart.js插件使用的笔记
  19. 青龙扩展项目-全球骑士购
  20. 计算机的综合应用图片,计算机软件综合应用.PPT

热门文章

  1. andriod studio 注释乱码问题
  2. 基础知识:页面div始终浮在浏览器顶部
  3. UML for Java Programmers之dx实战
  4. 面试题--特别是字节对齐
  5. [摘]终于找到一个有助理解left/right/full outer join的例子
  6. GridView中HyperLinkField的链接使用JavaScript问题
  7. linux安装vsftpt服务,centos安装vsftp服务.md
  8. am5718_AM5718如何扩大内存 - Sitara™ Cortex-A8 和 ARM9 微处理器 - Sitara™ Cortex-A8 和 ARM9 微处理器 - E2E™ 中文支持论坛...
  9. pythontype函数使用_基础教程:python isinstance与type函数用法
  10. 算法代码中的循环矩阵在哪体现_循环移位可视化理解