python短期电力预测——基于LSTM神经网络
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神经网络相关推荐
- python多因素电力预测——基于LSTM神经网络
一个很简易的多因素预测电力模型,所用数据量很少,所以效果不是很好,如果数据量大,可能最后的模型精度和效果会不错,看看就行了,写的很乱(数据来源于泰迪杯最先公布的数据). # -*- coding: u ...
- 数据代码分享|PYTHON用NLP自然语言处理LSTM神经网络TWITTER推特灾难文本数据、词云可视化...
全文下载链接:http://tecdat.cn/?p=28877 作者:Yunfan Zhang Twitter是一家美国社交网络及微博客服务的网站,致力于服务公众对话.迄今为止,Twitter的日活 ...
- Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类)
Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类) 1.卷积神经网络 1.1卷积神经网络简介 1.2卷积运算 1.3 深度学习与小数据问题的相关性 2.下载数据 2.1下载原始数据 ...
- [负荷预测]基于人工神经网络的短期电力负荷预测(1)
目录 一.问题背景 二.数据集介绍 2.1 提取Area1用电负荷 2.2 读入2014年Area1指定列负荷数据 2.3 探查Area1用电负荷数据分布 2.4 两地2014年负荷数据可视化 2.4 ...
- python深度学习之基于LSTM时间序列的股票价格预测
1.本文是一篇LSTM处理时间序列的案例 我们先来看看数据集,这里包含了一只股票的开盘价,最高价,最低价,收盘价,交易量的信息. 本文基于LSTM对收盘价(close)进行预测 2. 单维对单步的预测 ...
- 《基于LSTM神经网络的双色球蓝球数字预测》
结论:没有任何作用,基本可以断定这是真正随机的数字. LSTM神经网络,单步预测,循环2000次,100个神经元,无dropout. 蓝线:最近50期蓝球数字 橙线:LSTM网络预测数字 绿线:蓝线 ...
- Python交通标志识别基于卷积神经网络的保姆级教程(Tensorflow)
项目介绍 TensorFlow2.X 搭建卷积神经网络(CNN),实现交通标志识别.搭建的卷积神经网络是类似VGG的结构(卷积层与池化层反复堆叠,然后经过全连接层,最后用softmax映射为每个类别的 ...
- python裂缝检测_基于卷积神经网络的高楼外墙裂缝检测系统
fy the severity, general or slight damage degree of external wall cracks, and the effective identifi ...
- 如何用Python对股票数据进行LSTM神经网络和XGboost机器学习预测分析(附源码和详细步骤),学会的小伙伴们说不定就成为炒股专家一夜暴富了
前言 最近调研了一下我做的项目受欢迎程度,大数据分析方向竟然排第一,尤其是这两年受疫情影响,大家都非常担心自家公司裁员或倒闭,都想着有没有其他副业搞搞或者炒炒股.投资点理财产品,未雨绸缪,所以不少小伙 ...
- 数据代码分享|Python用NLP自然语言处理LSTM神经网络Twitter推特灾难文本数据、词云可视化与SVM,KNN,多层感知器,朴素贝叶斯,随机森林,GBDT对比
作者:Yunfan Zhang Twitter是一家美国社交网络及微博客服务的网站,致力于服务公众对话.迄今为止,Twitter的日活跃用户达1.86亿.与此同时,Twitter也已成为突发紧急情况时 ...
最新文章
- mysql提取数据字符_如何从MySQL查询的字符串中提取数值?
- 如何让你的操作系统更安全二
- 汽车车牌识别系统实现(四)--字符识别+代码实现
- R开发(part8)--应用R语言中的函数环境空间
- 那些把天聊死的神操作。。| 今日最佳
- subline3插件html,Sublime Text3与html的插件
- 阿里健康上线新冠核酸检测服务:本周覆盖北京武汉等38城
- 停车还能360全方位影像_2020款新途锐锐享版上市,智能泊车360全景影像加量不加价...
- 一个好的函数(gcd)求最小公约数
- sublime Text2 2.0.2 build 2221 64位 破解(已测试)
- tar 打包隐藏文件
- 一封没有读出来的感谢信,勾勒出蔡文胜30年创业史!
- html怎么缩进字符间距,css字符间距(css文字间距怎么设置)
- 关于浏览器提示“隐私设置错误/证书错误导航已阻止”之 网站证书过期解决方案
- fbx模型压缩成gltf格式
- TrustedInstaller
- 实验二 贪吃蛇游戏的开发
- 高校女生穿旗袍答辩!网友:导师说论文要是和旗袍一样漂亮就好了
- 【增量学习】综述解析:A continual learning survey: Defying forgetting in classification tasks
- ChatGPT国内怎么用?官网实在太麻烦了,ChatGPT可以直接国内使用吗?
热门文章
- Thea For SketchUp破解版|Thea For SketchUp v2.1.909.1853中文破解版下载(附安装教程)
- 【文摘】《创新者》-沃尔特·艾萨克森
- 使用foobar2000批量修改视频封面,批量修改artist/album
- coreseek(中文全文搜索)安装和使用(一)
- IDEA查看Java源码技巧
- [python小工具]小说分割器
- 给大家推荐12款好用的3D编辑器
- 刷机工具-fastboot
- sms实现wap push的方法和格式
- linux蓝天模具风扇控制软件,ECView最新版下载-蓝天原厂风扇转速策略调节软件clevo ecview下载 v6.8 通用版-IT猫扑网...