首页 > 其他分享 >Datawhale AI夏令营第二期——机器学习 电力需求预测挑战赛

Datawhale AI夏令营第二期——机器学习 电力需求预测挑战赛

时间:2024-07-14 20:29:57浏览次数:12  
标签:10 plt target AI 需求预测 sales Datawhale train LSTM

#AI夏令营 #Datawhale夏令营

一种基于LSTM的电力暴力预测

1.赛事简介

随着全球经济的快速发展和城市化进程的加速,电力系统面临着越来越大的挑战。电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。

然而,电力需求受到多种因素的影响,为了提高电力需求预测的准确性和可靠性,推动智能电网和可持续能源系统的发展,本场以“电力需求预测”为赛题的数据算法挑战赛。选手需要根据历史数据构建有效的模型,能够准确的预测未来电力需求。

2.赛题任务

给定多个房屋对应电力消耗历史N天的相关序列数据等信息,预测房屋对应电力的消耗。

3.数据展示

赛题数据由训练集和测试集组成,为了保证比赛的公平性,将每日日期进行脱敏,用1-N进行标识,即1为数据集最近一天,其中1-10为测试集数据。数据集由字段id(房屋id)、 dt(日标识)、type(房屋类型)、target(实际电力消耗)组成,如下图所示。

每个房间给出其从第11-506天的电力消耗,共2877305行,5832个房间,19种房间类型,下图为train.csv的数据展示。

4.模型构建

(1)导入模块

import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

(2)数据集详细可视化

房间类型与电力消耗关系

import matplotlib.pyplot as plt  
import pandas as pd 
import matplotlib.cm as cm  
plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  
target = train.groupby('type')['target'].mean().reset_index()  
plt.figure(figsize=(6, 4))  
norm = plt.Normalize(vmin=0, vmax=len(target['type'].unique())-1)  
colors = cm.viridis(norm(range(len(target['type'].unique()))))  
plt.bar(target['type'], target['target'], color=colors)  
plt.xlabel('房间类型')  
plt.ylabel('平均消耗电力')  
plt.title('房间类型与电力消耗关系')   
plt.show()

以第一个房间编号为例,展示其随时间的电力变化

id_all = train[train['id'] == '00037f39cf']
plt.figure(figsize=(8, 4))
plt.plot(id_all['dt'], id_all['target'], linestyle='-')
plt.xlabel('日期')
plt.ylabel('电力消耗')
plt.title('电力消耗随日期变化')
plt.show()

(3)LSTM模型

LSTM(Long Short-Term Memory,长短期记忆网络)是一种特殊的循环神经网络(RNN)架构,用于处理序列数据中的长期依赖问题。传统的RNN在处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致网络无法有效捕获到长距离的依赖关系。LSTM通过引入三个“门”控制结构(遗忘门、输入门、输出门)来改进这个问题,从而允许网络更有效地学习和存储长期依赖信息。

LSTM单元内部主要包括以下几个部分:

  1. 遗忘门(Forget Gate):遗忘门决定哪些信息应该从单元状态中丢弃。它通过查看当前输入h_t-1(上一个时间步的输出)和x_t(当前时间步的输入),输出一个0到1之间的值,这个值会与上一个时间步的单元状态C_t-1相乘,决定哪些信息需要保留或遗忘。

  2. 输入门(Input Gate):输入门决定哪些新信息应该被存储在单元状态中。它首先通过一个sigmoid层决定哪些值需要更新,然后通过一个tanh层生成一个候选值向量C_hat_t。最后,将sigmoid层的输出与C_hat_t相乘,得到需要添加到单元状态的新信息。

  3. 单元状态(Cell State):单元状态是LSTM网络中的关键,它记录着历史信息。新的单元状态是通过将旧的单元状态与遗忘门的输出相乘,再加上输入门决定的新信息来得到的。

  4. 输出门(Output Gate):输出门决定哪些信息应该被输出到LSTM单元的当前输出值h_t。它首先通过sigmoid层决定单元状态的哪些部分将被输出,然后将单元状态通过tanh层(将其值规范化到-1到1之间),最后将tanh层的输出与sigmoid层的输出相乘,得到最终的输出值h_t

(4)训练并生成结果

train = pd.read_csv('./train.csv')
test = pd.read_csv('./test.csv')
products = train['id'].unique()
predicted_df = pd.DataFrame() 
for product in products:
    print(train[train['id'] == product].index.tolist()[0])
    product_df = train[train['id'] == product].copy()
    sales = product_df['target'].values[::-1]
    sales=sales.reshape(-1,1)
    scaler = MinMaxScaler(feature_range=(0, 1))
    sales_scaled = scaler.fit_transform(sales)

    # 将数据拆分为输入序列和目标值
    X, y = [], []
    for i in range(len(sales_scaled) - 10):
        X.append(sales_scaled[i:i+10, 0])
        y.append(sales_scaled[i+10, 0])

    X, y = np.array(X), np.array(y)

    # 将数据重塑为LSTM模型所需的形状 (samples, time steps, features)
    X = np.reshape(X, (X.shape[0], X.shape[1], 1))

    # 构建LSTM模型
    model = Sequential()
    model.add(LSTM(units=50, return_sequences=True, input_shape=(X.shape[1], 1)))
    model.add(LSTM(units=50))
    model.add(Dense(units=1))

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

    # 训练模型
    model.fit(X, y, epochs=50, batch_size=32)

    # 预测未来10天电力
    future_dates = pd.date_range(start=1, periods=10, freq='W')
    future_sales = []

    for i in range(10):
        input_data = sales_scaled[-10:].reshape(1, 10, 1)
        predicted_sales = model.predict(input_data)
        future_sales.append(predicted_sales[0, 0])

        # 更新输入数据,加入新的预测值
        sales_scaled = np.concatenate([sales_scaled, predicted_sales], axis=0)

    # 反归一化
    future_sales = scaler.inverse_transform(np.array(future_sales).reshape(-1, 1))

    # 计算模型的性能指标
    true_sales = product_df['target'].values[-10:]
    mse = mean_squared_error(true_sales, future_sales)
    mae = mean_absolute_error(true_sales, future_sales)

    print(f"Product: {product}")
    print(f"Mean Squared Error: {mse}")
    print(f"Mean Absolute Error: {mae}")
    
    dt_values = range(1, 11) 

#     # 创建预测数据的DataFrame
    future_df = pd.DataFrame({'id': product, 'dt':dt_values ,'target': future_sales.flatten()})
    print(future_df)
#     # 将预测数据追加到原始数据框中
    predicted_df = pd.concat([predicted_df, future_df], ignore_index=True)
predicted_df.to_csv('test.csv', index=False)

注:本模型将每个房间都构建了一个LSTM模型,属于最为暴力的解法,并没有使用房间类型这一关键元素,且属于神经网路模型,极其消耗时间,预计可能运行时间超过10个小时(用GPU可能会快一点,本篇未使用),结果在本篇文章提交时仍未跑完,可能结果惨不忍睹,仅起抛砖引玉的作用,欢迎各位大佬进行改进。

模型参考文章:https://blog.csdn.net/MacWx/article/details/134548578

标签:10,plt,target,AI,需求预测,sales,Datawhale,train,LSTM
From: https://blog.csdn.net/weixin_61149295/article/details/140420305

相关文章

  • Unraid 连接雷迪司 H1000M UPS 教程
    前言上周六租住的小区更换电表,由于本人未注意贴在楼下的通知,直到断电时往去楼下咨询更换电表的工作人员才知晓通知已经提前一周下达。强制断电对NAS的硬盘影响是致命的,于是当机立断购入了雷迪司的这款NAS备用电源。选择这款备用电源的原因主要是便宜,Unraid和TheNetwork......
  • 2024华为云客服AI助手的大模型实践与思考(免费下载)
    【1】亲爱的读者,如果您想要下载文章完整版,请关注公众号并转发本文至您的微信朋友圈【2】公众号后台发送2024华为云客服AI助手的大模型实践与思考【3】即可获取本文对应的PDF学习文档。  ......
  • ubuntu中nginx部署服务器后添加SSL证书解决SSL handshake failed问题
    文章思路:写这篇文章主要是本人在使用nginx部署好服务器后,采用浏览器打开服务器地址;在采用pyqt开发的软件中,采用QNetwork模块连接后,想下载服务器的zip压缩包时,发现QNetwork提示报了SSLhandshakefailed异常问题解决方式:添加SSL证书进行解决,目前要获取根证书有以下方式;(1)从证......
  • Reinforced Causal Explainer for GNN论文笔记
    论文:TPAMI2023 图神经网络的强化因果解释器论文代码地址:代码目录AbstractIntroductionPRELIMINARIESCausalAttributionofaHolisticSubgraph​individualcausaleffect(ICE)​*CausalScreeningofanEdgeSequenceReinforcedCausalExplainer(RC-Explaine......
  • Grafana+Loki+Promtail 日志监控
    Grafana+Loki+Promtail日志监控原创 Jruing 佛系内卷写代码 2024年07月06日17:30 北京 2人听过前置工作用户组(按需创建)GrafanaLokiLoki配置文件Promtail配置文件配置数据源创建仪表盘添加查询项 前置工作Centos7关闭防火......
  • LangChain与RESTful API的交响曲:开发集成新篇章
    LangChain与RESTfulAPI的交响曲:开发集成新篇章在软件开发中,API(应用程序编程接口)是系统间交互的桥梁。RESTfulAPI作为API的一种风格,以其简洁、无状态和可缓存性而广受欢迎。LangChain作为一个多功能的语言处理工具链,其是否支持RESTfulAPI开发取决于其设计目标和集成的组......
  • 电力需求预测挑战赛(机器学习方向)--task1 #Datawhale AI 夏令营
    一、概念电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。【训练时序预测模型助力电力需求预测】二、赛题任务给定多个房屋对应电力消耗历史N天的相关序列数据等信息,预测房屋对应电力的消耗。三、赛题数据简介1、赛题数据由训练集......
  • 函数式编程的交响曲:探索LangChain对函数式编程特性的支持
    函数式编程的交响曲:探索LangChain对函数式编程特性的支持引言在现代软件开发中,函数式编程(FunctionalProgramming,FP)以其独特的优势,如无副作用、易于并行处理等,逐渐受到开发者的青睐。LangChain作为一个多语言编程工具链,其设计理念在于支持多种编程范式,包括函数式编程。......
  • 控ID生成->facechain
    https://github.com/modelscope/facechain/blob/main/README_ZH.mdhttps://github.com/modelscope/facechain/blob/main/README_ZH.md【深度学习】FaceChain:APlaygroundforHuman-centricArtificialIntelligenceGeneratedContent_instantbooth算法-CSDN博客文章浏览阅......
  • 【visualstudio配置安装(AI编码-通义灵码)】
    visualstudio配置安装(AI编码-通义灵码)前言一、安装1.[visualstudio官网]2.下载3.安装二、配置1.颜色主题2.中文插件3.AI编程(阿里云的通义灵码)插件4.其余插件前言『勤学似春起之苗,不见其增,而日有所长』本文档仅记录windows下visualstudio的安装配置的方法......