【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析第一问LSTM模型的建立

完整代码下载链接:【泰迪杯】B题:电力系统负荷预测分析

1️⃣问题分析

地区负荷的中短期预测分析

根据附件中提供的某地区电网间隔15分钟的负荷数据,建立中短期负荷预测模型:
(1)给出该地区电网未来10天间隔15分钟的负荷预测结果,并分析其预测精度;

2️⃣数据预览

【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析第一问LSTM模型的建立_第1张图片

3️⃣LSTM预测模型(省略部分步骤

导入模块和包

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')

第1步:加载数据集、预处理

【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析第一问LSTM模型的建立_第2张图片

  1. 将字段Datetime数据类型转换为日期类型
  2. 将字段Datetime设置为索引列,目的是用于后续基于索引来进行数据集的切分
  3. 将原始的Datetime字段列删除
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)

【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析第一问LSTM模型的建立_第3张图片

可视化显示Power的数据分布情况

【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析第一问LSTM模型的建立_第4张图片

归一化处理

【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析第一问LSTM模型的建立_第5张图片

第2步:特征工程

构造特征数据集和标签集

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)

第3步:构建模型

model = Sequential([
    layers.LSTM(16, input_shape=(SEQ_LEN, 1)),
    layers.Dense(1)
])

第4步:模型编译、训练、验证

# 模型编译
model.compile(optimizer='adam', loss="mae")

# 模型训练
history = model.fit(train_batch_dataset,
          epochs=100,
          validation_data=test_batch_dataset,
          callbacks=[checkpoint_callback])

【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析第一问LSTM模型的建立_第6张图片

【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析第一问LSTM模型的建立_第7张图片

模型优良!!!绘制模型验证结果:

【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析第一问LSTM模型的建立_第8张图片

绘制test中前100个点的真值与预测值

【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析第一问LSTM模型的建立_第9张图片

第5步:模型测试(预测)

预测后续20个点的值

【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析第一问LSTM模型的建立_第10张图片

完整代码下载链接:https://mianbaoduo.com/o/bread/YpiamJxt

你可能感兴趣的:(数学建模,机器学习,python)