Overview
timeseries-forcast

시계열 예측의 두 가지 접근법

시계열 데이터의 미래를 예측(Forecasting)하는 데에는 크게 통계적 접근과 머신러닝 접근이 있음. 두 방법 모두 과거 p개의 데이터 시퀀스를 사용하여 현재(또는 미래)의 값을 예측한다는 공통된 목표를 가짐.

  1. 통계적 접근 (Statistical Approach)

    • ARIMA와 같은 전통적인 통계 모델을 사용함. Python에서는 statsmodels 패키지를 통해 구현됨.
    • 이 접근법은 데이터가 특정 확률 과정을 따른다고 가정하며, 모델은 이 과정의 파라미터를 추정함. AR(p) 모델의 수식은 다음과 같음. Xt=a0+i=1paiXti+etX_t = a_0 + \sum_{i=1}^{p} a_i X_{t-i} + e_t 여기서 ete_t는 white noise 오차항을 의미함.
  2. 머신러닝 접근 (Machine Learning Approach)

    • 시계열 예측을 일반적인 회귀(Regression) 문제로 재정의함. 다층 퍼셉트론(MLP)과 같은 모델을 사용함.
    • 이 접근법은 데이터의 기저 확률 분포를 가정하지 않고, 입력과 출력 간의 복잡한 비선형 관계를 학습하는 데 중점을 둠. Xtf(Xt1,Xt2,,Xtp)X_t \approx f(X_{t-1}, X_{t-2}, \dots, X_{t-p}) 여기서 ff는 신경망과 같은 머신러닝 모델을 의미함.

통계적 접근 : statsmodels를 이용한 AR 모델

Python의 statsmodels 라이브러리는 시계열 분석을 위한 포괄적인 도구를 제공함. 이를 사용한 AR 모델링 과정은 다음과 같음.

  • 데이터 탐색: 시계열 데이터를 시각화하여 패턴, 추세, 계절성 등을 직관적으로 파악함.
  • 모델 식별 및 추정: ACF, PACF 플롯을 통해 적절한 차수(p)를 결정하고, statsmodels를 사용하여 AR(p) 모델을 데이터에 적합(fit)시킴. 결과로 각 시차(lag)의 계수(aia_i), 표준 오차, p-value 등이 포함된 통계적 요약 정보가 제공됨.
  • 예측 및 평가: 학습된 모델을 사용하여 미래 기간의 값을 예측(forecast)하고, 이를 실제 관측값(Test set)과 비교하여 모델의 성능을 시각적으로 검증함.
Example (Timeseries forecasting Implementation by AR model)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.ar_model import AutoReg
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
np.random.seed(42)
# generate data - daily CTR
n = 200
time = pd.date_range(start='2024-01-01', periods=n, freq='D')
ctr = np.sin(np.linspace(0, 4*np.pi, n)) * 0.02 + 0.05 + np.random.normal(scale=0.005, size=n)
df = pd.DataFrame({'date': time, 'ctr': ctr})
df.set_index('date', inplace=True)
# plot the data
df['ctr'].plot(title='Daily CTR', figsize=(10, 6))
plot_pacf(df['ctr'], lags=30)
# split into train and test sets
train_size = int(len(df) * 0.8)
train, test = df.iloc[:train_size], df.iloc[train_size:]
# fit AR model
ar_model = AutoReg(train['ctr'], lags=17).fit()
forcast = ar_model.predict(start=len(train), end=len(train)+len(test)-1, dynamic=False)
# plot the results
plt.plot(train.index, train['ctr'], label='Train')
plt.plot(test.index, test['ctr'], label='Test', color='orange')
plt.plot(test.index, forcast, label='Forecast', color='red')
plt.legend()
# exogenous variables can be added as well
exog = pd.get_dummies(df.index.dayofweek)
exog_columns = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
exog.index = df.index
exog_train, exog_test = exog.iloc[:train_size], exog.iloc[train_size:]
# fit AR model
ar_model = AutoReg(train['ctr'], lags=17, exog=exog_train).fit()
forcast = ar_model.predict(start=len(train), end=len(train)+len(test)-1, exog_oos=exog_test)
# plot the results
plt.plot(train.index, train['ctr'], label='Train')
plt.plot(test.index, test['ctr'], label='Test', color='orange')
plt.plot(test.index, forcast, label='Forecast', color='red')
plt.legend()

머신러닝 접근: 다층 퍼셉트론 (Multilayer Perceptron, MLP)

MLP는 입력층, 하나 이상의 은닉층, 출력층으로 구성된 인공 신경망임. 시계열 데이터에 MLP를 적용하기 위해서는 데이터를 지도 학습(Supervised Learning)에 적합한 형태로 변환하는 전처리 과정이 필수적임.

Explanation (시계열의 지도 학습 데이터 변환)

슬라이딩 윈도우(Sliding Window) 기법을 사용하여 시계열 데이터를 feature와 target 쌍으로 재구성함. lag는 윈도우의 크기, 즉 입력 feature로 사용할 과거 데이터의 개수를 의미함.

예를 들어, 시계열 X={x1,x2,x3,x4,x5,}X = \{x_1, x_2, x_3, x_4, x_5, \dots\}lag=2가 주어졌을 때, 학습 데이터셋은 다음과 같이 구성됨.

Input Features (X)Target (y)[x1,x2]x3[x2,x3]x4[x3,x4]x5\begin{array}{c|c} \text{Input Features } (X) & \text{Target } (y) \\ \hline [x_1, x_2] & x_3 \\ {[x_2, x_3]} & x_4 \\ {[x_3, x_4]} & x_5 \\ \vdots & \vdots \end{array}

MLP의 학습 과정 (Training)

MLP는 순전파와 역전파를 반복하여 손실 함수를 최소화하는 최적의 가중치(ww)와 편향(bb)을 학습함.

  1. 순전파 (Forward Pass): 입력 데이터가 신경망을 통과하여 최종 예측값을 계산하는 과정.
  2. 손실 계산 (Compute Loss): 예측값과 실제값 사이의 오차를 손실 함수(예: Mean Square Error)를 통해 정량화함.
  3. 역전파 (Backward Pass): 손실에 대한 각 가중치와 편향의 미분값(gradient)을 역전파(Backpropagation) 알고리즘을 사용하여 계산함.
  4. 파라미터 업데이트 (Update Parameters): 계산된 gradient를 사용하여 가중치와 편향을 손실이 감소하는 방향으로 조정함 (예: 경사 하강법).

이 과정은 손실이 수렴하거나 지정된 횟수(Epochs)만큼 반복됨.

MLP에서의 Lag의 중요성

시계열 신경망에서 Lag (시차)는 모델의 구조와 성능을 결정하는 가장 중요한 하이퍼파라미터 중 하나임.

  1. 입력 구조 결정: Lag 값은 신경망 입력층(Input Layer)의 노드 수를 결정함.
  2. 역사적 정보의 양: Lag은 모델이 예측을 위해 참고할 과거 정보의 양을 결정함.
  3. 정보량과 샘플 크기의 상충 관계 (Trade-off):
    • Lag 증가: 더 많은 과거 정보를 사용하여 복잡한 패턴 학습이 가능해지나, 변환 과정에서 손실되는 데이터가 많아져 전체 학습 샘플 수는 감소함.
    • Lag 감소: 더 많은 학습 샘플을 확보할 수 있으나, 예측에 사용할 정보가 부족해질 수 있음.

최적의 Lag 값을 찾는 것은 하이퍼파라미터 최적화의 핵심 과제임.

MLP 하이퍼파라미터 최적화

최적의 MLP 모델을 찾는 과정은 하이퍼파라미터와 파라미터에 대한 이중 최적화 문제로 볼 수 있음.

Definition (파라미터 vs. 하이퍼파라미터)
  • 파라미터 (w\mathbf{w}): 모델이 학습을 통해 직접 찾는 변수 (가중치, 편향).
  • 하이퍼파라미터 (θ\theta): 모델 학습 전에 사용자가 설정하는 값 (lag, 학습률, 은닉층 수 등).
  1. 내부 최적화 (파라미터 탐색): 주어진 하이퍼파라미터 집합(θ\theta) 하에서, 훈련 데이터(DtrainD_{train})의 손실 함수(LL)를 최소화하는 최적의 가중치(ww^*) 를 찾음 (모델 학습).

    wargminwWL(w;θ,Dtrain)w^* \in \arg \min_{w \in W} L(w; \theta, D_{\text{train}})
  2. 외부 최적화 (하이퍼파라미터 탐색): 여러 하이퍼파라미터(θ\theta) 조합에 대해 내부 최적화를 반복 수행하고, 그 결과로 얻어진 최적 가중치(ww^*)들을 사용하여 검증 데이터(DtestD_{\text{test}})에서 가장 낮은 손실(ll)을 보이는 최적의 하이퍼파라미터 집합(θ\theta) 을 찾음.

    minθΩl(θ,w(θ);Dtest)\min_{\theta \in \Omega} l( \theta, w^*(\theta); D_{\text{test}})