Datawhale AI 夏令营 电力需求预测赛 task03

Datawhale AI 夏令营 电力需求预测赛 task03

一、时间序列预测特征提取和分析方法

在这里插入图片描述
在进行时间序列分析时,特征提取是一个至关重要的步骤,因为它直接影响到模型的性能。以下是关键特征提取和分析方式的详细介绍:

  1. 日期变量:时间序列数据通常包含日期或时间信息。这可以细分为不同的时间尺度,如年、月、周、日、小时、分钟等。在特征提取时,可以将这些日期变量转换为数值型特征,以便于模型处理。
  2. 周期性:许多时间序列数据表现出周期性,例如,一天中的小时数、一周中的天数、一年中的月份等。识别并利用这些周期性特征可以帮助模型捕捉数据的内在规律。
  3. 趋势性:趋势性是指时间序列数据随时间推移呈现的上升或下降的总体模式。这可以通过诸如移动平均或线性回归等方法来提取,并作为特征输入模型。
  4. 距离某天的时间差:这涉及到从特定日期(如产品发布日、重要事件日等)计算时间差。这种特征可以帮助模型了解数据点与特定事件的相对位置。
  5. 时间特征组合:将不同的时间单位组合起来(如年和周、月和日)可以提供更丰富的时间上下文信息,有助于揭示数据中的复杂模式。
  6. 特殊日期:识别时间序列中的特殊日期或事件(如节假日、促销活动等)并将其作为特征,可以帮助模型解释与这些事件相关的数据波动。
  7. 异常点:时间序列中可能存在异常点,这些点与其他数据点显著不同。正确识别并处理这些异常点对于提高预测精度至关重要。
  8. 时序相关特征:
  • 历史平移:将过去的值作为当前值的函数,例如,使用前一天的值来预测后一天的值。
  • 滑窗统计:使用时间窗口内的统计数据(如平均值、中位数、标准差等)作为特征,这有助于捕捉局部时间范围内的数据特性。
  1. 强相关特征:识别与目标变量强烈相关的特征,并利用这些特征来构建预测模型。

在这里插入图片描述
这张图片提供了一系列关于时间序列预测中构建关键特征的要点,包括强相关性特征、趋势性特征、周期性特征和异常点特征。以下是对这些特征的详细介绍:

  1. 强相关性特征:
  • 强相关性特征是指与目标变量有明显线性或非线性关系的输入特征。在时间序列中,这些特征可能包括:
    • 滞后特征:使用过去的值作为当前预测的特征,例如,使用前一天的销售数据来预测后一天的销售。
    • 滚动统计特征:计算时间序列的滚动窗口内的统计量,如平均值、最大值、最小值、总和等。
  1. 趋势性特征:
  • 趋势性特征反映了时间序列随时间推移的长期变化方向或速率。
  • 构建趋势性特征的方法包括:
    • 时间戳转换:将时间戳转换为数值,如从时间戳中提取年份、月份、星期等。
    • 移动平均:使用时间序列的移动平均值来平滑短期波动,突出长期趋势。
    • 多项式拟合:拟合一个多项式模型来捕捉趋势。
  1. 周期性特征:
  • 周期性特征反映了时间序列数据在固定时间间隔内重复出现的模式。
  • 构建周期性特征的方法包括:
    • 时间戳的周期性转换:将时间戳转换为周期性变量,如一周中的星期几、一月中的日子等。
    • 季节性分解:使用季节性分解方法来识别和提取时间序列的季节性成分。
    • 周期性函数:使用正弦和余弦函数来模拟周期性变化。
  1. 异常点特征:
  • 异常点是指与正常数据模式显著不同的数据点,它们可能由错误、突变或特殊事件引起。
  • 处理异常点的方法包括:
    • 简单标注:在数据集中标记异常点,以便在分析时考虑。
    • 剔除:从数据集中删除异常点,特别是在它们可能影响模型训练的情况下。
    • 修正:更正异常点,如果它们是由于可识别的错误造成的。
  1. 特殊事件特征:
  • 特殊事件如“双十一”、“618”、“春节”等,会在时间序列中产生显著的峰值。
  • 构建特殊事件特征的方法包括:
    • 事件指示器:创建一个二进制特征,当时间序列中的点与特殊事件对应时,该特征值为1,否则为0。
    • 事件前后的时间窗口:考虑事件前后的时间窗口,以捕捉事件的影响。
  1. 上下时段信息:
  • 上下时段信息指的是在时间序列中,特定时间段之前或之后的数据点。
  • 这可以通过创建特征来表示数据点与特定时间段的距离来实现。
  1. 存在峰值与峰值距离:
  • 识别时间序列中的峰值点,并计算其他数据点与这些峰值点的距离,可以作为特征输入模型。
  1. 时间尺度特征:
  • 根据需要预测的时间尺度(如1天、3天、5天等),创建相应的滞后特征和滚动统计特征。
    通过结合这些特征,可以构建一个强大的时间序列预测模型。在实际应用中,需要根据具体问题和数据特性来选择和调整特征工程的策略。此外,特征的选择和构建应该与模型的选择和调优过程相结合,以实现最佳的预测性能。

二、代码及分析

完整代码如下:

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

# 从指定路径读取训练集和测试集数据文件。
train = pd.read_csv('./data/data283931/train.csv')
test = pd.read_csv('./data/data283931/test.csv')

# 数据预处理函数
def preprocess_data(df, look_back=100):
    # 数据标准化
    scaler = MinMaxScaler(feature_range=(0, 1))
    df[df.columns[3]] = scaler.fit_transform(df[df.columns[3]].values.reshape(-1, 1))
    
    # 将数据按照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] * (look_back - 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), scaler

# 定义模型
def build_model(look_back, n_features, n_output):
    model = Sequential()
    model.add(LSTM(100, input_shape=(look_back, n_features), return_sequences=True))
    model.add(Dropout(0.3))
    model.add(LSTM(100, return_sequences=False))
    model.add(Dropout(0.3))
    model.add(RepeatVector(n_output))
    model.add(LSTM(100, return_sequences=True))
    model.add(Dropout(0.3))
    model.add(TimeDistributed(Dense(1)))
    model.compile(loss='mean_squared_error', optimizer=Adam(0.001))
    return model

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

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

# 调整输入数据形状
X = X.reshape((X.shape[0], look_back, n_features))
Y = Y.reshape((Y.shape[0], n_output, n_features))
OOT = OOT.reshape((OOT.shape[0], look_back, n_features))

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

# 设置早停和学习率调度
early_stopping = EarlyStopping(monitor='val_loss', patience=5, verbose=1)
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=3, verbose=1)

# 训练模型
history = model.fit(X, Y, epochs=100, batch_size=64, validation_split=0.2, verbose=1, callbacks=[early_stopping, reduce_lr])

# 进行预测
predicted_values = model.predict(OOT)

# 将预测值反归一化
predicted_values = scaler.inverse_transform(predicted_values.reshape(-1, 1)).reshape(predicted_values.shape)

# 添加预测结果到测试数据集并保存到CSV文件
test_ids = test['id'].unique()
predicted_df = pd.DataFrame({
    'id': np.repeat(test_ids, n_output),
    'dt': np.tile(range(n_output), len(test_ids)),
    'target': predicted_values.flatten()
})
predicted_df.to_csv('submit.csv', index=None)

print(predicted_values)

与基础代码相比,我的代码做了一些改进,包括数据预处理、模型架构、训练过程以及预测结果的处理等。

1.数据预处理
使用 MinMaxScaler 对数据进行了标准化处理。

# 数据标准化 
scaler = MinMaxScaler(feature_range=(0, 1))
df[df.columns[3]] = scaler.fit_transform(df[df.columns[3]].values.reshape(-1, 1))

2.模型架构
我的模型架构更复杂,使用了更多的 LSTM 层和 Dropout 层,以减少过拟合。

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

3.训练过程
早停和学习率调度:使用了 EarlyStopping 和 ReduceLROnPlateau 回调函数来调整训练过程,防止过拟合和动态调整学习率。

训练轮数和验证集:设置了 100 个 epoch 和 20% 的验证集。

early_stopping = EarlyStopping(monitor='val_loss', patience=5, verbose=1)
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=3, verbose=1)

history = model.fit(X, Y, epochs=100, batch_size=64, validation_split=0.2, verbose=1, callbacks=[early_stopping, reduce_lr])

4.预测和保存结果

# 你的预测和保存结果
predicted_values = scaler.inverse_transform(predicted_values.reshape(-1, 1)).reshape(predicted_values.shape)

test_ids = test['id'].unique()
predicted_df = pd.DataFrame({
    'id': np.repeat(test_ids, n_output),
    'dt': np.tile(range(n_output), len(test_ids)),
    'target': predicted_values.flatten()
})
predicted_df.to_csv('submit.csv', index=None)
  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值