When I trying SARIMA model to determine the number of passangers

39 Views Asked by At

I am tyring to do SARIMA model for determining number of passenger. I wrote the code but I got the error: STOP: TOTAL NO. of ITERATIONS REACHED LIMIT. How Can I solve it? An it says: This problem is unconstrained.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.metrics import mean_absolute_error, mean_squared_error

#data
df = pd.read_csv("AirPassengers.csv")
df.index = pd.to_datetime(df['Month'])
df = df.drop('Month', axis=1)

df['#Passengers_diff'] = df['#Passengers'].diff().fillna(0)

# Hyperparameter Tuning
p, d, q = 5, 2, 1
P, D, Q, S = 1, 1, 1, 6

#SARIMA model
model = SARIMAX(df['#Passengers_diff'], order=(p, d, q), seasonal_order=(P, D, Q, S))
results = model.fit()

# Forecast steps
forecast_steps = 12

# Confidence intervals for 80%
forecast = results.get_forecast(steps=forecast_steps, alpha=0.2)
forecast_mean_diff = forecast.predicted_mean
confidence_intervals_diff = forecast.conf_int()

# Invert differencing to get actual values
forecast_mean = df['#Passengers'].iloc[-1] + np.cumsum(forecast_mean_diff)
confidence_intervals = df['#Passengers'].iloc[-1] + np.cumsum(confidence_intervals_diff)

# Evaluate the model
actual_values = df['#Passengers'][-forecast_steps:]
mae = mean_absolute_error(actual_values, forecast_mean[-forecast_steps:])
mse = mean_squared_error(actual_values, forecast_mean[-forecast_steps:])
rmse = np.sqrt(mse)

print(f'MAE: {mae:.2f}')
print(f'MSE: {mse:.2f}')
print(f'RMSE: {rmse:.2f}')

# Plotting
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['#Passengers'], label='Observed', color='blue')
plt.plot(forecast_mean.index, forecast_mean, label='Forecast', color='red')

# Plot 80% confidence intervals
plt.fill_between(confidence_intervals.index, confidence_intervals.iloc[:, 0], confidence_intervals.iloc[:, 1], color='pink', label='80% Confidence Interval')

plt.xlabel('Date')
plt.ylabel('Passengers')
plt.title('SARIMA Forecast')
plt.legend()
plt.grid(True)
plt.show()

I tried changing the p,d,q parameters. But I got several errors.

1

There are 1 best solutions below

0
Corralien On

Define maxiter when you fit your model:

results = model.fit(max_iter=300)

# Output
CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH

FYI, replace:

df = pd.read_csv("AirPassengers.csv")
df.index = pd.to_datetime(df['Month'])
df = df.drop('Month', axis=1)

with:

df = pd.read_csv("AirPassengers.csv", index_col='Month', parse_dates=['Month'])