基于TensorFlow 实战案例:气温预测(附 Python 完整代码和数据集)

2023-11-16


各位同学好,今天和大家分享一下TensorFlow2.0深度学习中的一个小案例。

案例内容:现有348个气温样本数据,每个样本有8项特征值和1项目标值,进行回归预测,构建神经网络模型。完整代码及数据,文末获取,喜欢记得收藏、点赞。

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()

完整代码及数据

完整代码及数据已放置后台,按关键字回复即可

想加入技术交流,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

方式①、添加微信号:dkl88191,备注:来自CSDN+温度
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:温度

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于TensorFlow 实战案例:气温预测(附 Python 完整代码和数据集) 的相关文章

随机推荐

  • PostgreSQL数据库用户规划

    在SQL标准里 同一个模式下的对象是不能被不同的用户拥有的 而且有些数据库系统不允许创建和它们的所有者不同名的模式 如Oracle数据库 实际上 在那些只实现了标准中规定的基本模式的数据库系统里 模式和用户的概念几乎是一样的 比如Oracl
  • webpack5进阶-学习笔记

    学习连接 https www bilibili com video BV1964y1k7Hm p 19 spm id from pageDriver 1 区分环境打包 1 1 通过环境变量区分 执行webpack命令时可携带环境变量 并在w
  • 计算机视觉项目实战-背景建模与光流估计(目标识别与追踪)

    欢迎来到本博客 本次博客内容将继续讲解关于OpenCV的相关知识 作者简介 目前计算机研究生在读 主要研究方向是人工智能和群智能算法方向 目前熟悉python网页爬虫 机器学习 计算机视觉 OpenCV 群智能算法 深度学习等内容 以后可能
  • vue--组件开发

    目录 一 button 组件开发 1 1 整体目标 1 2 确定组件API 1 3 编写测试基础Button 1 4 完成type配置 1 5 完成size配置 1 6 完成事件绑定 1 7 总结 二 Editor编辑器组件开发 2 1 确
  • 你还分不清谐波失真、总谐波失真、总谐波失真加噪声吗?

    原文来自公众号 工程师看海 公众号后台回复获取资料 THD 什么是信号失真 时域上测量系统的输出波形应该与输入波形精确一致 只是幅值放大 时间延迟 这称为不失真测量 通常放大电路的输入信号是复杂的多频信号 如果放大电路对信号的不同频率分量的
  • C#配置文件读取保存

    提示 文中分为txt和注册表两种方式 二选一即可 1 安装 txt 注册表 2 引用 txt using ApeFree DataStore using ApeFree DataStore Adapters using ApeFree Da
  • jsoup解析HTML,爬取小说实例

    1 java 的 File separator 斜杠 2 jsoup解析标签 element的text 方法直接取出两个标签中间的文本 import java io File import java io FileNotFoundExcep
  • 【解决】CSS下拉菜单不会显示的问题

    导航栏的下拉菜单不会显示 但按 F5 刷新的一瞬间又能看见下拉菜单的内容 但就是不会显示出来 一开始以为是 js 代码写错或者 css 动画函数的影响 后面找到一篇博客 说这是老生常谈的问题 对于小白确实很难找到问题关键 折腾一晚上终于发现
  • 踩坑日记:Invalid prop: type check failed for prop “border“. Expected Boolean, got String withvalue “fals

    这个错误我这里报了很多 错误的意思 border这个属性 预期的布尔值 得到的字符串值为 false 下面是我的代码 我们把border这个属性前面加上一个 冒号 就好了
  • torch显存分析——如何在不关闭进程的情况下释放显存

    torch显存分析 如何在不关闭进程的情况下释放显存 1 基本概念 allocator和block 2 torch cuda的三大常用方法 3 可以释放的显存 4 无法释放的显存 5 清理 显存钉子户 一直以来 对于torch的显存管理 我
  • SQL Server错误代码及解释(二)

    2001 指定的驱动程序无效 2002 窗口样式或类别属性对此操作无效 2003 不支持请求的图元操作 2004 不支持请求的变换操作 2005 不支持请求的剪切操作 2010 指定的颜色管理模块无效 2011 制定的颜色文件配置无效 20
  • 如何模拟微信小程序请求code

    官方文档有写到获取小程序Code 调用接口获取登录凭证 code 通过凭证进而换取用户登录态信息 包括用户在当前小程序的唯一标识 openid 微信开放平台帐号下的唯一标识 unionid 若当前小程序已绑定到微信开放平台帐号 及本次登录的
  • 在使用uni-app开发小程序时@tap和click的区别

    在HbuilderX中 两者都是点击时触发事件 不同的是 click是组件被点击时触发 会有约300ms的延迟 内置处理优化了 tap是手指触摸离开时触发 没有300ms的延迟 但是会有事件穿透 编译到小程序端 click会被转换成 tap
  • 如何解决使用 django-ftpserver 上传中文文件名乱码的问题

    Django ftpserver 是一个基于 django 的 FTP 服务器应用 它可以让我们轻松地在 django 项目中集成 FTP 服务 它使用 pyftpdlib 库来实现 FTP 协议的功能 最近 我在使用 django ftp
  • Python实现简单时钟(七段管数码结构)

    首先 全部代码如下 import turtle datetime time def drawgap turtle penup turtle fd 5 def drawline draw drawgap turtle pendown if d
  • 利用 uDig 生成 GeoServer 可用的 SLD 渲染文件

    利用 uDig 生成 GeoServer 可用的 SLD 渲染文件 导读 GeoServer 不像 ArcGIS 那样有完整的体系可以完成地图的数据整理 配图 发布整个过程 虽然它也提供了网页版的代码界面去设计通用的 SLD 格式对 WMS
  • 网络编程——epoll

    参考 TCP IP网络编程 尹圣雨 epoll epoll也是Linux下实现I O复用的一种方法 其性能优于select 基于select的I O复用服务器的设计缺陷 调用select函数后 针对所有文件描述符的循环语句 调用select
  • 前端开发中常用的校验处理

    前端开发中常用的校验处理 1 手机号码校验 2 身份证正则校验 3 必须输入中文 必须输入英文 4 其它正则校验 1 手机号码校验 function checkPhone var phone document getElementById
  • C++类和对象(一):封装

    文章目录 0 类和对象 1 封装的意义 2 结构体struct和类class区别 3 成员属性设置为私有 4 封装特性的练习案例 点和圆的位置关系 0 类和对象 C 面向对象的三大特性 封装 继承 多态 C 中万物皆对象 对象包含属性 成员
  • 基于TensorFlow 实战案例:气温预测(附 Python 完整代码和数据集)

    文章目录 1 数据获取 2 数据可视化 3 特征处理 4 构建网络模型 1 网络搭建 2 优化器和损失函数 3 网络训练 4 网络模型结构 5 预测结果 5 结果展示 完整代码及数据 各位同学好 今天和大家分享一下TensorFlow2 0