12.8 학습 데이터와 테스트 데이터 예측하기

흔히, 학습 데이터에 대해 한 단계 예측값(“적합값(fitted value)”)을 계산하고 테스트 데이터에 대해 여러 단계 예측값을 계산합니다. 하지만, 가끔 학습 데이터에 대해 여러 단계 예측값을 계산하고 싶거나 테스트 데이터에 대해 한 단계 예측값을 계산하고 싶을 수도 있습니다.

학습 데이터에 대한 여러 단계 예측값

보통, 학습 데이터에 대해 한 단계 예측값이 되도록 적합값(fitted value)을 정의합니다만(3.3 절을 참고하시길 바랍니다), 비슷한 접근 방식을 여러 단계 예측값에도 적용할 수 있습니다. 호주 외식 지출 데이터에 ARIMA(2,1,1)(0,1,2)\(_{12}\) 모델을 사용한 기법을 살펴보겠습니다. 마지막 5년은 테스트 데이터로 사용했습니다.

training <- subset(auscafe, end=length(auscafe)-61)
test <- subset(auscafe, start=length(auscafe)-60)
cafe.train <- Arima(training, order=c(2,1,1),
  seasonal=c(0,1,2), lambda=0)
cafe.train %>%
  forecast(h=60) %>%
  autoplot() + autolayer(test)
호주 카페 학습 데이터에 맞춘 ARIMA 모델에서 얻은 예측값.

Figure 12.7: 호주 카페 학습 데이터에 맞춘 ARIMA 모델에서 얻은 예측값.

fitted() 함수에는 학습 데이터에 대해 \(h\) 단계 “적합값(fitted value)”을 허용하는 h라는 입력값이 있습니다. 이전 절에서 다룬 호주 외식 지출 데이터를 다루었습니다. 여기에서 모델에 사용된 학습 데이터가 있습니다. 이 학습 데이터에 대한 12 단계 앞 예측값을 그래프로 나타냈습니다. 모델에 계절성 차분(시차 12)와 1차 차분(시차 1) 둘 다 있기 때문에, 처음 몇 개의 관측값에 대해 예측값을 계산할 수 없습니다.

autoplot(training, series="학습 데이터") +
  autolayer(fitted(cafe.train, h=12),
    series="12-단계 적합값")
호주 카페 학습 데이터에 맞춘 ARIMA 모델에서 얻은 12단계 적합값.

Figure 12.8: 호주 카페 학습 데이터에 맞춘 ARIMA 모델에서 얻은 12단계 적합값.

테스트 데이터에 대한 한 단계 예측값

학습 데이터를 가지고 모델을 맞춘 후에 테스트 데이터로 성능을 평가하는 것은 흔한 일입니다. 보통 이렇게 하는 방식에는 테스트 데이터에 대해 비교할 때 다른 예측 수평선을 사용한다는 의미가 담겨 있습니다. 위의 예제에서는, 테스트 데이터로 마지막 60개 관측값을 사용하고, 학습 데이터에 대한 예측 모델을 평가했습니다. 그러면 예측 오차들은 1-단계, 2-단계, …, 60-단계 앞이 될 것입니다. 예측 분산은 보통 예측 수평선에 따라 증가합니다. 따라서 테스트 데이터에서 단순하게 절대값을 취하는 오차나 제곱근 오차를 평균한다면, 이는 서로 다른 여러 분산값을 조합하는 결과가 됩니다.

이러한 문제를 해결하는 방법 중에 하나는 테스트 데이터에 대해 1-단계 오차를 구하는 것입니다. 즉, 어떤 매개변수를 추정하기 위해 학습 데이터를 계속 사용합니다만, 테스트 데이터로 예측값을 계산할 때, 각각의 (학습 데이터와 테스트 데이터) 관측값 이전의 모든 데이터를 사용합니다. 그래서 시간 \(1,2,\dots,T-20\)에 대한 학습 데이터는 입니다. 이러한 데이터에 대한 모델을 추정합니다만, \(h=1,\dots,T-1\)에 대해 \(\hat{y}_{T-60+h|T-61+h}\)을 계산합니다. 매개변수값을 추정하는데 테스트 데이터를 사용하지 않았기 때문에, 여전히 “타당한(fair)” 예측값이라고 볼 수 있겠습니다. ets(), Arima(), tbats(), nnetar() 등의 함수에서, model 입력값을 사용하여 이러한 계산을 쉽게 할 수 있습니다.

이제 위에서 사용한 것과 같은 ARIMA 모델을 사용하여, 모델을 테스트 데이터에 적용해보겠습니다.

cafe.test <- Arima(test, model=cafe.train)
accuracy(cafe.test)
#>                     ME    RMSE     MAE      MPE  MAPE
#> Training set -0.002622 0.04591 0.03413 -0.07301 1.002
#>                MASE     ACF1
#> Training set 0.1899 -0.05704

이 경우에 Arima()가 다시 추정하지 않는다는 것에 주의하시길 바랍니다. 대신에, 이전에 얻은 (그리고 cafe.train으로 저장된) 모델을 테스트 데이터에 적용합니다. 다시 추정해서 얻은 모델이 아니기 때문에, 여기에서 얻은 “잔차(residual)”는 실제로 한 단계 예측오차입니다. 결과적으로, accuracy() 명령으로 얻은 결과는 (결과에서 “학습 데이터”라고 부르긴 하지만) 실제로 테스트 데이터입니다.