- Overfitting(과대적합)
- score, accracy는 높게 나오나, 너무 기존 데이터에 적합해서 새 데이터는 예측을 제대로 하지 못하는 경우
- Underfitting(과소적합)
- 모델이 데이터셋 규칙을 잘 찾지 못해 성능이 낮음
- 학습 데이터를 잘 이해하지 못한 것
- Auto-Arima
- R언어 제공 함수 -> 파이썬으로 옮겨옴
- 단위근 검정, AICc 최소화, MLE 사용 -> ARIMA의 p,d,q 및 계수 자동 찾기
- Likelihood(우도법 및 가능도)
- 데이터가 특정 분포로부터 만들어졌을 확률 의미(가능성)
- Likelihood Function(가능도 함수)
- 데이터에 대한 확률 분포 값 모두 곱한 것
- Log Likelihood(로그 가능도)
- likelihood가 최대가 되는 분포 -> MLE가 됨!
- MLE(Maximum Likelihood Estimation, 최대우도법)
- likelihood가 최대가 되는 파라미터 값 찾는 것
- Box-jenkins(박스 젠킨스)
- 자동회귀 이동평균 or 자동회귀 누적이동평균 모델의 적용 -> 최적 시계열 모델 찾는 것
AR(p)
모델MA(q)
모델p
: AR lagged valuesd
: 차분 개수q
: MA lagged errors
그래프 종류 | AR(p) | MA(q) | ARMA |
---|---|---|---|
ACF plot | 천천히 감소 | Lag q 이후 빠르게 감소 | 가파른 절단 ❌ |
PACF plot | Lag p 이후 빠르게 감소 | 천천히 감소 | 가파른 절단 ❌ |
순서
- 초기 파라미터(p,d,q) 추정 - 시각화, 도메인 지식 등을 바탕으로
- 모델 적합 ➡️ 시각화 및 성능 평가 수행
- 부적합 ➡️ 파라미터 조정
- 위를 반복하는 것
일반적인 과적합 기준
- 차분(d)이 2를 넘어가는 경우
- AR(p) MA(q) 3을 넘어가는 경우
결정론적 시계열 + 확률론적 시계열
로 작성될 수 있음
- Error Terms(오차항) : ε
- 독립변수 x가 주어진 경우의
종속변수 y 실제 값 & 예측값의 차이
- Regression Analysis(회귀 분석)
- 독립변수 x가 종속변수 y에 미치는 영향과 관계를 통계 모델로 예측, 분석
- dynamic regression model(동적 회귀 모델)
- 시계열 분석 모델 : 과거 시점 정보는 볼 수 있으나, 그 외 정보는 보기 어려움
- 회귀 분석 모델 : 관련 변수 추가 가능하나, 시계열 분석 모델에서 사용하는 장점을 쓸 수 없음
➡️ 이 2가지 모델을 합친 것!- 회귀에 자기 상관 추가(오차항을 넣어서)
- Time series regression(시계열 회귀)
- 일반적인 회귀 분석 모델
- 독립변수, 종속변수 모두 time series만으로 구성
- independent and identically distributed(독립 항등 분포)
- 여러 확률 변수들이 각각 통계적으로 독립 + 동일 확률 분포를 가지고 있는 경우를 말함
- iid
SARIMA
ARIMAX(dynamic regression)
SARIMAX
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.arima.model import ARIMA
import pmdarima as pm
Daily_Demand_Forecasting_Orders
df = pd.read_csv('{경로}/Daily_Demand_Forecasting_Orders.csv', delimiter=';')
df.columns
data = df['Target (Total orders)']
plt.plot(data)
plt.show()
ACF와 PACF에서는 유의미한 lag가 보이지 않음
model1 = ARIMA(data, order=(1,0,0))
model2 = ARIMA(data, order=(0,0,1))
model3 = ARIMA(data, order=(1,0,1))
res1 = model1.fit()
res2 = model2.fit()
res3 = model3.fit()
print(res1.summary())
print(res2.summary())
print(res3.summary())
AIC, BIC 값을 봤을 때, res2가 가장 적합한 모델 즉, (0,0,1)의 경우가 가장 적합한 것으로 추측됨
predictions = res2.fittedvalues
plt.figure()
plt.plot(data)
plt.plot(predictions)
plt.show()
이렇게 다른 경우가 많기 때문에, Auto ARIMA를 이용함
model = pm.AutoARIMA(seasonal=False, stepwise=True, suppress_warnings=True, trace=True)
res = model.fit(data)
print(res.summary())
결과 분석
- 최선의 모델은 ARIMA(0, 0, 0)
- 하지만, 백색잡음 값이라 유의미한 예측은 불가능..