pytorch发布时间,
本文主要介绍PyTorch构建人工神经网络实现时间序列风速预测。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。
00-1010数据集特征构造的数据处理1。数据预处理2。数据集构造人工神经网络模型1。模特培训2。模型预测和性能
目录
数据集是巴塞罗那某段时间的气象数据,包括温度、湿度、风速。本文将建立一个简单的结构来预测风速。
数据集
对于风速的预测,除了历史风速数据外,还应充分考虑其他气象因素的影响。所以我们根据前24个时刻的风速和下一个时刻剩余的气象数据来预测下一个时刻的风速。
特征构造
数据处理
在数据预处理阶段,将部分列上的文本数据转换为数值数据,并对原始数据进行归一化处理。文本数据如下:
转换后,上述类别被赋予不同的数值,如“天空晴朗”为0,“云少”为1。
定义load_data():
全局最大值、最小值
df=pd.read_csv(巴塞罗那/巴塞罗那. csv )
df . drop _ duplicates(subset=[df . columns[0]],inplace=True)
#天气预报
listType=df[weather_main]。唯一()
df.fillna(method=ffill ,inplace=True)
dic=dict.fromkeys(列表类型)
对于范围内的I(len(listType)):
dic[listType[i]]=i
df[天气_主要]=df[天气_主要]。地图(驾驶员信息中心)
#天气_描述
list type=df[ weather _ description ]。唯一()
dic=dict.fromkeys(列表类型)
对于范围内的I(len(listType)):
dic[listType[i]]=i
df[天气描述]=df[天气描述]。地图(驾驶员信息中心)
#天气图标
listType=df[weather_icon]。唯一()
dic=dict.fromkeys(列表类型)
对于范围内的I(len(listType)):
dic[listType[i]]=i
df[天气图标]=df[天气图标]。地图(驾驶员信息中心)
#打印(df)
columns=df.columns
Max=np.max(df[风速]) #归一化
Min=np.min(df[风速])
对于(2,17):范围内的I
column=columns[i]
if column==wind_speed:
继续
df[列]=df[列]。astype(float64 )
if(df[df[column]==0)==len(df): #全0
继续
MX=NP . max(df[列])
Mn=NP . min(df[列])
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(fepoch: {i:3} loss: {single_loss.item():10.8f})
print(fepoch: {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上的表现如下表所示:
以上就是PyTorch搭建ANN实现时间序列风速预测的详细内容,更多关于ANN时序风速预测的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。