Today I Learned (TIL)/Python

[챌린지] 시계열 기반 머신러닝 모델과 MLops 적용기 - 2회차(2)

신짜린 2024. 10. 1. 09:55

4. ARMA

 자기회귀(AR)과 이동평균(MA) 모델을 결합한 방식으로 현재값이 과거값과 과거 오차항에 모두 의존한다고 가정한다.

 ARMA(p, q)에서 p는 AR 모형의 차수(현재 값에 영향을 미치는 과거 시점의 개수), q는 MA 모형의 차수(현재 값에 영향을 미치는 이전 오차항 개수)를 말한다.

from statsmodels.tsa.arima.model import ARIMA
model = ARIMA(data, order=(p, 0, q)) # 데이터에 ARMA(p, q) 모형 적용하기
model_fit = model.fit()
model_fit.summary() # 모델 출력

ARMA 모델링 과정

 

5. ARIMA

 비정상 시계열에서 차분을 통해 추세와 계절성을 제거해 정상성을 확보한 후 ARMA 모델을 적용하는 방식이다(AR + I + MA = 과거 Data + 차분 + 과거 오차).

 ARIMA(p, d, q)에서 p는 자기회귀 차수로 과거데이터 개수, d는 비정상성을 제거하기 위한 차분 횟수, q는 이동평균 차수로 오차항 개수를 말한다.

- 비정상 데이터 차분

# 1차 차분 적용
data_diff = data.diff().dropna()

# ADF 검정으로 정상성 확인
from statsmodels.tsa.stattools import adfuller
adf_result = adfuller(data_diff)
print(f"ADF Statistic: {adf_result[0]}")
print(f"P-value: {adf_result[1]}")

 

- ARIMA 모형 구현

from statsmodels.tsa.arima.model import ARIMA

# ARIMA 모형적용
model = ARIMA(data, order=(p, d, q)) # 적합한 차수와 차분횟수인 p,d,q를 넣어주기
model_fit = model.fit()

model_fit.summary() # 결과 출력

 

6. SARIMA 

 ARIMA 모형에 계절성을 포함하여 비정상적 시계열 데이터를 모델링하는 방식이다. 계절성은 일정 간격으로 반복되는 패턴을 나타내며 SARIMA는 이를 효과적으로 반영하여 예측 성능을 높인다.

 SARIMA 모델은 비계절 부분(p, d, q)과 계절 부분(P, D, Q, s)으로 구성된다. P는 계절적 자기회귀 차수, D는 계절적 차분 횟수. 계절성 패턴 제거를 위해 몇 번 차분할지, Q는 계절적 이동평균 차수, s는 계절주기(예: 주간데이터면 52, 월별데이터는 12, 분기별 데이터는 4 → 1년을 몇 개로 쪼갤지)

- SARIMA 구현

from statsmodels.tsa.statespace.sarimax import SARIMAX

# SARIMA 모형 적용 (p, d, q), (P, D, Q, s)
model = SARIMAX(data, order=(p, d, q), seasonal_order=(P, D, Q, s))
model_fit = model.fit()
model_fit.summary() # 결과 출력

 

7. 성능지표

- RMSE (Root Mean Squared Error)

 예측값과 실제값 사이의 차이(잔차)의 제곱 평균을 계산한 후, 제곱근을 취한 값으로, 큰 오차에 더 민감한 지표다. 중요한 데이터 포인트에 큰 오차가 발생했을 때 이를 고려하고자 할 때 유용하다.

- MAE (Mean Absolute Error)

 MAE는 예측 오차의 절댓값 평균을 구하는 지표로, RMSE에 비해 큰 오차보다는 작은 오차들에 대해 좀 더 균형 있게 평가한다. 모든 오차에 동일한 가중치를 부여하고자 할 때 사용된다.

- MAPE (Mean Absolute Percentage Error)

 MAPE는 예측 오차를 실제값에 대한 백분율로 나타내며, 각 데이터 포인트에서의 상대적인 오차를 측정하는 지표다. 실제값이 0에 가까운 경우 계산이 불안정할 수 있으므로 주의해야 한다.

- Prophet 모형의 performance_metrics() 함수

 시계열 데이터 df(반드시 컬럼명이 ds, y)를 가지고 교차검증 후 performance_metrics 함수로 성능지표를 확인한다.

from fbprophet import Prophet
from fbprophet.diagnostics import cross_validation, performance_metrics

# Prophet 모델 생성 및 피팅
model = Prophet()
model.fit(df)

# 미래 예측
future = model.make_future_dataframe(periods=365)
forecast = model.predict(future)

# 교차검증 (cutoff 날짜를 기준으로 데이터를 나누고 예측)
df_cv = cross_validation(model, initial='730 days', period='180 days', horizon='365 days')

# 성능 지표 계산
df_p = performance_metrics(df_cv)

# 성능 지표 확인
print(df_p.head())  # MSE, RMSE, MAE, MAPE 등이 포함된 데이터프레임 출력

 

8. 잔차분석

 모델링하지 못한 에러가 무작위성을 띄는지 검증하는 방법으로 시계열에서는 자기상관함수와 Ljung-Box 검정 방법을 이용해 확인한다.

 ACF 분석과 Ljung-Box 통계량을 통해 잔차가 백색소음이라면 모델이 데이터를 적절하게 설명한 것으로 간주할 수 있다. 잔차에 패턴이 발견된다면, 모델을 다시 설정하거나 더 복잡한 모형을 사용할 필요가 있다.

- ACF (자기상관함수)

 잔차의 자기상관이 없는지 확인하기 위한 도구로, ACF 그래프에서 모든 시차에서 유의미한 상관관계가 없을 때 잔차가 백색소음임을 의미한다. 즉, 잔차가 과거 값과 상관성이 없어야 좋은 모델이라고 할 수 있다.

- Ljung-Box Q 통계량

 잔차들이 상관되어 있는지 여부를 테스트한다.

from statsmodels.stats.diagnostic import acorr_ljungbox

# Ljung-Box test for white noise
lb_test = acorr_ljungbox(model_fit.resid, lags=[10], return_df=True)
print(lb_test)

 

9. 모델 평가

 모델 선택에서 AIC(Akaike Information Criterion)와 BIC(Bayesian Information Criterion)는 중요한 평가 지표로 사용된다. 모델의 적합도모델의 복잡성을 동시에 고려하여, 데이터에 가장 적합한 모델을 선택할 수 있도록 돕는다.

- AIC

 모델의 복잡성을 고려하여, 적합도와 모델의 자유도를 조정한 지표이다. AIC는 낮을수록 좋은 모델로 데이터를 얼마나 잘 설명하는지와 동시에 모델의 복잡성을 페널티로 부여합니다.

- BIC

 BIC는 AIC와 달리 샘플 수 n에 대한 로그값을 사용해 모델 복잡성에 더 큰 패널티를 부여한다.

- AIC와 BIC 평가 코드

 AIC와 BIC는 가장 낮은 값을 가진 모델을 선택하는 것이 원칙이다. 두 지표 모두 낮을수록 더 좋은 모델로 간주하지만, BIC는 더 간소한 모델을 선호한다. 특히, 샘플 수가 많을 때 BIC는 더 엄격한 기준을 제시다.

# 모델링
model_arima = ARIMA(data, order=(p, d, q))
model_fit = model_arima.fit()

# AIC, BIC확인
print(f"AIC: {model_fit.aic}")
print(f"BIC: {model_fit.bic}")