作者: 明天依旧可好
QQ交流群: 807041986
原文链接: https://mtyjkh.blog.csdn.net/article/details/115612319
深度学习系列:深度学习


我的环境: win10、jupyter notebook、tensorflow2

0.导入相关包设置相关参数

import pandas            as pd
import matplotlib.pyplot as plt
import tensorflow        as tf
import numpy             as npfrom numpy                 import array
from sklearn               import metrics
from sklearn.preprocessing import MinMaxScaler
from keras.models          import Sequential
from keras.layers          import Dense,LSTM,Bidirectional# 数据调节
from scipy.ndimage         import gaussian_filter1d
from scipy.signal          import medfilt# 确保结果可以重现
from numpy.random          import seed
seed(1)
tf.random.set_seed(1)# 设置相关参数
n_timestamp  = 24    # 时间戳
train_days   = 3500  # 用于训练的天数
testing_days = 1500  # 用于预测的天数
n_epochs     = 25    # 训练轮数
filter_on    = 1     # 激活数据过滤器
# ====================================
#      选择模型:
#            1: 单层 LSTM
#            2: 多层 LSTM
#            3: 双向 LSTM
# ====================================
model_type = 1

1.读取数据

原始数据是以小时为单位的。

url = "./data/AEP_hourly.csv"
dataset = pd.read_csv(url)
dataset.head()

2.将数据整合成以天为单位

以空格为切割符,将Datetime字段后的具体时间点切割掉

dataset_new = dataset
for index, row in dataset.iterrows():dataset_new["Datetime"][index] = row["Datetime"].split(" ")[0]dataset_new.head()

经过上面的切割后每一天有24份数据(分别对应24个时辰),接下来合并这24份数据。

dataset_new_2 = dataset_new.groupby(by='Datetime')['AEP_MW'].sum()*0.00001dict_dataset = {'Datetime':dataset_new_2.index,'AEP_MW':dataset_new_2.values}
dataset_new_3 = pd.DataFrame(dict_dataset)
dataset_new_3.head()

3.数据预处理

采用高斯过滤中值过滤,关于中值过滤的相关问题,可以参考我这篇文章【中值滤波】。

dataset = dataset_new_3if filter_on == 1:  # 数据集过滤dataset['AEP_MW'] = medfilt(dataset['AEP_MW'], 3)              # 中值过滤dataset['AEP_MW'] = gaussian_filter1d(dataset['AEP_MW'], 1.2)  # 高斯过滤dataset

4.将数据拆分

# 设置训练和测试数据集
train_set    = dataset[0:train_days].reset_index(drop=True)
test_set     = dataset[train_days: train_days+testing_days].reset_index(drop=True)
training_set = train_set.iloc[:, 1:2].values
testing_set  = test_set.iloc[:, 1:2].values# 将数据标准化,范围是0到1
sc = MinMaxScaler(feature_range=(0, 1))
training_set_scaled = sc.fit_transform(training_set)
testing_set_scaled  = sc.fit_transform(testing_set)

5.时间戳函数

# 取前 n_timestamp 天的数据为 X;n_timestamp+1天数据为 Y。
def data_split(sequence, n_timestamp):X = []y = []for i in range(len(sequence)):end_ix = i + n_timestampif end_ix > len(sequence)-1:breakseq_x, seq_y = sequence[i:end_ix], sequence[end_ix]X.append(seq_x)y.append(seq_y)return array(X), array(y)X_train, y_train = data_split(training_set_scaled, n_timestamp)
X_train          = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test, y_test   = data_split(testing_set_scaled, n_timestamp)
X_test           = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)

6.模型构建

# 使用 Keras建构 LSTM模型
if model_type == 1:# 单层 LSTMmodel = Sequential()model.add(LSTM(units=50, activation='relu',input_shape=(X_train.shape[1], 1)))model.add(Dense(units=1))
if model_type == 2:# 多层 LSTMmodel = Sequential()model.add(LSTM(units=50, activation='relu', return_sequences=True,input_shape=(X_train.shape[1], 1)))model.add(LSTM(units=50, activation='relu'))model.add(Dense(1))
if model_type == 3:# 双向 LSTMmodel = Sequential()model.add(Bidirectional(LSTM(50, activation='relu'),input_shape=(X_train.shape[1], 1)))model.add(Dense(1))model.summary() # 输出模型结构

7.模型训练

# 模型训练,batch_size越大越精准,训练消耗越大
model.compile(optimizer='adam', loss='mean_squared_error')
history = model.fit(X_train, y_train, epochs=n_epochs, batch_size=32)
loss    = history.history['loss']
epochs  = range(len(loss))# 得到测试集数据集的预测值
y_predicted = model.predict(X_test)# 将数据还原
y_predicted_descaled = sc.inverse_transform(y_predicted)
y_train_descaled     = sc.inverse_transform(y_train)
y_test_descaled      = sc.inverse_transform(y_test)
y_pred               = y_predicted.ravel()           # 将多维数组转换为一维数组
y_pred               = [round(i, 2) for i in y_pred] # 保留两位小数
y_tested             = y_test.ravel()                # 将多维数组转换为一维数组

8.可视化结果

# 进行模型预测
y_predicted = model.predict(X_test)# 显示预测结果
plt.figure(figsize=(8, 7))plt.subplot(3, 2, 3)
plt.plot(y_test_descaled, color='black', linewidth=1, label='True value')
plt.plot(y_predicted_descaled, color='red',  linewidth=1, label='Predicted')
plt.legend(frameon=False)
plt.ylabel("AEP_MW")
plt.xlabel("Day")
plt.title("Predicted data (n days)")plt.subplot(3, 2, 4)
plt.plot(y_test_descaled[:60], color='black', linewidth=1, label='True value')
plt.plot(y_predicted_descaled[:60], color='red', label='Predicted')
plt.legend(frameon=False)
plt.ylabel("AEP_MW")
plt.xlabel("Day")
plt.title("Predicted data (first 60 days)")plt.subplot(3, 3, 7)
plt.plot(epochs, loss, color='black')
plt.ylabel("Loss")
plt.xlabel("Epoch")
plt.title("Training curve")plt.subplot(3, 3, 8)
plt.plot(y_test_descaled-y_predicted_descaled, color='black')
plt.ylabel("Residual")
plt.xlabel("Day")
plt.title("Residual plot")plt.subplot(3, 3, 9)
plt.scatter(y_predicted_descaled, y_test_descaled, s=2, color='black')
plt.ylabel("Y true")
plt.xlabel("Y predicted")
plt.title("Scatter plot")plt.subplots_adjust(hspace=0.5, wspace=0.3)
plt.show()# 自己定义 MAPE 函数
def mape(y_true, y_pred):return np.mean(np.abs((y_pred - y_true) / y_true)) * 100MSE  = metrics.mean_squared_error(y_test_descaled, y_predicted_descaled)      # MSE均方误差
RMSE = metrics.mean_squared_error(y_test_descaled, y_predicted_descaled)**0.5
MAE  = metrics.mean_absolute_error(y_test_descaled, y_predicted_descaled)     # MAE平方绝对误差
MAPE = mape(y_test_descaled, y_predicted_descaled)
r2   = metrics.r2_score(y_test_descaled, y_predicted_descaled)                  # 决定系数(拟合优度)接近1越好print("MSE  = " + str(round(MSE, 5)))
print("RMSE = " + str(round(RMSE, 5)))
print("MAE  = " + str(round(MAE, 5)))
print("MAPE = " + str(round(MAPE, 5)))
print("R2   = " + str(round(r2, 5)))


代码和数据传送门:https://download.csdn.net/download/qq_38251616/16651321

时序数据-LSTM模型-实现用电量预测相关推荐

  1. pandas基于时序数据计算模型预测推理需要的统计数据(累计时间、长度变化、变化率、方差、均值、最大、最小等):范围内的统计量、变化率、获得数据集最后的几条数据的统计量、变化率、获得范围内的统计量

    pandas基于时序数据计算模型预测推理需要的统计数据(累计时间.长度变化.变化率.方差.均值.最大.最小等):范围内的统计量.变化率.获得数据集最后的几条数据的统计量.变化率.获得范围内的统计量 目 ...

  2. pandas基于时序数据计算模型预测推理需要的统计数据(累计时间、长度变化、变化率、方差、均值、最大、最小等):数据持续的时间(分钟)、获得某一节点之后的数据总变化量、获得范围内的统计量

    pandas基于时序数据计算模型预测推理需要的统计数据(累计时间.长度变化.变化率.方差.均值.最大.最小等):数据持续的时间(分钟).获得某一节点之后的数据总变化量.获得范围内的统计量 目录

  3. python数据预测代码_手把手教你用Python玩转时序数据,从采样、预测到聚类丨代码...

    原标题:手把手教你用Python玩转时序数据,从采样.预测到聚类丨代码 原作 Arnaud Zinflou 郭一璞 编译 时序数据,也就是时间序列的数据. 像股票价格.每日天气.体重变化这一类,都是时 ...

  4. 手把手教你用Python玩转时序数据,从采样、预测到聚类

    本文经AI新媒体量子位(公众号 ID: QbitAI)授权转载,转载请联系出处 本文约1800字,建议阅读5分钟 如果你有朝一日碰到了时序数据,该怎么用Python搞定它呢? 时序数据,也就是时间序列 ...

  5. Python中利用LSTM模型进行时间序列预测分析

    时间序列模型 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征.这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺 ...

  6. python用支持向量机回归(SVR)模型分析用电量预测电力消费

    最近我们被客户要求撰写关于支持向量机回归的研究报告,包括一些图形和统计输出. 本文描述了训练支持向量回归模型的过程,该模型用于预测基于几个天气变量.一天中的某个小时.以及这一天是周末/假日/在家工作日 ...

  7. MATLAB-基于长短期记忆网络(LSTM)的SP500的股票价格预测 股价预测 matlab实战 数据分析 数据可视化 时序数据预测 变种RNN 股票预测

    MATLAB-基于长短期记忆网络(LSTM)的SP500的股票价格预测 股价预测 matlab实战 数据分析 数据可视化 时序数据预测 变种RNN 股票预测 摘要 近些年,随着计算机技术的不断发展,神 ...

  8. bagging和时间序列预测_时间序列的LSTM模型预测——基于Keras

    一.问题背景     现实生活中,在一系列时间点上观测数据是司空见惯的活动,在农业.商业.气象军事和医疗等研究领域都包含大量的时间序列数据.时间序列的预测指的是基于序列的历史数据,以及可能对结果产生影 ...

  9. 如何判断LSTM模型中的过拟合和欠拟合 By 机器之心2017年10月02日 11:09 判断长短期记忆模型在序列预测问题上是否表现良好可能是一件困难的事。也许你会得到一个不错的模型技术得分,但了解

    判断长短期记忆模型在序列预测问题上是否表现良好可能是一件困难的事.也许你会得到一个不错的模型技术得分,但了解模型是较好的拟合,还是欠拟合/过拟合,以及模型在不同的配置条件下能否实现更好的性能是非常重要 ...

最新文章

  1. 存储过程处理错误数据
  2. docker监控系统
  3. 安卓进阶系列-06数据库框架(LitePal)的使用
  4. linux学习-简单命令介绍及安装VMware Tools
  5. opengl es3.0游戏开发学习笔记1-绘制旋转的三角形
  6. FCM算法的matlab程序
  7. paypal ipn java_javashop中paypal使用指南
  8. QQ空间迁移_【深度解锁数据恢复】
  9. 2021年美国联邦法定假日表
  10. win10常见问题-任务栏消失
  11. Vue指令之列表渲染
  12. Web安全-网页开发者工具
  13. 线上测评图形题技巧二
  14. jquery 绘图工具 flot 使用
  15. F5(负载均衡)使用配置文档
  16. 【防火墙接口启用DHCP】
  17. java哨片红盒 绿盒的区别_海淘维骨力怎么区分红盒,绿盒,蓝盒版本之间的区别...
  18. 绝了!深圳java工资一般多少
  19. 单片机移频防啸叫_麦克风的啸叫怎么用移频电路进行啸叫抑制?
  20. nuscenes数据集关于毫米波雷达的操作

热门文章

  1. 我的Windows Vista™也装好了...
  2. lwip协议栈中超时定时器实现原理
  3. Flutter是什么
  4. opencv3学习总结1
  5. 地图下面的标尺是什么意思_房屋产权70年产权吧,下面的使用年限是什么意思?...
  6. php artisan 更新,Laravel 5:PHP Artisan迁移:刷新
  7. python递归函数讲解_Python递归函数实例讲解
  8. hive 时间转字符串_07697.0.3如何在Kerberos环境下用Ranger完成对Hive的行过滤及列脱敏...
  9. java编程pig编码_Pig编程指南.pdf
  10. html抽取正文内容 c++,如何用C/C++获取html或shtml文件的内容?