Math & Statistics/Forecasting: Principles and Practice

7. 지수 평활 - part 1

corycory 2022. 7. 9. 16:30
728x90
반응형
Forecasting: Principles and Practice 2nd Edition을 공부한 내용을 기록, 정리하고 있습니다. 

 

지수평활 (Exponential smoothing)으로 예측한 값은 과거 관측값들의 가중 평균이다. 이때 각 가중치는 오래된 관측값일수록 가중치가 기하급수적으로 (exponentially) 감소한다.

 

7.1 Simple Exponential Smoothing (SES)

지수평활 방법 중에 가장 단순한 방법이다. 트렌드나 계절성이 보이지 않는 데이터에 가장 잘 작동한다.

지수평활을 나타내는 방식에는 여러가지(가중평균 형식, 성분 형식 등)가 있는데, 나는 가중평균 형식이 이해하기 쉬웠다. 

 

가중평균 형식 (weighted average form)

앞에서 보았던 나이브 방식은 가장 마지막 관측값만 사용하고, 그 이전의 관측값은 예측에 사용하는 방식인데 이 방식 역시 지수평활의 일조이라고도 볼 수 있다. 가장 최근의 관측값에만 가중치 100%를 사용하고 나머지에는 0%를 부여하는 방식.

반면 이동평균식의 방식은 최근 n개의 값의 평균을 예측치로 사용하며, n개의 값에 동일한 가중치가 부여되고 있다. 

지수평활은 이 두가지 방법의 절충안이라고 보아도 좋을 것이다. 여러 개의 과거 관측값을 사용하되, 최근의 값들에 더 큰 가중치를 부여하는 것이다. 지수평활 방식을 수식으로 나타내면 아래와 같다. smoothing parameter인 알파의 값이 클수록 과거 값들의 가중치가 급속도로 줄어들게 된다. 알파값이 1이라면 나이브 방식과 동일한 방식이 된다. 

 

알파의 값은 0과 1사이이다

 

이를 이용해서 각각의 예측값 (fitted value)를 구하는 공식은 아래처럼 된다. 

 

 

평평한 예측값 (flat forecast)

모든 SES의 예측값들은 평평한 예측값을 갖고 있는데, 수식으로 표현하면 아래와 같다. 때문에 단순 지수평활 방식은 트렌드나 계절성이 보이지 않는 데이터에 적합하다는 것을 다시 한번 기억하자.

 

 

최적화

모든 지수평활법에서 모델을 최적화 하는 방법은 최초의 초기값과, smoothing parameter의 설정에 달려 있다. 단순 지수평활 방식에서는 각 1개의 초기값과 smoothing parameter를 설정해주면 되지만, 더 복잡한 모델에서는 여러 개의 초기값과 여러 개의 smoothing parameter 설정이 필요할 수 있다. 경우에 따라, 분석하는 사람이 주관적으로 smoothing parameter를 설정할수도 있다 (과거 경험에 따르면 대강 이 정도가 잘 맞았지~). 하지만 관측값을 이용해 적정한 smoothing parameter를 정하는 것이 더 좋을 것이다. 그러면 어떻게 이 적정한 smoothing parameter를 정할 것인가?

섹션 5.2에서 SSE를 이용해서 회귀 모델의 적정 계수를 측정해 냈던 기억을 되살려보자. 회귀모델과 비슷하게, 지수평활법의 적정한 smoothing parameter 또한 SSE를 최소화 하는 값을 찾아냄으로써 알아낼 수 있다. 회귀모델과 차이점이라면 선형모델이 아닌 방식으로 최적화를 진행한다는 점이다. 

 

 

R의 SES 함수 문서(https://www.rdocumentation.org/packages/forecast/versions/8.16/topics/ses)를 보면 기본적으로 들어가 있는 함수가 최적화된 parameter 값을 찾아주며, 예측 방법은 단순지수평활로 설정되어 있다.

 

책에서는 사우디 아라비아의 오일 데이터를 예시로 단순지수평활을 사용한다. 

 

## 데이터 불러오기 
oildata <- window(oil, start=1996)

# Estimate parameters
## SES 함수는 자동적으로 최적화된 패러미터를 찾아준다. 
fc <- ses(oildata, h=5)

# Accuracy of one-step-ahead training errors
round(accuracy(fc),2)
#>               ME  RMSE   MAE MPE MAPE MASE  ACF1
#> Training set 6.4 28.12 22.26 1.1 4.61 0.93 -0.03

## 최적화된 패러미터값 확인하는 방법
> summary(fc)

Forecast method: Simple exponential smoothing

Model Information:
Simple exponential smoothing 

Call:
 ses(y = oildata, h = 5) 

  Smoothing parameters:
    alpha = 0.8339 

  Initial states:
    l = 446.5868 

  sigma:  29.8282

     AIC     AICc      BIC 
178.1430 179.8573 180.8141 

Error measures:
                   ME     RMSE     MAE      MPE     MAPE      MASE        ACF1
Training set 6.401975 28.12234 22.2587 1.097574 4.610635 0.9256774 -0.03377748

Forecasts:
     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
2014       542.6806 504.4541 580.9070 484.2183 601.1429
2015       542.6806 492.9073 592.4539 466.5589 618.8023
2016       542.6806 483.5747 601.7864 452.2860 633.0752
2017       542.6806 475.5269 609.8343 439.9778 645.3834
2018       542.6806 468.3452 617.0159 428.9945 656.3667

 

위 코드에서 SES 함수가 자동적으로 최적화된 패러미터 값을 찾아주고, 해당 함수가 찾아낸 최적화된 초기값은 446.5868, 알파는 0.8339이다 (summary(fc) 명령어를 쳐서 확인할 수 있다). 그러면 이제 이렇게 구한 단순지수 평활방법의 예측값을 한번 살펴보자. 아래 코드를 돌려서 fitted value를 플롯한다. 

 

autoplot(fc) +
  autolayer(fitted(fc), series="Fitted") +
  ylab("Oil (millions of tonnes)") + xlab("Year")

 

위 데이터의 과거 관측값과, 과거 관측값들의 시점에 대한 과거의 예측값 또한 같이 나타내어져 있다. 이 경우는 위에서 봤듯이 알파값이 0.83으로 매우 큰 편이었기 때문에 예측값이 시간에 따라 큰 폭으로 변하고 있다. 알파값이 작으면 시간에 따른 예측값의 변동도 적어진다. 마지막으로, 2014년 부터의 예측값의 prediction interval이 매우 큰 폭이다. 이는 비록 예측값을 만들어두긴 했지만, 미래의 값에 대한 불확실성이 매우 크다는 이야기이다. 

 

7.2 Trend Methods (추세 기법)

Holt's linear trend method (홀트의 선형 추세 기법)

홀트는 좀전에 살펴본 단순평활기법을 좀더 발전시켜서, 추세가 있는 데이터에도 사용할 수 있게 만들었다. 이 방법을 사용하는덴 하나의 예측식과, 두개의 평활식(하나는 수준 공식, 다른 하나는 추세 공식)이 필요한데, 이들은 아래와 같다. 

 

l(t): t시간의 수준 추정값, b(t)는 시간 t에서의 기울기 추정값, alpha는 수준에 대한 매개변수, beta는 추세에 대한 매개변수이다.

 

위 공식의 수준 공식(level equation)은 단순평활기법에서와 비슷하게, l(t)가 관측값 y(t)의 가중평균이며 시간 t에 대한 한단계 앞선 예측의 학습(training) 값이라는 것을 나타낸다. 추세공식(trend equation)은 b(t)가 (l(t) - l(t-1))과 b(t-1)에 기반한 t시간의 예측 추세의 가중평균이라는 것을 알 수 있다. 따라서 이 예측 공식은 앞의 SES와 달리 평평하지 않고 추세가 있다. h 스텝 예측의 예측값은 마지막 예측 수준 + h*마지막 예측 추세값이다. 따라서, 예측값은 h에 대한 선형 공식이 된다. 

 

항공기 여객 예시

앞에서 사용한 SES와 비슷하게, 함수의 디폴트값을 쓰면 알아서 최적화를 시킨다. 

 

### 데이터 불러오기 
> air <- window(ausair, start=1990)

## 디폴트값으로 돌리면 알아서 패러미터값을 최적화하고 모델을 만든다. 
> fc <- holt(air, h=5)

## 함수의 패러미터 값 확인하기
> summary(fc)

Forecast method: Holt's method

Model Information:
Holt's method 

Call:
 holt(y = air, h = 5) 

  Smoothing parameters:
    alpha = 0.8302 
    beta  = 1e-04 

  Initial states:
    l = 15.5715 
    b = 2.1017 

  sigma:  2.3645

     AIC     AICc      BIC 
141.1291 143.9863 147.6083 

Error measures:
                      ME     RMSE     MAE        MPE     MAPE      MASE        ACF1
Training set 0.008359331 2.182343 1.52892 -0.3244107 3.820787 0.6654839 -0.01335362

Forecasts:
     Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
2017       74.60130 71.57106 77.63154 69.96695 79.23566
2018       76.70304 72.76440 80.64169 70.67941 82.72668
2019       78.80478 74.13092 83.47864 71.65673 85.95284
2020       80.90652 75.59817 86.21487 72.78810 89.02494
2021       83.00826 77.13343 88.88310 74.02348 91.99305

 

위 서머리에서 보면 알파값: 0.83, 베타값: 0.0001로 나온다. 이 smoothing parameter들과 l, b의 최초값은 SES에서 다루었던 원스텝 학습 오차를 최소화하는 값으로 구해진다. 이렇게 아주 작은 베타값의 경우는 기울기(추세)가 매우 느리게 변하고 있음을 가리킨다. 

 

Damped Trend Methods (감쇠 추세 기법)

좀전에 본 Holt's linear method의 가정은 추세가 상수이며 꾸준히 한 방향으로 상승 또는 감소하고 있는 것을 가정한다. 장기적으로 예측을 하게 될 경우 이런 식의 예측방식은 잘 맞지 않을 것이다. 이를 보완하기 위해 가드너 & 맥켄지는 먼 미래의 추세를 평평하게 만드는 '감쇠' parameter를 사용하는 방법을 도입했는데, 현재는 꽤 인기있는 기법 중 하나가 되었다. 감쇠 추세법의 공식들은 다음과 같다.

 

 

앞에서 사용한 알파, 베타 패러미터 외에도 감쇠 패러미터 파이(ϕ)가 추가된다. 파이 역시 기존 알파, 베타처럼 0과 1사이의 값을 가지며 만약 ϕ=1인 경우 감쇠 추세기법은 홀트의 선형기법과 동일해진다. ϕ가 0과 1 사이의 값일때 추세는 먼 미래의 어느 시점에 평평해지게 된다. 즉 단기적인 예측은 추세가 있으나 장기적 예측에는 추세가 사라지게 된다. 현실적으로, ϕ가 0.8보다 적은 경우는 적은데, 이유는 감쇠 효과가 작은 값들에 강한 효과가 있기 때문이다. 1에 가까운 ϕ값은 감쇠 모델이 비감쇠 모델과 구분하기 어렵다는 이야기가 된다. 이 때문에 감쇠모델을 사용하고자 할 때는 주로 ϕ값을 0.8과 0.98 사이로 잡고 사용한다. 

 

항공객 예시

여기서는 감쇠의 효과를 더 주기 위해 일부러 ϕ=0.9로 낮게 잡았다. 보통은 ϕ 값 또한 모델에서 적정한 값을 찾아 사용하게 최적화 방법을 이용하는 편이긴 하다. 또한, 장기적 예측 결과를 확인하기 위해 (감쇠모델은 평평해지니까) h=15로 장기 예측 모델을 사용하였다. 

 

## 앞에서 사용했던 홀트 선형기법
> fc <- holt(air, h=15)

## damped=TRUE 옵션으로 감쇠를 켜고 phi값을 설정해준다. 
> fc2 <- holt(air, damped=TRUE, phi = 0.9, h=15)

## 두 모델의 예측값 플롯
> autoplot(air) +
+   autolayer(fc, series="Holt's method", PI=FALSE) +
+   autolayer(fc2, series="Damped Holt's method", PI=FALSE) +
+   ggtitle("Forecasts from Holt's method") + xlab("Year") +
+   ylab("Air passengers in Australia (millions)") +
+   guides(colour=guide_legend(title="Forecast"))

 

 

양 예시

이번에는 ϕ값을 임의로 정하지 말고 모델에서 알아서 추정하게 하는 방식으로 예측해보자. 

 

## holt 모델 
> fc <- holt(livestock, damped=TRUE)

## 모델의 패러미터 값 확인하기
> fc[['model']]
Damped Holt's method 

Call:
 holt(y = livestock, damped = TRUE) 

  Smoothing parameters:
    alpha = 0.9999 
    beta  = 3e-04 
    phi   = 0.9798 

  Initial states:
    l = 223.35 
    b = 6.9046 

  sigma:  12.8435

     AIC     AICc      BIC 
427.6370 429.7370 438.7379

 

그리고 위에서 추정한 fc 모델의 예측값을 그린 그래프. 추세가 증가하고 있으며, 과거의 변동성을 반영하며 confidence interval의 너비가 꽤 넓은 것을 확인할 수 있다 (이 confidence interval의 범위 계산은 7.7에서 다룰 예정이다).

 

 

위와 같은 예시에서는 damped Holt가 가장 낫다고 명확하게 알 수 있지만, 종종 어떤 방식으로 accuracy를 평가할 것인지에 따라 어떤 예측모델을 써야할지 달라지기도 한다. 예측 방법은 테스트 셋의 사이즈, 예측 기간, 오차 평가 방법 등등 많은 요소에 따라 다양해질 수 있기 때문이다. 

반응형