PyTorch搭建ANN实现时间序列风速预测
作者:Cyril_KI 发布时间:2022-11-28 23:38:28
标签:PyTorch,ANN,时序预测,风速预测
数据集
数据集为Barcelona某段时间内的气象数据,其中包括温度、湿度以及风速等。本文将简单搭建来对风速进行预测。
特征构造
对于风速的预测,除了考虑历史风速数据外,还应该充分考虑其余气象因素的影响。因此,我们根据前24个时刻的风速+下一时刻的其余气象数据来预测下一时刻的风速。
数据处理
1.数据预处理
数据预处理阶段,主要将某些列上的文本数据转为数值型数据,同时对原始数据进行归一化处理。文本数据如下所示:
经过转换后,上述各个类别分别被赋予不同的数值,比如"sky is clear"为0,"few clouds"为1。
def load_data():
global Max, Min
df = pd.read_csv('Barcelona/Barcelona.csv')
df.drop_duplicates(subset=[df.columns[0]], inplace=True)
# weather_main
listType = df['weather_main'].unique()
df.fillna(method='ffill', inplace=True)
dic = dict.fromkeys(listType)
for i in range(len(listType)):
dic[listType[i]] = i
df['weather_main'] = df['weather_main'].map(dic)
# weather_description
listType = df['weather_description'].unique()
dic = dict.fromkeys(listType)
for i in range(len(listType)):
dic[listType[i]] = i
df['weather_description'] = df['weather_description'].map(dic)
# weather_icon
listType = df['weather_icon'].unique()
dic = dict.fromkeys(listType)
for i in range(len(listType)):
dic[listType[i]] = i
df['weather_icon'] = df['weather_icon'].map(dic)
# print(df)
columns = df.columns
Max = np.max(df['wind_speed']) # 归一化
Min = np.min(df['wind_speed'])
for i in range(2, 17):
column = columns[i]
if column == 'wind_speed':
continue
df[column] = df[column].astype('float64')
if len(df[df[column] == 0]) == len(df): # 全0
continue
mx = np.max(df[column])
mn = np.min(df[column])
df[column] = (df[column] - mn) / (mx - mn)
# print(df.isna().sum())
return df
2.数据集构造
利用当前时刻的气象数据和前24个小时的风速数据来预测当前时刻的风速:
def nn_seq():
"""
:param flag:
:param data: 待处理的数据
:return: X和Y两个数据集,X=[当前时刻的year,month, hour, day, lowtemp, hightemp, 前一天当前时刻的负荷以及前23小时负荷]
Y=[当前时刻负荷]
"""
print('处理数据:')
data = load_data()
speed = data['wind_speed']
speed = speed.tolist()
speed = torch.FloatTensor(speed).view(-1)
data = data.values.tolist()
seq = []
for i in range(len(data) - 30):
train_seq = []
train_label = []
for j in range(i, i + 24):
train_seq.append(speed[j])
# 添加温度、湿度、气压等信息
for c in range(2, 7):
train_seq.append(data[i + 24][c])
for c in range(8, 17):
train_seq.append(data[i + 24][c])
train_label.append(speed[i + 24])
train_seq = torch.FloatTensor(train_seq).view(-1)
train_label = torch.FloatTensor(train_label).view(-1)
seq.append((train_seq, train_label))
# print(seq[:5])
Dtr = seq[0:int(len(seq) * 0.5)]
Den = seq[int(len(seq) * 0.50):int(len(seq) * 0.75)]
Dte = seq[int(len(seq) * 0.75):len(seq)]
return Dtr, Den, Dte
任意输出其中一条数据:
(tensor([1.0000e+00, 1.0000e+00, 2.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00,
1.0000e+00, 1.0000e+00, 0.0000e+00, 1.0000e+00, 5.0000e+00, 0.0000e+00,
2.0000e+00, 0.0000e+00, 0.0000e+00, 5.0000e+00, 0.0000e+00, 2.0000e+00,
2.0000e+00, 5.0000e+00, 6.0000e+00, 5.0000e+00, 5.0000e+00, 5.0000e+00,
5.3102e-01, 5.5466e-01, 4.6885e-01, 1.0066e-03, 5.8000e-01, 6.6667e-01,
0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 9.9338e-01, 0.0000e+00,
0.0000e+00, 0.0000e+00]), tensor([5.]))
数据被划分为三部分:Dtr、Den以及Dte,Dtr用作训练集,Dte用作测试集。
ANN模型
1.模型训练
ANN模型搭建如下:
def ANN():
Dtr, Den, Dte = nn_seq()
my_nn = torch.nn.Sequential(
torch.nn.Linear(38, 64),
torch.nn.ReLU(),
torch.nn.Linear(64, 128),
torch.nn.ReLU(),
torch.nn.Linear(128, 1),
)
model = my_nn.to(device)
loss_function = nn.MSELoss().to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
train_inout_seq = Dtr
# 训练
epochs = 50
for i in range(epochs):
print('当前', i)
for seq, labels in train_inout_seq:
seq = seq.to(device)
labels = labels.to(device)
y_pred = model(seq)
single_loss = loss_function(y_pred, labels)
optimizer.zero_grad()
single_loss.backward()
optimizer.step()
# if i % 2 == 1:
print(f'epoch: {i:3} loss: {single_loss.item():10.8f}')
print(f'epoch: {i:3} loss: {single_loss.item():10.10f}')
state = {'model': model.state_dict(), 'optimizer': optimizer.state_dict(), 'epoch': epochs}
torch.save(state, 'Barcelona' + ANN_PATH)
可以看到,模型定义的代码段为:
my_nn = torch.nn.Sequential(
torch.nn.Linear(38, 64),
torch.nn.ReLU(),
torch.nn.Linear(64, 128),
torch.nn.ReLU(),
torch.nn.Linear(128, 1),
)
第一层全连接层输入维度为38(前24小时风速+14种气象数据),输出维度为64;第二层输入为64,输出128;第三层输入为128,输出为1。
2.模型预测及表现
def ANN_predict(ann, test_seq):
pred = []
for seq, labels in test_seq:
seq = seq.to(device)
with torch.no_grad():
pred.append(ann(seq).item())
pred = np.array([pred])
return pred
测试:
def test():
Dtr, Den, Dte = nn_seq()
ann = torch.nn.Sequential(
torch.nn.Linear(38, 64),
torch.nn.ReLU(),
torch.nn.Linear(64, 128),
torch.nn.ReLU(),
torch.nn.Linear(128, 1),
)
ann = ann.to(device)
ann.load_state_dict(torch.load('Barcelona' + ANN_PATH)['model'])
ann.eval()
pred = ANN_predict(ann, Dte)
print(mean_absolute_error(te_y, pred2.T), np.sqrt(mean_squared_error(te_y, pred2.T)))
ANN在Dte上的表现如下表所示:
MAE | RMSE |
---|---|
1.04 | 1.46 |
来源:https://blog.csdn.net/Cyril_KI/article/details/122280549


猜你喜欢
- 安装环境:centos 5.4mysql版本:mysql 5.1.xx 采用rpm直接安装所需软件: xtrabackup 1.2.22 采
- 本文实例讲述了Python爬虫框架Scrapy常用命令。分享给大家供大家参考,具体如下:在Scrapy中,工具命令分为两种,一种为全局命令,
- GO 语言的 for…range 能做什么呢?for…range 如何使用 ?for…range 的返回
- 这篇文章主要介绍了调用其他python脚本文件里面的类和方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 升级背景:为了解决mysql低版本的漏洞,从mysql5.5升级到了8.0.11版本,再次升级到了8.0.17版本(从版本是2019.7.2
- 本文主要介绍Python3.6及TensorFlow的安装和配置流程。一、Python官网下载自己电脑和系统对应的Python安装包。网址:
- 四则运算表达式求值思路说明使用双栈来实现——存放数值的栈 nums 与存放运算符
- 提起数据库,第一个想到的公司,一般都会是Oracle。该公司成立于1977年,最初是一家专门开发数据库的公司。Oracle在数据库领域一直处
- import shutil高级的文件,文件夹,压缩包的处理模块,也主要用于文件的拷贝shutil.copyfileobj(fsrc,fdst
- 与前面一样我们会用fso来对文件或文件夹进行创建与删除操作了,其实fso有强大的功能但非常危险的哦,下面我们不来看看删除实例吧,在这些例子,
- 什么是formset我们知道forms组件是用来做表单验证,更准确一点说,forms组件是用来做数据库表中一行记录的验证。有forms组件不
- skimage包的exposure模块图像亮度与对比度的调整,是放在skimage包的exposure模块里面1、gamma调整对原图像的像
- 一、if语句if 语句让你能够检查程序的当前状态,并据此采取相应的措施。if语句可应用于列表,以另一种方式处理列表中的大多数元素,以及特定值
- 在项目中操作数据库的三大步骤安装操作 MySQL 数据库的第三方模块(mysql)通过 mysql 模块连接到 MySQL 数据库通过 my
- 没怎么用过这个新特性,其实也不算新啦,试试吧,现在静态类的继承很方便了<?phpclass A { protected static
- 需求分析根据原始数据,计算出累计和、回撤、连续正确、连续错误、连续正确值与连续错误值6项数据,其中原始数据大于等于0认定为正确,原始数据小于
- 关于NaN值-在能够使用大型数据集训练学习算法之前,我们通常需要先清理数据, 也就是说,我们需要通过某个方法检测并更正数据中的错误。 - 任
- 本文介绍在Python环境中,实现随机森林(Random Forest,RF)回归与各自变量重要性分析与排序的过程。其中,关于基于MATLA
- 需要先装pywin32,windows下调用winapi的接口## _*_ coding:UTF-8 _*___author__ =
- 记录了CentOS7 安装python3.7.0的详细过程,供大家参考,具体内容如下1.下载及解压python3.7的安装包可从官网下载上传