时间序列预测负荷、客流量等

概述

时间序列预测,利用历史时间的数据,预测未来状态,可用于电力负荷、人流、股价等各类预测问题。

一般数据按照时间会有多个属性,所以预测分类单属性单目标、多属性单目标、多属性多目标情况,预测也分为单步预测和多步预测,这里我们给出单目标的方案,多目标和单目标类似,只是有几个目标就构建几个全连接。

方法

构建一种基于深度神经网络的多属性单目标的多步预测方法。

数据载入

载入历史数据,如果是excel或者csv数据,可以使用pandas加载数据;

data = pd.read_excel(dir_src)

数据处理

定义要分析的属性列名和要预测的目标列表名,整理完成放入两个list列表中,这种结构可以方便支持输入多特征分析和多特征预测;

data_sel = data[columns]
data_labels = data[labels]

根据设置的分析列和目标列,读取相应的数据。使用sklearm的预处理函数,使用最大值最小值对输入特征和预测目标进行归一化。

mm_x=MinMaxScaler() # 导入sklearn的预处理容器
mm_y=MinMaxScaler()
data=data.values    # 将pd的系列格式转换为np的数组格式
label=label.values
data=mm_x.fit_transform(data) # 对数据和标签进行归一化等处理
label=mm_y.fit_transform(label)

根据设置的时间步数,进行数据预处理。时间步数可以根据预测的步数定义,一般设置为预测步数的2倍量或者3倍量。

def split_windows(data,look_back, output_size):
    '''
    特征抽取
    Args:
        data (): 输入语料
        look_back (): 阶数
        output_size (): 预测步数
    Returns:数据特征集合
    '''

    x=[]
    y=[]
    #因为需要前seq长度的历史数据,所以从该数据往下计算特征
    for i in range(look_back, len(data)-output_size+1):
  
        x.append(data[i-look_back:i,:])
        y.append(data[i:i+output_size,-1])
  
    f_size = len(data[0])
    dataX1 = torch.tensor(x)
    #dataX1 = dataX1.reshape(-1, f_size, look_back)
    dataY = torch.tensor(y)
    #dataY = dataY.reshape(-1, 1)
    #dataY = dataY.reshape(-1, 1, 1)

    return dataX1, dataY

对输入属性进行迭代处理,计算特征。时间序列要根据前面的时间步进行预测,所以特征构建从时间步n开始作为第一条处理的数据,获取前n的属性,连续的n*features数作为当前数据的特征;目标为当前数据开始的目标值,如果预测step步,则取从当前目标值开始的step个目标值作为label。

数据拆分

将计算完特征的数据进行拆分,可以设置拆分比例,也可以设置固定的评估数据量,对结果进行拆分。

模型训练

定义网络,定义损失函数,定义优化函数。

self.lstm = nn.LSTM(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers,
                    batch_first=True)  # LSTM层



其中,

Inputs_size 为特征数;

Hidden_size 为隐含层数量,理论来说,隐含层数量不宜过多



num_directions = 1  # 单向LSTM

num_directions为1是单向LSTM,为2是双向BiLSTM,从时间序列的场景来看,双向LSTM的效果优于单项LSTM结果

将网络、数据等载入device设备,方便在cpu或者gpu上训练。

迭代训练

seq = trainX.to(device)
label = trainY.to(device)

#前向计算
y_pred = model(seq)
#计算损失值
loss = loss_function(y_pred, label)
train_loss.append(loss.item())
optimizer.zero_grad()
#反向传播计算
loss.backward()
optimizer.step()

这里的seq和label为前面拆分数据时产出的特征和label。

模型评估

基于训练好的模型,计算模型效果。

主要使用MAE/RMSE/MAPE三个指标。

mae = mean_absolute_error(dataY, dataP)
rmse = np.sqrt(mean_squared_error(dataY, dataP))

mape = np.mean(np.abs((y_pred - y_true) / y_true)) * 100

结论

时间序列使用双向网络的效果优于单项网络,LSTM、GRU网络等可以根据自己的数据进行测试,选择符合自己场景的网络模型。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值