이러한 모든 모델 (및 그 이상)을 지원하고 간단하게 맞추는 예측 패키지를 사용해야합니다 .
library(forecast)
x <- AirPassengers
mod_arima <- auto.arima(x, ic='aicc', stepwise=FALSE)
mod_exponential <- ets(x, ic='aicc', restrict=FALSE)
mod_neural <- nnetar(x, p=12, size=25)
mod_tbats <- tbats(x, ic='aicc', seasonal.periods=12)
par(mfrow=c(4, 1))
plot(forecast(mod_arima, 12), include=36)
plot(forecast(mod_exponential, 12), include=36)
plot(forecast(mod_neural, 12), include=36)
plot(forecast(mod_tbats, 12), include=36)
모델을 맞추기 전에 데이터를 부드럽게하지 않는 것이 좋습니다. 모델은 본질적으로 데이터를 부드럽게하려고 시도하기 때문에 사전 평활은 문제를 복잡하게 만듭니다.
새로운 데이터를 기반으로 편집 :
실제로 arima는이 교육 및 테스트 세트에서 선택할 수있는 최악의 모델 중 하나입니다.
데이터를 파일 호출에 저장 coil.csv
하고 R에로드 한 다음 훈련 및 테스트 세트로 분할했습니다.
library(forecast)
dat <- read.csv('~/coil.csv')
x <- ts(dat$Coil, start=c(dat$Year[1], dat$Month[1]), frequency=12)
test_x <- window(x, start=c(2012, 3))
x <- window(x, end=c(2012, 2))
다음으로 나는 일련의 시계열 모델에 맞습니다.
models <- list(
mod_arima = auto.arima(x, ic='aicc', stepwise=FALSE),
mod_exp = ets(x, ic='aicc', restrict=FALSE),
mod_neural = nnetar(x, p=12, size=25),
mod_tbats = tbats(x, ic='aicc', seasonal.periods=12),
mod_bats = bats(x, ic='aicc', seasonal.periods=12),
mod_stl = stlm(x, s.window=12, ic='aicc', robust=TRUE, method='ets'),
mod_sts = StructTS(x)
)
그런 다음 몇 가지 예측을하고 테스트 세트와 비교했습니다. 항상 평평한 수평선을 예측하는 순진한 예측을 포함했습니다.
forecasts <- lapply(models, forecast, 12)
forecasts$naive <- naive(x, 12)
par(mfrow=c(4, 2))
for(f in forecasts){
plot(f)
lines(test_x, col='red')
}
보시다시피, arima 모델은 추세가 잘못되었지만 "기본 구조 모델"의 모양과 비슷합니다.
마지막으로 테스트 세트에서 각 모델의 정확도를 측정했습니다.
acc <- lapply(forecasts, function(f){
accuracy(f, test_x)[2,,drop=FALSE]
})
acc <- Reduce(rbind, acc)
row.names(acc) <- names(forecasts)
acc <- acc[order(acc[,'MASE']),]
round(acc, 2)
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
mod_sts 283.15 609.04 514.46 0.69 1.27 0.10 0.77 1.65
mod_bats 65.36 706.93 638.31 0.13 1.59 0.12 0.85 1.96
mod_tbats 65.22 706.92 638.32 0.13 1.59 0.12 0.85 1.96
mod_exp 25.00 706.52 641.67 0.03 1.60 0.12 0.85 1.96
naive 25.00 706.52 641.67 0.03 1.60 0.12 0.85 1.96
mod_neural 81.14 853.86 754.61 0.18 1.89 0.14 0.14 2.39
mod_arima 766.51 904.06 766.51 1.90 1.90 0.14 0.73 2.48
mod_stl -208.74 1166.84 1005.81 -0.52 2.50 0.19 0.32 3.02
사용 된 측정 항목은 Hyndman, RJ 및 Athanasopoulos, G. (2014) "예측 : 원칙 및 실습" 에 설명되어 있으며 예측 패키지의 작성자이기도합니다. 나는 당신이 그들의 텍스트를 읽을 것을 강력히 추천합니다 : 그것은 온라인에서 무료로 구할 수 있습니다. 구조적 시계열은 MASE를 포함하여 여러 모델에서 가장 좋은 모델입니다. MASE는 모델 선택에 선호하는 메트릭입니다.
마지막 질문은이 테스트 세트에서 구조 모델이 운이 좋았습니까? 이를 평가하는 한 가지 방법은 훈련 세트 오류를 보는 것입니다. 트레이닝 세트 오류는 테스트 세트 오류보다 신뢰성이 떨어지지 만 (과도하게 맞을 수 있기 때문에)이 경우 구조 모델은 여전히 최상위에 있습니다.
acc <- lapply(forecasts, function(f){
accuracy(f, test_x)[1,,drop=FALSE]
})
acc <- Reduce(rbind, acc)
row.names(acc) <- names(forecasts)
acc <- acc[order(acc[,'MASE']),]
round(acc, 2)
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
mod_sts -0.03 0.99 0.71 0.00 0.00 0.00 0.08 NA
mod_neural 3.00 1145.91 839.15 -0.09 2.25 0.16 0.00 NA
mod_exp -82.74 1915.75 1359.87 -0.33 3.68 0.25 0.06 NA
naive -86.96 1936.38 1386.96 -0.34 3.75 0.26 0.06 NA
mod_arima -180.32 1889.56 1393.94 -0.74 3.79 0.26 0.09 NA
mod_stl -38.12 2158.25 1471.63 -0.22 4.00 0.28 -0.09 NA
mod_bats 57.07 2184.16 1525.28 0.00 4.07 0.29 -0.03 NA
mod_tbats 62.30 2203.54 1531.48 0.01 4.08 0.29 -0.03 NA
(신경망 과적 합, 훈련 세트에서 우수하고 테스트 세트에서 저조한 성능을 나타냄)
마지막으로, 2008-2009 년 / 2010 년 테스트, 2008-2010 년 / 2011 년 테스트, 2008-2011 년 / 2012 년 테스트, 훈련을 통해 이러한 모델을 모두 교차 검증하는 것이 좋습니다. 2008-2012 / 2013 년 테스트 및 이러한 모든 기간의 평균 오류입니다. 그 길을 가고 싶다면 github에서 교차 검증 시계열 모델을위한 부분적으로 완전한 패키지 가 있습니다. 나는 당신이 시도하고 피드백 / 풀 요청을 해주길 바랍니다 :
devtools::install_github('zachmayer/cv.ts')
library(cv.ts)
편집 2 : 내 자신의 패키지를 사용하는 방법을 기억하는지 보자!
우선, github에서 패키지를 설치하고로드하십시오 (위 참조). 그런 다음 전체 모델을 사용하여 일부 모델을 교차 검증하십시오.
library(cv.ts)
x <- ts(dat$Coil, start=c(dat$Year[1], dat$Month[1]), frequency=12)
ctrl <- tseriesControl(stepSize=1, maxHorizon=12, minObs=36, fixedWindow=TRUE)
models <- list()
models$arima = cv.ts(
x, auto.arimaForecast, tsControl=ctrl,
ic='aicc', stepwise=FALSE)
models$exp = cv.ts(
x, etsForecast, tsControl=ctrl,
ic='aicc', restrict=FALSE)
models$neural = cv.ts(
x, nnetarForecast, tsControl=ctrl,
nn_p=6, size=5)
models$tbats = cv.ts(
x, tbatsForecast, tsControl=ctrl,
seasonal.periods=12)
models$bats = cv.ts(
x, batsForecast, tsControl=ctrl,
seasonal.periods=12)
models$stl = cv.ts(
x, stl.Forecast, tsControl=ctrl,
s.window=12, ic='aicc', robust=TRUE, method='ets')
models$sts = cv.ts(x, stsForecast, tsControl=ctrl)
models$naive = cv.ts(x, naiveForecast, tsControl=ctrl)
models$theta = cv.ts(x, thetaForecast, tsControl=ctrl)
(과도하게 맞지 않도록 신경망 모델의 유연성을 줄였습니다)
모델에 적합하면 MAPE로 비교할 수 있습니다 (cv.ts는 아직 MASE를 지원하지 않습니다).
res_overall <- lapply(models, function(x) x$results[13,-1])
res_overall <- Reduce(rbind, res_overall)
row.names(res_overall) <- names(models)
res_overall <- res_overall[order(res_overall[,'MAPE']),]
round(res_overall, 2)
ME RMSE MAE MPE MAPE
naive 91.40 1126.83 961.18 0.19 2.40
ets 91.56 1127.09 961.35 0.19 2.40
stl -114.59 1661.73 1332.73 -0.29 3.36
neural 5.26 1979.83 1521.83 0.00 3.83
bats 294.01 2087.99 1725.14 0.70 4.32
sts -698.90 3680.71 1901.78 -1.81 4.77
arima -1687.27 2750.49 2199.53 -4.23 5.53
tbats -476.67 2761.44 2428.34 -1.23 6.10
아야. 우리의 구조적 예측은 운이 좋았던 것 같습니다. 장기적으로 순진한 예측은 12 개월 동안 평균적으로 최상의 예측을합니다 (arima 모델은 여전히 최악의 모델 중 하나임). 12 가지 예측 지평 각각에서 모델을 비교하고 이들 중 어느 것도 순진한 모델을 능가하는지 확인하십시오.
library(reshape2)
library(ggplot2)
res <- lapply(models, function(x) x$results$MAPE[1:12])
res <- data.frame(do.call(cbind, res))
res$horizon <- 1:nrow(res)
res <- melt(res, id.var='horizon', variable.name='model', value.name='MAPE')
res$model <- factor(res$model, levels=row.names(res_overall))
ggplot(res, aes(x=horizon, y=MAPE, col=model)) +
geom_line(size=2) + theme_bw() +
theme(legend.position="top") +
scale_color_manual(values=c(
"#1f78b4", "#ff7f00", "#33a02c", "#6a3d9a",
"#e31a1c", "#b15928", "#a6cee3", "#fdbf6f",
"#b2df8a")
)
즉, 지수 평활 모형은 항상 순진 모형을 선택합니다 (주황색 선과 파란색 선이 100 % 겹칩니다). 다시 말해, "다음 달의 코일 가격이 이번 달의 코일 가격과 동일 할 것"이라는 순진한 예측은 7 개의 매우 정교한 시계열 모델보다 더 정확합니다 (거의 모든 예측 범위에서). 코일 시장에 아직 알려지지 않은 비밀 정보가 없다면 순진한 코일 가격 예측을이기는 것은 매우 어려울 것 입니다.
누구나 듣고 싶어하는 대답은 아니지만 예측 정확도가 목표라면 가장 정확한 모델을 사용해야합니다. 순진한 모델을 사용하십시오.