地区负荷的中短期预测分析
根据附件中提供的某地区电网间隔15分钟的负荷数据,建立中短期负荷预测模型:
(1)给出该地区电网未来10天间隔15分钟的负荷预测结果,并分析其预测精度;
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,mean_absolute_error
import tensorflow as tf
from tensorflow.keras import Sequential, layers, utils
import warnings
warnings.filterwarnings('ignore')
dataset['Datetime'] = pd.to_datetime(dataset['Datetime'], format="%Y-%m-%d %H:%M:%S")
dataset.index = dataset.Datetime
dataset.drop(columns=['Datetime'], axis=1, inplace=True)
可视化显示Power的数据分布情况
归一化处理
构造特征数据集和标签集
def create_new_dataset(dataset, seq_len = 12):
'''基于原始数据集构造新的序列特征数据集
Params:
dataset : 原始数据集
seq_len : 序列长度(时间跨度)
Returns:
X, y
'''
X = [] # 初始特征数据集为空列表
y = [] # 初始标签数据集为空列表
start = 0 # 初始位置
end = dataset.shape[0] - seq_len # 截止位置
for i in range(start, end): # for循环构造特征数据集
sample = dataset[i : i+seq_len] # 基于时间跨度seq_len创建样本
label = dataset[i+seq_len] # 创建sample对应的标签
X.append(sample) # 保存sample
y.append(label) # 保存label
# 返回特征数据集和标签集
return np.array(X), np.array(y)
基于新的特征的数据集和标签集,切分:X_train, X_test
def split_dataset(X, y, train_ratio=0.8):
'''基于X和y,切分为train和test
Params:
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_data
else: # 训练集
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
构造特征数据集和标签集,seq_len序列长度为36
SEQ_LEN = 36 # 序列长度
X, y = create_new_dataset(dataset_original.values, seq_len = SEQ_LEN)
model = Sequential([
layers.LSTM(16, input_shape=(SEQ_LEN, 1)),
layers.Dense(1)
])
# 模型编译
model.compile(optimizer='adam', loss="mae")
# 模型训练
history = model.fit(train_batch_dataset,
epochs=100,
validation_data=test_batch_dataset,
callbacks=[checkpoint_callback])
模型优良!!!绘制模型验证结果:
绘制test中前100个点的真值与预测值
预测后续20个点的值