Python数据分析案例36——基于神经网络的AQI多步预测(空气质量预测)

案例背景

不知道大家发现了没,现在的神经网络做时间序列的预测都是单步预测,即(需要使用X的t-n期到X的t-1期的数据去预测X的t期的数据),这种预测只能预测一个点,我需要预测X的t+1期的数据就没办法了,有的同学说可以把预测的结果X的t+1拿进来作为新的x去预测。。。我只能说这种情况是有误差的,而且误差会累加,这样效果很差。(看很多ARIMA的预测效果一条直线就知道了)

很多时候需要进行多步预测,即(需要使用X的t-n期到X的t-1期的数据去预测X的t期到t+n期的数据,预测出来的就不止一个点。这种方法,ARIMA这种传统统计学的方法是做不到的了,神经网络可以做到,因为神经网络可以接受一条序列作为y,这样去训练就可以得到多步预测模型了。

本次案例使用某城市的AQI数据,去预测未来一年365天的数据。来看看我怎么完成的。


数据介绍

没啥好介绍的,一般下载城市的数据都是这样的,我们只需要AQI这一列就行。

任务介绍:基于空气质量检测数据,采用人工神经网络对AQI进行回归预测。

  • (1)利用Python实现回归预测并得出2024年的预测结果。
  • (2)展示随迭代次数增加,不同激活函数下的损失函数的变化情况。

当然,需要本次演示案例的数据和所有代码文件的同学可以参考: AQI预测 


代码实现

导入包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus']=Falsefrom keras.models import Sequential
from keras.layers import LSTM, Dense,Flatten
from keras.callbacks import EarlyStopping
from sklearn.preprocessing import MinMaxScaler

读取数据,设置日期索引:

data=pd.read_excel('AQI数据.xlsx')#.set_index('日期')
data['日期']=pd.to_datetime(data['日期'])
data=data.set_index('日期')
data

数据跨度从2019-2023年,日度数据。

简单画个图看看

data.aqi.plot(figsize=(10,3))

很符合AQI的摸样,波动很大,参差不齐,还有一定的周期性。


数据准备

时间序列做神经网络预测,一般都需要进行三维化,即把数据变为(n,t,p)的形状,n是样本量,t是时间步长,p是特征数量。一般 的表格数据都是(n,p)的结构,时间序列要多一个时间t的维度。

数据构建X和y之前要归一化,神经网络很需要,不然模型会不收敛。

# 数据预处理
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_aqi = scaler.fit_transform(data['aqi'].values.reshape(-1, 1))# 创建LSTM需要的序列数据
def create_dataset(dataset, start_index, end_index, history_size, target_size):data = [] ; labels = []start_index = start_index + history_sizeif end_index is None:end_index = len(dataset) - target_sizefor i in range(start_index, end_index):indices = range(i-history_size, i)data.append(np.reshape(dataset[indices], (history_size, 1)))labels.append(dataset[i:i+target_size])return np.array(data), np.array(labels)# 用过去的700天数据来预测接下来的365天
past_history = 700
future_target = 365X_train, y_train = create_dataset(scaled_aqi, 0, None, past_history, future_target)
y_train=y_train.reshape(y_train.shape[0],y_train.shape[1])
X_train.shape, y_train.shape

我定义了一个转化时间序列构建X和y的函数,然后采用时间窗口为700,也就是t=700的时间步长,然后去预测未来365天的数据,也就是一年。

为什么是700,,,没有为什么,因为要预测365个点,我需要时间步长大一点,那就大概2倍的数据吧,我就选择了凑个整数700,当然699,701,710,720,730,都是可以的,可以去试试。

是不是时间步长越长越好?不一定,首先看你样本量,我数据只有1500多个点,我选择了700时间步长,其实就损失了700个样本了,可以看到我样本量只有486个,有点少。其次,时间步长过长会造成运行时间过长,你也不想体验等一次运行结果要等上一天的感觉吧。。。

当然大家可以更具自己的需要预测的时间长度,还有样本量来调整自己的时间步长t。


预测2024年数据(默认tanh激活函数)

这里构建的是最简单的神经网络MLP模型,一个小案例,就没使用LSTM,GRU,transform这种序列模型了。大家感兴趣可以自己改一下试试。

# 创建MLP模型
model = Sequential()
model.add(Flatten())
model.add(Dense(512))
model.add(Dense(128))
model.add(Dense(future_target))
model.compile(optimizer='adam', loss='mse')# 训练模型
early_stop = EarlyStopping(monitor='loss', patience=10)
history=model.fit(X_train, y_train, epochs=50, batch_size=32, callbacks=[early_stop], verbose=1)

训练了50轮,loss没怎么变了。

画图看看:

plt.figure(figsize=(7,3))
plt.plot(history.history['loss'], label=f'loss')
plt.legend()
plt.show()

基本收敛了,然后我们预测,预测的数据要逆归一化回来,然后加上预测的日期的索引。

# 进行预测
prediction = model.predict(X_train[-1].reshape(1, past_history, 1))
# 逆缩放预测结果
predicted_aqi = scaler.inverse_transform(prediction).flatten()
predicted_aqi.shape# 创建预测日期的范围
last_date = data.index[-1]
predicted_dates = pd.date_range(start=last_date, periods=future_target+1, closed='right')# 创建包含预测结果的DataFrame
predicted_df = pd.DataFrame({'日期': predicted_dates,'预测aqi': predicted_aqi})

画个图看看:

# 绘制预测和实际的AQI值
plt.figure(figsize=(12, 3),dpi=128)
plt.plot(data.index, data['aqi'], label='Actual AQI')
plt.plot(predicted_dates, predicted_aqi, label='Predicted AQI', linestyle='dashed')
plt.title('AQI Prediction')
plt.xlabel('Date')
plt.ylabel('AQI')
plt.legend()
plt.show()

后面橙色的虚线就是我预测的数据了。看这效果还不错的样子,波动性学到了,季节性也学到了。

由于目前还没有真实的2024年的AQI数据,也不知道效果好不好。。。也不知道别的LSTM之类的模型效果好不好。。所以没法计算误差去评价。


储存预测结果 

## 储存
predicted_df.to_excel('AQI预测结果.xlsx')

保存了,可以本地excel查看了。 


 不同损失函数

下面是一个其他任务的彩蛋吧,看看不同的激活函数对模型的训练过程是否有影响。

有兴趣的同学可以看看。

展示随迭代次数增加,不同激活函数下的损失函数的变化情况。

- (用了五种激活函数)['relu', 'tanh', 'sigmoid','elu','softplus']

定义和训练:

# Function to create and train LSTM model with different activation functions
def train_lstm_model(X_train, y_train, activation='relu', epochs=100, batch_size=32):model = Sequential()model.add(Flatten())model.add(Dense(512))model.add(Dense(128))model.add(Dense(future_target))model.compile(optimizer='adam', loss='mse')# Early stopping to prevent overfittingearly_stop = EarlyStopping(monitor='loss', patience=10, verbose=1)# Train the modelhistory = model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, verbose=0, callbacks=[early_stop])return model, history# Activations to try
activations = ['relu', 'tanh', 'sigmoid','elu','softplus']
# Dictionary to store models and histories
models = {}
histories = {}# Training models with different activation functions
for activation in activations:model, history = train_lstm_model(X_train, y_train, activation=activation)models[activation] = modelhistories[activation] = history.history['loss']

画图查看:

## 五种激活函数
plt.figure(figsize=(9, 3),dpi=128)
for activation in activations:plt.plot(histories[activation], label=f'Activation = {activation}')
plt.title('Training Loss with Different Activation Functions')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend()
plt.show()

五种激活函数差不多,区别不大。


创作不易,看官觉得写得还不错的话点个关注和赞吧,本人会持续更新python数据分析领域的代码文章~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/241177.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS 专题学习 P5 (Classic SA、S3)

文章目录 Classic Solutions Architecture无状态 Web 应用程序:WhatIsTheTime.com背景 & 目标架构演进Well-Architected 5 pillars 有状态的 Web 应用程序:MyClothes.com背景 & 目标架构演进总结 有状态的 Web 应用程序:MyWordPress.…

Android车载系统Car模块架构链路分析

一、模块主要成员 CarServiceHelperService SystemServer 中专门为 AAOS 设立的系统服务,用来管理车机的核心服务 CarService。该系统服务的具体实现在 CarServiceHelperServiceUpdatableImpl CarService Car模块核心服务APP,Android 13版本开始分为…

mysql新增用户密码控制局域网访问权限

方法一、通过navicat中sql语句新增 CREATE USER usernamelocalhost IDENTIFIED BY password; GRANT ALL PRIVILEGES ON *.* TO usernamelocalhost WITH GRANT OPTION; FLUSH PRIVILEGES;把其中的username和password改成自己的即可 如果将上面的localhost改成%,则这…

CentOS stream 9配置网卡

CentOS stream9的网卡和centos 7的配置路径:/etc/sysconfig/network-scripts/ifcfg-ens32不一样。 CentOS stream 9的网卡路径: /etc/NetworkManager/system-connections/ens32.nmconnection 方法一: [connection] idens32 uuid426b60a4-4…

day04_java中的运算符

运算符概述 概念:对常量或者变量进行操作的符号。用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表达式。 运算符按照其要求的操作数数目来分,可以有单目运算符(1 个操作数…

Docker 安装 PHP

Docker 安装 PHP 安装 PHP 镜像 方法一、docker pull php 查找 Docker Hub 上的 php 镜像: 可以通过 Sort by 查看其他版本的 php,默认是最新版本 php:latest。 此外,我们还可以用 docker search php 命令来查看可用版本: runoobrunoob:…

【Alibaba工具型技术系列】「EasyExcel技术专题」实战技术针对于项目中常用的Excel操作指南

这里写目录标题 EasyExcel教程Maven依赖 EasyExcel API分析介绍EasyExcel 注解通用参数ReadWorkbook(理解成excel对象)参数ReadSheet(就是excel的一个Sheet)参数注解参数通用参数 WriteWorkbook(理解成excel对象&#…

机器视觉系统在汽车车轮毂检测上的应用

将机器视觉用于轮毂检测,可以利用图像分析的方法来测量轮毂特征尺寸、判断轮毂形状,并获取其位置坐标等信息,从而能够辨识流水生产线上的各种款式和型号的汽车轮毂。 市面上对汽车车轮毂具体检测要求如下 : 1.为了分辨流水线上…

EasyX图形化学习(三)

1.帧率: 即每秒钟界面刷新次数,下面以60帧为例: 1.数据类型 clock_t: 用来保存时间的数据类型。 2.clock( ) 函数: 用于返回程序运行的时间,无需参数。 3.例子: 先定义所需帧率: const …

Flutter:跨平台移动应用开发的未来

Flutter:跨平台移动应用开发的未来 引言 Flutter的背景和概述 Flutter是由Google开发的一个开源UI工具包,用于构建漂亮、快速且高度可定制的移动应用程序。它于2017年首次发布,并迅速引起了开发者们的关注。Flutter采用了一种全新的方法来…

Android Traceview 定位卡顿问题

Traceview 是一个 Android 性能分析工具,用于时间性能分析,主要帮助开发者了解应用程序中各个方法的执行时间和调用关系。通过图形化界面查看应用程序的代码执行细节,包括每个方法的调用次数、方法调用的时间消耗、方法调用堆栈等信息。我们可…

Baichuan2百川模型部署的bug汇总

1.4bit的量化版本最好不要在Windows系统中运行,大概原因报错原因是bitsandbytes不支持window,bitsandbytes-windows目前仅支持8bit量化。 2. 报错原因是机器没有足够的内存和显存,offload_folder设置一个文件夹来保存那些离线加载到硬盘的权…

模具制造企业ERP系统有哪些?企业怎么选型适配的软件

模具的生产管理过程比较繁琐,涵盖接单报价、车间排期、班组负荷评估、库存盘点、材料采购、供应商选择、工艺流转、品质检验等诸多环节。 有些采用传统管理手段的模具制造企业存在各业务数据传递不畅、信息滞后、不能及时掌握订单和车间生产情况,难以对…

游戏《泰坦陨落2》msvcr120.dll丢失的多种解决方法分享

在Windows 11操作系统环境下,众多玩家在体验《泰坦陨落2》这款备受瞩目的射击游戏时,遭遇了一个令人困扰的技术问题:系统提示缺失msvcr120.dll文件。这一关键的动态链接库文件对于游戏的正常运行至关重要,它的缺失直接导致了《泰坦…

仓储的未来:为叉车配备智能设备

近年来,数字化和自动化极大地重塑了仓储行业。叉车是仓库的主力,正在配备智能设备以简化操作。 点击下载Dynamsoft最新版https://www.evget.com/product/3691/download 智能叉车的序列化艺术 序列化是为每个商品或托盘分配唯一标识符(通常采…

shiro实战详解(2)

shiro实战详解(2) 03 Shiro入门1.身份认证1.1基本流程1.2案例 2.Realm2.1Realm接口2.2认证案例2.3认证授权案例 3.编码、散列算法3.1编码与解码3.2散列算法案例 4.身份授权5.Shiro默认过滤器5.1认证相关5.2授权相关 03 Shiro入门 1.身份认证 1.1基本流…

关于 mysql数据库应用程序登录卡顿无响应崩溃 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/135682663 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

易基因:cfDNA甲基化在器官和组织损伤检测中的强大力量

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 检测器官和组织损伤对于早期诊断、治疗决策和监测疾病进展至关重要。由于DNA甲基化模式可以响应组织损伤而改变,甲基化检测提供了一种有前途的方法,在早筛早诊、疾…

HarmonyOS—开发环境诊断的功能

为了大家开发应用/服务的良好体验,DevEco Studio提供了开发环境诊断的功能,帮助大家识别开发环境是否完备。可以在欢迎界面单击Help > Diagnose Development Environment进行诊断。如果已经打开了工程开发界面,也可以在菜单栏单击Help >…

域环境权限提升

Windows系统配置错误 在Windows系统中,攻击者通常会通过系统内核溢出漏来提权,但是如果碰到无法通过系统内核溢出漏洞法国提取所在服务器权限的情况,就会系统中的配置错误来提权。Windows系统中常见哦欸之错误包括管理员凭证配置错误&#x…