LSTM神经网络,一种中长期记忆时间序列预测模型,通过长期得到数据来预测未来短期的结果,对中长期预测效果很差,本文只介绍单变量预测,即通过多天的电力数据来预测短期的电力,影响因素只有时间,不考虑其他影响因素(本文只是博主自己为了应付本次泰迪杯所自己去学习而所写的,也只供自己学习和便于查看,有所错误还望斧正),本次所用的数据来自泰迪杯官网所公布的部分数据,大概长这样

整个的步骤流程如下:

1.数据清洗

  • 缺失值处理(先进行缺失值查看,有的话就处理,没有就不处理)
  • 异常值处理(先进行异常值查看,有的话几进行处理,没有就不处理,本文用箱型图来查看有无缺失值)
  • 归一化处理

2.特征工程

  • 特征提取
  • 训练集测试集的划分(0.2),16个数据构成一个样本(自己看情况选择)
  • 对样本进行批处理(使其训练更快)

3.模型构建

  • 使用lstm神经网络,选取8个神经元

4.训练模型

5.测试模型

  • 模型预测
  • 计算模型r^2值
  • 计算模型精确度
  • 代码:
  • # -*- coding: utf-8 -*-
    # @Time : 2022/3/22 15:36
    # @Author : 中意灬
    # @FileName: test2.py
    # @Software: PyCharm
    import csv
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    from sklearn.preprocessing import MinMaxScaler
    from sklearn.metrics import r2_score
    import tensorflow as tf
    from tensorflow.python.keras import Sequential, layers, utils
    def predict_next(model, sample, epoch=20):temp1 = list(sample[:,0])for i in range(epoch):sample = sample.reshape(1, x_Seq_len, 1)pred = model.predict(sample)value = pred.tolist()[0][0]temp1.append(value)sample = np.array(temp1[i+1 : i+x_Seq_len+1])return temp1
    def create_new_dataset(dataset, seq_len=12):'''基于原始数据集构造新的序列特征数据集Params:dataset : 原始数据集seq_len : 序列长度(时间跨度)Returns:X, y'''X = []  # 初始特征数据集为空列表y = []  # 初始标签数据集为空列表,y标签为样本的下一个点,即预测点start = 0  # 初始位置end = dataset.shape[0] - seq_len  # 截止位置,dataset.shape[0]就是有多少条for i in range(start, end):  # for循环构造特征数据集sample = dataset[i: i + seq_len]  # 基于时间跨度seq_len创建样本label = dataset[i + seq_len]  # 创建sample对应的标签X.append(sample)  # 保存sampley.append(label)  # 保存label# 返回特征数据集和标签集return np.array(X), np.array(y)
    def split_dataset(X, y, train_ratio=0.8):'''基于X和y,切分为train和testParams:X : 特征数据集y : 标签数据集train_ratio : 训练集占X的比例Returns:X_train, X_test, y_train, y_test'''X_len = len(X)  # 特征数据集X的样本数量train_data_len = int(X_len * train_ratio)  # 训练集的样本数量X_train = X[:train_data_len]  # 训练集y_train = y[:train_data_len]  # 训练标签集X_test = X[train_data_len:]  # 测试集y_test = y[train_data_len:]  # 测试集标签集# 返回值return X_train, X_test, y_train, y_test# 功能函数:基于新的X_train, X_test, y_train, y_test创建批数据(batch dataset)def create_batch_data(X, y, batch_size=32, data_type=1):'''基于训练集和测试集,创建批数据Params:X : 特征数据集y : 标签数据集batch_size : batch的大小,即一个数据块里面有几个样本data_type : 数据集类型(测试集表示1,训练集表示2)Returns:train_batch_data 或 test_batch_data'''if data_type == 1:  # 测试集dataset = tf.data.Dataset.from_tensor_slices((tf.constant(X), tf.constant(y)))  # 封装X和y,成为tensor类型test_batch_data = dataset.batch(batch_size)  # 构造批数据# 返回return test_batch_dataelse:  # 训练集dataset = tf.data.Dataset.from_tensor_slices((tf.constant(X), tf.constant(y)))  # 封装X和y,成为tensor类型train_batch_data = dataset.cache().shuffle(1000).batch(batch_size)  # 构造批数据# 返回return train_batch_data
    if __name__ == '__main__':plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文标签plt.rcParams['axes.unicode_minus'] = False#解决负数问题x_Seq_len=16dataset = pd.read_csv("C:/Users/97859/Documents/WPS Cloud Files/319911131/附件1-区域15分钟负荷数据.csv", encoding='GBK')dataset['数据时间']=pd.to_datetime(dataset['数据时间'],format="%Y-%m-%d %H:%M:%S")dataset.index=dataset.数据时间#将其索引变为时间dataset.drop(columns='数据时间',axis=1,inplace=True)plt.figure()plt.plot(dataset)plt.show()"""数据清洗"""#缺失值处理#查看是否有缺失值print(dataset.info())#无缺失值# print(dataset[dataset.isnull()==False])#无# dataset['总有功功率(kw)']=dataset['总有功功率(kw)'].fillna(0) 对缺失值填值处理# dataset1=dataset[dataset['总有功功率(kw)'].notnull()] 剔除存在缺失值的数据,自己选择一直缺失值处理的方法#异常值处理"""箱型图查看"""f, ax = plt.subplots()sns.boxplot(y='总有功功率(kw)', data=dataset, ax=ax)plt.show()s = dataset.describe()# 基本统计量,存在异常值的将其筛选出来进行处理,可以用中位数填值或者众数填值,方法任选,这里没有异常值就没有处理q1 = s.loc['25%']q3 = s.loc['75%']iqr = q3 - q1#分位差mi = q1 - 1.5 * iqr#下限,低于这个为异常值ma = q3 + 1.5 * iqr#上限,高于这个为异常值#无异常值"""归一化处理,均值为0,方差为1"""scaler = MinMaxScaler()dataset['总有功功率(kw)'] = scaler.fit_transform(dataset['总有功功率(kw)'].values.reshape(-1, 1))#将归一化的数据保持with open('data.csv','w',encoding='utf-8',newline='')as f:w=csv.writer(f)w.writerow(dataset['总有功功率(kw)'])#归一化后的绘图dataset['总有功功率(kw)'].plot()plt.show()"""特征提取(特征工程)"""dataset_new = dataset# X为特征数据集,y为标签数据集X, y = create_new_dataset(dataset_new.values, seq_len=x_Seq_len)# X_train为数据训练集,X_test为数据测试集,y_train为标签训练集,y_test为标签测试集合X_train, X_test, y_train, y_test = split_dataset(X, y)# 基于新的X_train, X_test, y_train, y_test创建批数据(batch dataset)# 测试批数据test_batch_dataset = create_batch_data(X_test, y_test, batch_size=24, data_type=1)# 训练批数据train_batch_dataset = create_batch_data(X_train, y_train, batch_size=24, data_type=2)"""构建模型"""model = Sequential([layers.LSTM(8, input_shape=(x_Seq_len, 1)),layers.Dense(1)])# 定义 checkpoint,保存权重文件file_path = "best_checkpoint.hdf5"#将数据加载到内存checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(filepath=file_path,monitor='loss',mode='min',save_best_only=True,save_weights_only=True)"""编译运行预测"""# 模型编译model.compile(optimizer='adam', loss="mae")# 模型训练(次数200)history = model.fit(train_batch_dataset,epochs=100,validation_data=test_batch_dataset,callbacks=[checkpoint_callback])# 显示 train loss 和 val lossplt.figure()plt.plot(history.history['loss'], label='train loss')plt.plot(history.history['val_loss'], label='val loss')plt.title("LOSS")plt.xlabel("Epochs")plt.ylabel("Loss")plt.legend(loc='best')plt.show()# 模型验证test_pred = model.predict(X_test, verbose=1)plt.figure()d1=plt.plot(y_test, label='True')d2=plt.plot(test_pred, label='pred')plt.legend([d1,d2],labels=['True','pred'])plt.show()# 计算r2score = r2_score(y_test, test_pred)print("r^2 的值: ", score)# 绘制test中前100个点的真值与预测值y_true = y_test # 真实值y_pred = test_pred  # 预测值fig, axes = plt.subplots(2, 1)ax0=axes[0].plot(y_true, marker='o', color='red',label='true')ax1=axes[1].plot(y_pred, marker='*', color='blue',label='pred')plt.show()"""模型测试"""# 选择test中的最后一个样本sample = X_test[-1]sample = sample.reshape(1, sample.shape[0], 1)# 模型预测sample_pred = model.predict(sample)#predict()预测标签值ture_data = X_test[-1]  # 真实test的最后20个数据点# 预测后48个点preds=predict_next(model,ture_data,48)# 绘图plt.figure()plt.plot(preds, color='yellow', label='Prediction')plt.plot(ture_data, color='blue', label='Truth')plt.xlabel("Epochs")plt.ylabel("Value")plt.legend(loc='best')plt.show()
    relative_error = 0
    '''模型精确度计算'''
    for i in range(len(y_pred)):relative_error += (abs(y_pred[i] - y_true[i]) / y_true[i]) ** 2
    acc = 1- np.sqrt(relative_error / len(y_pred))
    print(f'模型的测试准确率为:',acc)
    

    结果分析:

  • 电力数据可视化

缺失值查看(无缺失)

箱型图查看异常值(无异常)

数据归一化后可视化

损失值变化(loss:训练集的损失值;val_loss:测试集的损失值。当loss下降,val_loss也下降,且两条线逐渐拟合,则说明训练网络正常,是最理想情况)

训练集中的预测值与实际值可视化

 预测后48个点可视化

最终计算得到的r^2和模型精确度

6.数据集

数据集​​​​​​​

python短期电力预测——基于LSTM神经网络相关推荐

  1. python多因素电力预测——基于LSTM神经网络

    一个很简易的多因素预测电力模型,所用数据量很少,所以效果不是很好,如果数据量大,可能最后的模型精度和效果会不错,看看就行了,写的很乱(数据来源于泰迪杯最先公布的数据). # -*- coding: u ...

  2. 数据代码分享|PYTHON用NLP自然语言处理LSTM神经网络TWITTER推特灾难文本数据、词云可视化...

    全文下载链接:http://tecdat.cn/?p=28877 作者:Yunfan Zhang Twitter是一家美国社交网络及微博客服务的网站,致力于服务公众对话.迄今为止,Twitter的日活 ...

  3. Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类)

    Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类) 1.卷积神经网络 1.1卷积神经网络简介 1.2卷积运算 1.3 深度学习与小数据问题的相关性 2.下载数据 2.1下载原始数据 ...

  4. [负荷预测]基于人工神经网络的短期电力负荷预测(1)

    目录 一.问题背景 二.数据集介绍 2.1 提取Area1用电负荷 2.2 读入2014年Area1指定列负荷数据 2.3 探查Area1用电负荷数据分布 2.4 两地2014年负荷数据可视化 2.4 ...

  5. python深度学习之基于LSTM时间序列的股票价格预测

    1.本文是一篇LSTM处理时间序列的案例 我们先来看看数据集,这里包含了一只股票的开盘价,最高价,最低价,收盘价,交易量的信息. 本文基于LSTM对收盘价(close)进行预测 2. 单维对单步的预测 ...

  6. 《基于LSTM神经网络的双色球蓝球数字预测》

    结论:没有任何作用,基本可以断定这是真正随机的数字. LSTM神经网络,单步预测,循环2000次,100个神经元,无dropout. 蓝线:最近50期蓝球数字 橙线:LSTM网络预测数字 绿线:蓝线 ...

  7. Python交通标志识别基于卷积神经网络的保姆级教程(Tensorflow)

    项目介绍 TensorFlow2.X 搭建卷积神经网络(CNN),实现交通标志识别.搭建的卷积神经网络是类似VGG的结构(卷积层与池化层反复堆叠,然后经过全连接层,最后用softmax映射为每个类别的 ...

  8. python裂缝检测_基于卷积神经网络的高楼外墙裂缝检测系统

    fy the severity, general or slight damage degree of external wall cracks, and the effective identifi ...

  9. 如何用Python对股票数据进行LSTM神经网络和XGboost机器学习预测分析(附源码和详细步骤),学会的小伙伴们说不定就成为炒股专家一夜暴富了

    前言 最近调研了一下我做的项目受欢迎程度,大数据分析方向竟然排第一,尤其是这两年受疫情影响,大家都非常担心自家公司裁员或倒闭,都想着有没有其他副业搞搞或者炒炒股.投资点理财产品,未雨绸缪,所以不少小伙 ...

  10. 数据代码分享|Python用NLP自然语言处理LSTM神经网络Twitter推特灾难文本数据、词云可视化与SVM,KNN,多层感知器,朴素贝叶斯,随机森林,GBDT对比

    作者:Yunfan Zhang Twitter是一家美国社交网络及微博客服务的网站,致力于服务公众对话.迄今为止,Twitter的日活跃用户达1.86亿.与此同时,Twitter也已成为突发紧急情况时 ...

最新文章

  1. mysql提取数据字符_如何从MySQL查询的字符串中提取数值?
  2. 如何让你的操作系统更安全二
  3. 汽车车牌识别系统实现(四)--字符识别+代码实现
  4. R开发(part8)--应用R语言中的函数环境空间
  5. 那些把天聊死的神操作。。| 今日最佳
  6. subline3插件html,Sublime Text3与html的插件
  7. 阿里健康上线新冠核酸检测服务:本周覆盖北京武汉等38城
  8. 停车还能360全方位影像_2020款新途锐锐享版上市,智能泊车360全景影像加量不加价...
  9. 一个好的函数(gcd)求最小公约数
  10. sublime Text2 2.0.2 build 2221 64位 破解(已测试)
  11. tar 打包隐藏文件
  12. 一封没有读出来的感谢信,勾勒出蔡文胜30年创业史!
  13. html怎么缩进字符间距,css字符间距(css文字间距怎么设置)
  14. 关于浏览器提示“隐私设置错误/证书错误导航已阻止”之 网站证书过期解决方案
  15. fbx模型压缩成gltf格式
  16. TrustedInstaller
  17. 实验二 贪吃蛇游戏的开发
  18. 高校女生穿旗袍答辩!网友:导师说论文要是和旗袍一样漂亮就好了
  19. 【增量学习】综述解析:A continual learning survey: Defying forgetting in classification tasks
  20. ChatGPT国内怎么用?官网实在太麻烦了,ChatGPT可以直接国内使用吗?

热门文章

  1. Thea For SketchUp破解版|Thea For SketchUp v2.1.909.1853中文破解版下载(附安装教程)
  2. 【文摘】《创新者》-沃尔特·艾萨克森
  3. 使用foobar2000批量修改视频封面,批量修改artist/album
  4. coreseek(中文全文搜索)安装和使用(一)
  5. IDEA查看Java源码技巧
  6. [python小工具]小说分割器
  7. 给大家推荐12款好用的3D编辑器
  8. 刷机工具-fastboot
  9. sms实现wap push的方法和格式
  10. linux蓝天模具风扇控制软件,ECView最新版下载-蓝天原厂风扇转速策略调节软件clevo ecview下载 v6.8 通用版-IT猫扑网...