pytorch 用真实值评估多步时间序列预测值的标准方法是什么?

mpbci0fu  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(139)

我在做一个时间序列预测:如果我有目标列(y)作为要预测的股票价格,
我有一个65个观测值的测试数据集,
假设预测长度(预测未来几天的价格)= 20。
因此,测试数据集的每个观测值将生成20个预测= array(65,20)。
现在,计算(预测,真)之间的评估度量MAE。标准做法是什么?我是说,我应该:取前20个预测值,并将其与前20个真实值进行比较。计算每个预测值与其对应的真实值之间的绝对差值。你能给予我点提示或者密码吗这就是我所做的:

preds = np.array(np.reshape(predictions, (65, 20)))
trues = np.array(np.reshape(values, (65, 20)))
preds= mm.inverse_transform(preds)
trues= mm.inverse_transform(trues)
preds= preds[0:,1]
trues= trues[0:,1]
metrics = metric(preds, trues)

字符串
我看到其他开发人员是这样做的:

vals = np.concatenate(values, axis=0).ravel()
preds = np.concatenate(predictions, axis=0).ravel()

rryofs0p

rryofs0p1#

**方法1:**假设,您有一个预测和真值的2D数组,其中每行对应于不同的观察,每列对应于未来的不同时间步。您可以计算每个观测值的MAE,然后求其平均值以获得总体MAE。

使用此代码片段:

import numpy as np
from sklearn.metrics import mean_absolute_error

# Assuming preds and trues are your arrays of predictions and true values
# They should have shape (65, 20)

# Calculate the MAE for each observation
mae_per_observation = np.mean(np.abs(preds - trues), axis=1)

# Calculate the overall MAE
overall_mae = np.mean(mae_per_observation)

print(f"Overall MAE: {overall_mae}")

字符串
上述代码计算每个时间步和每个观测的预测值和真值之间的绝对差值。然后求平均值以获得每个观测的MAE,然后求平均值以获得总体MAE。

**方法2:**你提到的另一种方法,其中预测和真值连接到1D数组中,也是有效的。这将给予所有时间步长和所有观测的MAE,而不是对每个观测的MAE求平均值。

像这样:

# Concatenate the predictions and true values into 1D arrays
preds_1d = preds.ravel()
trues_1d = trues.ravel()

# Calculate the MAE
overall_mae = mean_absolute_error(preds_1d, trues_1d)

print(f"Overall MAE: {overall_mae}")


这两种方法的选择取决于您希望从模型中了解什么。
1.每次观察MAE:该方法分别计算每个观察值(即每个股票价格时间序列)的MAE,然后对其进行平均。这种方法对每个时间序列赋予相同的权重,而不管其长度如何。如果您有兴趣了解模型对每个股票价格时间序列的平均表现,这可能很有用。例如,* 如果你有多只股票,你想确保你的模型对每只股票都表现得相当好 ,这将是更合适的。
1.总体MAE:该方法计算所有时间步长和所有观测的MAE。这种方法为每个单独的预测赋予相同的权重,而不管它属于哪个观测(股票)。如果您对模型在所有预测中的整体性能感兴趣,这可能很有用。例如,
如果您使用该模型进行大量交易/投资组合,并且更关心所有交易的总利润或损失,而不是个股的表现 *。这将是一条路要走。

yvfmudvl

yvfmudvl2#

假设你使用的是PyTorch,它会更简单一些(predstrues应该是torch.Tensor):

import torch

preds = torch.randn(64, 20)
trues = torch.randn(64, 20)

# (64, 20) - (64, 20) and mean of all the values
loss = torch.nn.functional.l1_loss(preds, trues)
print(loss)

字符串
这将计算样本(批次)和时间步长的平均值。如果只想计算样本间的平均MAE,则可以执行以下操作:

loss = torch.nn.functional.l1_loss(preds, trues, reduction="sum") / preds.shape[0]

相关问题