Я подозреваю, что проблема может быть связана с неправильным выбором параметров или ограниченностью данных. Затем я реализовал ручной поиск по сетке, чтобы найти оптимальные значения (p, d, q). При использовании лучших параметров (0, 1, 1) прогнозы модели улучшились, но ошибки по-прежнему значительны, и модель не полностью отражает сложность временного ряда.
Последовательность действий диаграмма
Код: Выделить всё
import pandas as pd
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
from sklearn.metrics import mean_absolute_error, mean_squared_error
from statsmodels.tsa.stattools import adfuller
# Function for Mean Absolute Percentage Error (MAPE)
def mean_absolute_percentage_error(y_true, y_pred):
return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
# Simulated time series data for example
np.random.seed(42)
time_steps = 100
series = np.cumsum(np.random.randn(time_steps)) + 50 # Example data
# Create a DataFrame with a datetime index
time_index = pd.date_range(start='2023-01-01', periods=len(series), freq='D')
df = pd.DataFrame({'value': series}, index=time_index)
decomposition = sm.tsa.seasonal_decompose(df['value'], model='additive', extrapolate_trend='freq')
fig = decomposition.plot()
plt.show()
adf_result = adfuller(df['value'])
adf_stat = adf_result[0]
p_value = adf_result[1]
critical_values = adf_result[4]
print(f"ADF Statistic: {adf_stat}")
print(f"p-value: {p_value}")
print(f"Critical Values: {critical_values}")
train_size = int(0.8 * len(series))
train, test = series[:train_size], series[train_size:]
# Using manually tuned parameters based on earlier exploration
optimized_model = sm.tsa.ARIMA(train, order=(0, 0, 1)) # p=0, d=0, q=1
optimized_fitted_model = optimized_model.fit()
# Forecast
optimized_forecast = optimized_fitted_model.forecast(steps=len(test))
optimized_mape = mean_absolute_percentage_error(test, optimized_forecast)
optimized_mae = mean_absolute_error(test, optimized_forecast)
optimized_rmse = np.sqrt(mean_squared_error(test, optimized_forecast))
print(f"MAPE: {optimized_mape:.2f}%")
print(f"MAE: {optimized_mae:.2f}")
print(f"RMSE: {optimized_rmse:.2f}")
# Step 6: Plot Results
plt.figure(figsize=(10, 6))
plt.plot(test, label='Actual')
plt.plot(optimized_forecast, label='Optimized ARIMA Prediction')
plt.plot(
pd.Series(test).rolling(window=5).mean(),
label='Moving Average', linestyle='--'
)
plt.title('Optimized ARIMA Model Forecast vs Actual')
plt.xlabel('Time Steps')
plt.ylabel('Values')
plt.legend()
plt.grid()
plt.show()
Подробнее здесь: https://stackoverflow.com/questions/792 ... aight-line