Я подозреваю, что проблема может быть связана с неправильным выбором параметров или ограниченностью данных. Затем я реализовал ручной поиск по сетке, чтобы найти оптимальные значения (p, d, q). При использовании лучших параметров (0, 1, 1) прогнозы модели улучшились, но ошибки по-прежнему значительны, и модель не полностью отражает сложность временного ряда.
Последовательность действий диаграмма
Код: Выделить всё
import numpy as np
from pmdarima import auto_arima
from sklearn.metrics import mean_absolute_error, mean_squared_error
from math import sqrt
import matplotlib.pyplot as plt
from lib.metrics import masked_mape_np
# Caricamento dei dati preparati
data = np.load('data/PEMS08/PEMS08_r1_d0_w0_astcgn.npz')
train_data = data['train_target'] # (B, N, T)
test_data = data['test_target'] # (B, N, T)
# Selezione dei dati per il Nodo 0
train_node_0 = train_data[:, 0, :] # Serie univariata per il Nodo 0
test_node_0 = test_data[:, 0, :] # Test per il Nodo 0
# Predizioni con Auto ARIMA per il Nodo 0
def predict_node_0(train_node_0, test_node_0):
predictions = []
for timestep in range(test_node_0.shape[1]): # Itera sui passi temporali
try:
# Fitting Auto ARIMA
model = auto_arima(train_node_0[:, timestep], seasonal=False, error_action='ignore', suppress_warnings=True)
pred = model.predict(n_periods=1)[0] # Prevede 1 passo avanti
predictions.append(pred)
except Exception as e:
print(f"Errore con Auto ARIMA al timestep {timestep}: {e}")
predictions.append(np.nan) # Riempie con NaN in caso di errore
return np.array(predictions)
# Predizione
arima_predictions_node_0 = predict_node_0(train_node_0, test_node_0)
# Valutazione delle metriche
test_node_0_flatten = test_node_0.flatten()
predictions_node_0_flatten = arima_predictions_node_0.flatten()
mae = mean_absolute_error(test_node_0_flatten, predictions_node_0_flatten)
rmse = sqrt(mean_squared_error(test_node_0_flatten, predictions_node_0_flatten))
mape = masked_mape_np(test_node_0_flatten, predictions_node_0_flatten, null_val=0)
print(f"Metriche Auto ARIMA per il Nodo 0:")
print(f"MAE: {mae:.4f}")
print(f"RMSE: {rmse:.4f}")
print(f"MAPE: {mape * 100:.2f}%")
# Confronto visivo
plt.figure(figsize=(10, 6))
plt.plot(test_node_0[0], label="Ground Truth Nodo 0", color="blue")
plt.plot(arima_predictions_node_0, label="Auto ARIMA Predictions Nodo 0", color="orange")
plt.title("Previsioni Auto ARIMA vs Ground Truth per il Nodo 0")
plt.xlabel("Intervalli temporali")
plt.ylabel("Valore")
plt.legend()
plt.show()
Подробнее здесь: https://stackoverflow.com/questions/792 ... aight-line