TensorFlow项目练手——天气预测

news/2024/11/9 4:57:36/

项目介绍

通过以往的天气数据和实际天气温度,做一次回归预测,模型的输入是当前的所有特征值,而模型的输出是当天的实际天气温度

字段分析

目前已有的数据有348条svc数据,他们的字段分别代表

  • year:年
  • month:月
  • day:日
  • week:周几
  • temp_2:前天天气
  • temp_1:昨天天气
  • average:在历史中,每年这一天的平均最高温度值
  • actual:当天实际的温度(答案)
  • friend:这一列可能是凑热闹的,你的朋友猜测的可能值,咱们不管它就好了

一、准备数据

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')filepath = 'temps.csv'
features = pd.read_csv(filepath) # 读取csv数据
features.head() # 查看数据格式

在这里插入图片描述

2、数据可视化

将年月日转成标准格式

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)
# 看一下前10行
times[:10]

在这里插入图片描述

将年月日作为x轴,将数据绘制到图上

# 指定绘图风格
plt.style.use('fivethirtyeight')
# 设置画布,22列的画图窗口,第一行画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、数据预处理

由于Week字段其内容为字符串,需要将其统一变成数字的形式

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

在这里插入图片描述

4、提取特征值

我们将需要预测的标签值取出并从表中移除,此时数据从15个特征变成14个特征

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

在这里插入图片描述

5、数据归一化

为防止由于数据单位不一,跨度大等问题导致的模型准确度不高的问题,对特征数据进行标准化处理

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

在这里插入图片描述

二、构建网络模型

1、设计神经网络模型层

Dense:全连接层,公式是y=Wx+b

# 构建层次
model = tf.keras.Sequential()
# 隐含层1设置16层,权重初始化方法设置为随机高斯分布,加入正则化惩罚项l2
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、设计优化器和损失函数

优化器使用梯度下降法SGD,损失函数使用均方误差MSE

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

3、开始训练数据

epochs=100训练100次

# 开始训练
model.fit(input_features,labels,validation_split=0.25,epochs=100,batch_size=128)

在这里插入图片描述

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、预测模型结果

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

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

6、结果可视化

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

# 真实值,蓝色实现
fig = plt.figure(figsize=(10,5))
axes = fig.add_subplot(111)
axes.plot(dates,labels,'b-',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')filepath = 'temps.csv'
features = pd.read_csv(filepath) # 读取csv数据
features.head() # 查看数据格式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)
# 看一下前10行
times[:10]# 指定绘图风格
plt.style.use('fivethirtyeight')
# 设置画布,22列的画图窗口,第一行画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)# week列是字符串,重新编码,变成数值型
features = pd.get_dummies(features)
features.head()# 获取目标值y,从Series类型变成数组类型
labels = np.array(features['actual'])
# 获取特征值x,即在原数据中去掉目标值列,默认删除行,需要指定轴axis=1指向列
features = features.drop('actual',axis=1)
# 把features从DateFrame变成数组类型
features = np.array(features)
features.shape# 导入标准化方法库
from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)
input_features# 构建层次
model = tf.keras.Sequential()
# 隐含层1设置16层,权重初始化方法设置为随机高斯分布,加入正则化惩罚项l2
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)))# 优化器和损失函数
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')# 开始训练
model.fit(input_features,labels,validation_split=0.25,epochs=100,batch_size=128)model.summary()# 预测模型结果
predict = model.predict(input_features)# 真实值,蓝色实现
fig = plt.figure(figsize=(10,5))
axes = fig.add_subplot(111)
axes.plot(dates,labels,'b-',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()

http://www.ppmy.cn/news/276008.html

相关文章

神舟战神重装系统找不到U盘的解决办法

神舟战神电脑是一款非常不错的电脑,很多用户都会选择使用这款电脑来办公、学习,但是难免有重装系统的时候。有用户反映自己重装系统找不到U盘了该怎么办?找不到U盘那就使用一键重装系统吧,下面小编就来教教大家神舟战神电脑一键重…

神舟战神G8-CA7NP和g8ca7nt哪个好 有什么区别详细配置对比

神舟战神G8-CA7NP和g8ca7nt相互比较起来,个人比较推荐神舟战神G8-CA7NP游戏本。 神舟战神G8-CA7NP还是g8ca7nt这些点很重要看过你就懂了http://www.adiannao.cn/dy 神舟战神G8-CA7NP游戏本,这款神舟(HASEE)战神G8-CA7NP 十代酷睿i7-10870H RTX3060 6G 17…

神舟战神G8-CA7NP怎么样?测评值得买吗?

神舟战神G8-CA7NP游戏本参数介绍: 商品名称:神舟G8-CA7NP 神舟战神G8-CA7NP怎么样这些点很重要看过你就懂了 http://www.adiannao.cn/dy 商品毛重:3.3kg 商品产地:中国大陆 显卡类别:发烧级游戏光线追踪显卡 分辨率&am…

Redis搭建分片集群

一、什么是Redis分片集群 1、概念 Redis分片集群是用于将Redis的数据分布在多个Redis节点上的分布式系统。通过分片集群,可以将数据分成多个部分,并将每个部分存储在不同的节点上,以便实现Redis的高可用性和高性能。 2、Redis分片集群原理…

ChatGPT - 基于 ChatGLM-6B 搭建 ChatGPT 聊天环境

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131104546 Paper:GLM: General Language Model Pretraining with Autoregressive Blank Infilling 一篇于2022年发表在ACL会…

Linux操作系统概述及发行版选择

1. Linux操作系统概述 Linux是一种开源的操作系统,广泛应用于服务器、嵌入式设备和个人计算机等领域。它以稳定性、灵活性和安全性而闻名,并具有强大的命令行界面和丰富的工具生态系统。下面我们将介绍如何选择合适的Linux发行版并进行安装。 2. Linux…

单例模式之双重校验锁

参考文章: https://blog.csdn.net/weixin_44471490/article/details/108929289 解释得很好,一步一步分析为什么这样 写 单例模式 单例即单实例,只实例出来一个对象。 一般在创建一些管理器类、工具类的时候,需要用到单例模式&a…

MSE播放fragmented mp4 问题记录

一、在使用MSE 播放视频的时候发现firfox能播放,chrome 不能播放 原因:两边要求的fragmented mp4的格式要求不一样 , 参照Transcoding assets for Media Source Extensions - Web APIs | MDN 用ffmpeg 转成 对应的格式 firefox ffmpeg -i mp4-264.mp4 -movflags f…