电力需求预测赛 Task3:尝试使用深度学习方案#Datawhale AI 夏令营

在Datawhale机器学习夏令营最后一个task中,提及了深度学习的方案解决问题。

该代码使用Keras构建了一个LSTM模型,用于时间序列数据的预测,具体代码及分析如下:

Step1:导入库与加载数据

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense, RepeatVector, TimeDistributed
from keras.optimizers import Adam


train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

(1)导入numpypandas、keras等库。

(2)读取训练数据和测试数据的 CSV 文件,将它们分别存储在 traintest 变量中。

Step2:定义数据预处理函数

# 数据预处理
def preprocess_data(df, look_back=100):
    # 将数据按照id进行分组
    grouped = df.groupby('id')
    datasets = {}
    for id, group in grouped:
        datasets[id] = group.values
        
    # 准备训练数据集
    X, Y = [], []
    for id, data in datasets.items():
        for i in range(10, 15): # 每个id构建5个序列
            a = data[i:(i + look_back), 3]
            a = np.append(a, np.array([0]*(100-len(a))))
            X.append(a[::-1])
            Y.append(data[i-10:i, 3][::-1])
    
    # 准备测试数据集
    OOT = []
    for id, data in datasets.items():
        a = data[:100, 3]
        a = np.append(a, np.array([0]*(100-len(a))))
        OOT.append(a[::-1])
    
    return np.array(X, dtype=np.float64), np.array(Y, dtype=np.float64), np.array(OOT, dtype=np.float64)

(1)将数据按照 id 列进行分组。

(2)将每个分组的数据保存到 datasets 字典中,键为 id,值为对应的数据数组。

(3)准备训练数据集 X 和目标值 Y。

(4)对于每个 id,从第10行到第15行生成5个序列。

(5)取数据的第3列作为特征,并对序列进行反转([::-1]),如果序列长度不足 look_back,则用0填充。

(6)准备测试数据集 OOT

(7)对于每个 id,取前100行的数据。

(8)将数据序列反转,并用0填充不足部分。

(9)返回预处理后的训练数据 X,目标值 Y,以及测试数据 OOT

Step3:定义模型用于构建LSTM模型

def build_model(look_back, n_features, n_output):
    model = Sequential()
    model.add(LSTM(50, input_shape=(look_back, n_features)))
    model.add(RepeatVector(n_output))
    model.add(LSTM(50, return_sequences=True))
    model.add(TimeDistributed(Dense(1)))
    model.compile(loss='mean_squared_error', optimizer=Adam(0.001))
    return model

(1)第一层LSTM有50个单元,输入形状为 (look_back, n_features),即 look_back 个时间步,每个时间步有 n_features 个特征。

(2)RepeatVector 将输出重复 n_output 次。

(3)第二层LSTM有50个单元,返回完整序列。

(4)TimeDistributed 包装 Dense 层,将输出转换为一个值。

(5)使用 mean_squared_error 作为损失函数,Adam 作为优化器。

Step4:预处理数据并构建模型

look_back = 100  # 序列长度
n_features = 1  # 假设每个时间点只有一个特征
n_output = 10  # 预测未来10个时间单位的值

# 预处理数据
X, Y, OOT = preprocess_data(train, look_back=look_back)

# 构建模型
model = build_model(look_back, n_features, n_output)

(1)设置序列长度 look_back、特征数量 n_features 和输出长度 n_output

(2)调用数据预处理函数,生成训练集 X 和目标值 Y,以及测试数据 OOT

(3)构建LSTM模型。

Step5:训练模型并进行预测

model.fit(X, Y, epochs=10, batch_size=64, verbose=1)
predicted_values = model.predict(OOT)

(1)使用预处理后的训练数据 XY 训练模型。训练10个周期,批次大小为64,显示训练过程信息。这里可以通过 kerasEarlyStopping控制早停,防止过拟合。

(2)使用训练好的模型对测试数据 OOT 进行预测。生成预测值 predicted_values

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值