# -*- coding: utf-8 -*-
# 导入库pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.metrics import mean_squared_error # 评价指标
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM, GRU
from keras.layers import Dense,LSTM,Bidirectional
from keras import optimizers
import keras
import tensorflow as tf
# mse rmse mae rmape
# adam sgd
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
import warnings
warnings.filterwarnings("ignore") # 忽略一些警告 不影响运行
# from data_read import data_process
from vmd_data_read import data_process
train_x,train_y=data_process()
# 序列长度
int_sequence_len = train_x.shape[1]
# 每个序列的长度
int_a = train_x.shape[2]
# 输出几个元素 几步:
out_len = train_y.shape[1]
# 划分验证集和测试集
x_train, x_test, y_train, y_test = train_test_split(np.array(train_x), np.array(train_y), test_size=0.2, random_state=1)
print(x_train.shape)
print(len(x_train), len(x_test)) # 1243 311
x_train = x_train.reshape(len(x_train),int_sequence_len, int_a) # 三维度数据 全部数据长度 序列长度 每个序列维度
y_train = y_train.reshape(len(x_train),out_len)
print(x_train.shape)
print(y_train.shape)
x_test = x_test.reshape(len(x_test),int_sequence_len, int_a)
y_test = y_test.reshape(len(x_test),out_len)
print(x_test.shape)
print(y_test.shape)
model1=Sequential()
lstm=LSTM(200, activation='relu', input_shape=(int_sequence_len, int_a)) #返回最后一个节点的输出
model1.add(Bidirectional(lstm)) #双向LSTM
model1.add(Dense(512,activation='relu'))
model1.add(Dense(128,activation='relu'))
model1.add(Dense(out_len))
op = optimizers.adam_v2.Adam(lr=0.005)
model1.compile(loss='mean_absolute_error', optimizer=op) # 回归损失函数和优化器 Adam SGD
# model1 = create_model_1()
# model1.summary()
history=model1.fit(x_train, y_train, validation_data=(x_train, y_train), epochs=50, batch_size=256, shuffle=True)
# 训练世代 batch
model1.save_weights('lstmmoxing') # 模型保存
import matplotlib.pyplot as plt
training_loss = history.history['loss']
test_loss = history.history['val_loss']
# 创建迭代数量
epoch_count = range(1, len(training_loss) + 1)
# 可视化损失历史
plt.plot(epoch_count, training_loss, 'r--')
plt.plot(epoch_count, test_loss, 'b-')
plt.legend(['Training Loss', 'Test Loss'])
plt.title("train loss and test loss")
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()
from sklearn.metrics import mean_squared_error # 均方误差
from sklearn.metrics import mean_absolute_error # 平方绝对误差
from sklearn.metrics import r2_score # R square
# 调用
# 引用上边的模型实例
# model_jiazai_1 = create_model_1()
# 加载保存好的模型
# model_jiazai_1.load_weights('lstmmoxing')
y1_pred_lstm = model1.predict(x_test)
y_true=[]
y_pred=[]
for i in range(len(y1_pred_lstm)):
print("真实:", y_test[i])
y_true.extend(y_test[i])
print("预测:", y1_pred_lstm[i])
y_pred.extend(y1_pred_lstm[i])
print("-----------------------")
from metra import metric
mae, mse, rmse, mape, mspe,r2=metric(np.array(y_pred),np.array(y_true))
print('mae, mse, rmse, mape, mspe,r2')
print(mae, mse, rmse, mape, mspe,r2)
y_pred=y_pred/max(y_pred)
y_true=y_true/max(y_true)
# 所有画图
len_ = [i for i in range(len(y_true))]
plt.xlabel('标签', fontsize=8)
plt.ylabel('均值', fontsize=8)
plt.plot(len_, y_true, label='y_true', color="blue")
plt.plot(len_, y_pred, label='y_pred', color="yellow")
plt.title("预测走势图")
plt.legend()
plt.show()
plt.clf()
# # 输出到excle
# name = ['真实值', '预测值']
# test = pd.DataFrame(columns=name, data=result)
# test.to_excel('result_天气.xlsx')
# # 输出 。。。excle表
07-20
1264
11-02