MYGMY 2022-02-22 17:30 采纳率: 0%
浏览 315
已结题

lstm训练好的模型如何在另一个文件中调用预测

lstm训练好的模型希望能在另一个文件中调用预测,并实现

1.对给出数据预测其下一天的值
2.能够循环预测,将给出的值与假设的其他属性值一起送入模型中,例如预测十次,意味着预测出不存在的十个值

代码来自 https://blog.csdn.net/lenglingling/article/details/106409067?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&utm_relevant_index=5

代码最开始将数据标准化,但我不知道如何在新的文件中数据怎么标准化,他的标准化涉及到了训练数据,所以不知道如何预测

img

img

不知道怎么在另一个文件调用模型对另一个csv文件预测,且原代码为24预测2,我改为了5预测1,但他在结尾处依旧预测2天,不知道哪里没改到
import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import LSTM
from matplotlib import gridspec
from sklearn import metrics
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
from sklearn.preprocessing import StandardScaler, MinMaxScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import r2_score, mean_squared_error
import datetime
from math import sqrt

data = pd.read_csv('data_set/air_pollution_new_预测1.csv')
times=data['date'].tolist()
'''
构造数据集
1.明确项目目标:使用前1天24小时内PM2.5的相关数据,对第二天两小时内PM2.5进行预测分析
2.确定影响因素,即X:pm2.5、DEWP、TEMP、PRES、cbwd、Iws、Is和Ir共8个指标;目标变量:第二天2小时内的pm2.5
3.明确处理后的数据shape,以一条样本为例:其特征变量shape为:(1,24,8),目标变量shape为:(1,2)
4.原始数据有43824个样本,共43824/24=1826天,那么处理后的样本量为(43824/24)-1=1825个样本。故处理后的数据shape:X的shape为(1825,24,8),Y的shape为(1825,2)
5.注意:特征X中的pm2.5数据为前1天的24小时PM2.5浓度,而目标变量是第二天0时和1时的PM2.5浓度
'''
X_data = data[['orangenumber','greenrate','bluepressure']]  # 提取特征数据
Y_data = data[['orangenumber']]  # 提取pm2.5数据
X = np.zeros((X_data.shape[0],#- 1// 5
             5,
              X_data.shape[-1]))
Y = np.zeros((Y_data.shape[0],#// 5 - 1
              1))
#print(X.shape)
#print(Y.shape)
rows = range(0, X_data.shape[0] - 2, 1)#- 5, 5
for i, row in enumerate(rows):
    #print(i)
    X[i, :, :] = X_data.iloc[row : row + 1]
    Y[i, :] = [Y_data.iloc[row + 1]]#,  Y_data.iloc[row + 1 + 1]
print(X.shape)
print(Y.shape)
# 这里将214数据作为训练集,20%数据作为测试集,则训练集有1460个样本,测试集有365个样本
n=214#X.shape[0] * 0.6
X_train = X[:int(n)]
Y_train = Y[:int(n)]
times=times[int(n)+1:-1:]
print(times)
X_val = X[int(n)::]
Y_val = Y[int(n)::]

X_mean = X_train.mean(axis=0)
X_std = X_train.std(axis=0)
Y_mean = Y_train.mean(axis=0)
Y_std = Y_train.std(axis=0)

X_train_norm = (X_train - X_mean) / X_std
Y_train_norm = (Y_train - Y_mean) / Y_std
X_val_norm = (X_val - X_mean) / X_std
Y_val_norm = (Y_val - Y_mean) / Y_std
print(X_train_norm.shape[1])
print(X_train_norm.shape[-1])
# 使用3层LSTM,输出层为2输出的Dense层
model = Sequential()
model.add(LSTM(50,
               input_shape=(X_train_norm.shape[1], X_train_norm.shape[-1]),
               return_sequences=True))
model.add(Dropout(0.1))  # 防止过拟合
model.add(LSTM(50, return_sequences=True))
model.add(Dropout(0.1))
model.add(LSTM(50))
model.add(Dropout(0.1))

model.add(Dense(1))

model.compile(loss='mse',
              optimizer='rmsprop')
model.summary()

history = model.fit(X_train_norm, Y_train_norm,
                    epochs=500,
                    batch_size=20,
                    validation_data=(X_val_norm, Y_val_norm))

model.save('analysis.model')
loss = history.history['loss']
val_loss = history.history['val_loss']

plt.plot(range(len(loss)), loss, 'r-', label='训练集损失')
plt.plot(range(len(loss)), val_loss, 'b-', label='测试集损失')
plt.legend(loc='best')
plt.show();
model_pred = model.predict(X_val_norm)
val_pred = model_pred * Y_std + Y_mean  # 别忘了,数据进行了标准化处理,因此预测值需要处理,再计算R方

# 计算R2
R_2_0 = metrics.r2_score(Y_val[:, 0], val_pred[:, 0])  # 计算0时预测的R方
#R_2_1 = metrics.r2_score(Y_val[:, 1], val_pred[:, 1])  # 计算1时预测的R方

# 实际值与预测值对比图
fig = plt.subplots(figsize=(12, 5))
#gs = gridspec.GridSpec(1, 1, height_ratios=[1, 1], hspace=0)
ax = plt.gca()
#去掉边框
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
#移位置 设为原点相交
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
#ax1 = plt.subplot(gs[0])

# 分时间区间,保证最后一位纳入标签
ticks=list(range(0,len(times),2))
if ticks[-1]!=len(times)-1:
    ticks.append(len(times)-1)
labels=[times[i] for i in ticks]
ax.set(xlim=[0,len(times)-1])
ax.set_xticks(ticks)
ax.set_xticklabels(labels, rotation=45, horizontalalignment='right')
ax.tick_params(labelsize=8)

# 设置图形的显示风格
plt.style.use('ggplot')
ax.set_xlabel('时间',fontsize =10)
ax.set_ylabel('数量',fontsize =10)
plt.savefig('./1.png',format='png', dpi=300)
plt.plot(range(Y_val.shape[0]), Y_val[:, 0], 'r-', label='实际值')
plt.plot(range(Y_val.shape[0]), np.trunc(val_pred[:, 0]), 'b-', label='预测值')
plt.legend(loc='best')

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 3月2日
    • 创建了问题 2月22日

    悬赏问题

    • ¥15 非科班怎么跑代码?如何导数据和调参
    • ¥15 福州市的全人群死因监测点死亡原因报表
    • ¥15 打开powerpont询问是否安装officeplus不小心点了不安装以后再也不提示是否安装了
    • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
    • ¥15 系统2008r2 装机配置推荐一下
    • ¥500 服务器搭建cisco AnyConnect vpn
    • ¥15 悬赏Python-playwright部署在centos7上
    • ¥15 psoc creator软件有没有人能远程安装啊
    • ¥15 快速扫描算法求解Eikonal方程咨询
    • ¥15 校内二手商品转让网站