BSTS 모델의 예측 (R)은 완전히 실패합니다


15

베이지안 구조 시계열 모델에 대한 이 블로그 게시물을 읽은 후 이전에 ARIMA를 사용했던 문제와 관련하여이를 구현하고 싶었습니다.

나는 알려진 (그러나 시끄러운) 계절 성분에 대한 데이터를 가지고 있습니다. 연간, 매월 및 매주 성분이 있으며 특별한 날 (연방 또는 종교 휴일과 같은)로 인한 영향도 있습니다.

나는 bsts이것을 구현 하기 위해 패키지를 사용했으며 구성 요소와 예측이 단순히 예상대로 보이지 않지만 잘못한 것이 없다고 말할 수있는 한. 구현이 잘못되었거나 불완전하거나 다른 문제가 있는지 확실하지 않습니다.

풀 타임 시리즈는 다음과 같습니다.

전체 데이터

데이터의 일부 하위 집합에서 모델을 훈련시킬 수 있으며 모델은 일반적으로 적합도 측면에서 양호 해 보입니다 (플롯은 아래 참조). 이 작업을 수행하는 데 사용하는 코드는 다음과 같습니다.

library(bsts)

predict_length = 90
training_cut_date <- '2015-05-01'
test_cut_date <- as.Date(training_cut_date) + predict_length

df = read.csv('input.tsv', sep ='\t')

df$date <- as.Date(as.character(df$date),format="%Y-%m-%d")
df_train = df[df$date < training_cut_date,]

yts <- xts(log10(df_train$count), order.by=df_train$date)

ss <- AddLocalLinearTrend(list(), yts)
ss <- AddSeasonal(ss, yts, nseasons = 7)
ss <- AddSeasonal(ss, yts, nseasons = 12)
ss <- AddNamedHolidays(ss, named.holidays = NamedHolidays(), yts)

model <- bsts(yts, state.specification = ss, niter = 500, seed=2016)

모델이 합리적으로 보입니다.

모형 도표

그러나 예측을 플로팅하면 먼저 추세가 완전히 잘못되고 두 번째로 불확실성이 매우 빠르게 커집니다. 로그에서 y 축을 만들지 않고 예측과 동일한 플롯에서 불확실성 밴드를 표시 할 수없는 지점으로 규모. 이 부분의 코드는 다음과 같습니다.

burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))

순수한 예측은 다음과 같습니다.

순수한 예측

그런 다음 초기 분포로 축소하면 (점선이 훈련에서 예측으로의 전환을 보여줌) 문제가 분명합니다.

전체 배포

계절 추세를 더 추가하고 계절 추세를 제거하고 AR 용어를 추가하고 AddLocalLinearModel을 AddGeneralizedLocalLinearTrend로 변경하고 모델 조정과 관련된 몇 가지 다른 것을 시도했지만 문제를 해결하고 예측을보다 의미있게 만드는 것은 없습니다. 경우에 따라 방향이 바뀌므로 0으로 떨어지지 않고 예측이 시간의 함수로 계속 증가합니다. 왜 모델이 이런 식으로 고장 났는지 이해하지 못합니다. 모든 제안은 매우 환영받을 것입니다.


2
왜 데이터를 게시하지 않습니까? 나는 노력하고 도움을 줄 것입니다 ...이 접근법은 너무 많은 가정이 내장되어 있으므로이 접근법을 사용하지 않기 때문에 모델이 왜 고장 났는지 대답 할 수 없습니다. 보류 된 값의 수, 시작 날짜 및 원산지에 대해 정확합니다.
IrishStat

귀하의 의견에 대단히 감사합니다. 살펴볼 시간이있는 경우를 위해 여기 에 원시 데이터를 업로드했습니다 . 데이터의 범위는 2013 년 초부터 올해 말까지입니다. 또한 ARIMA 모델로 예측을 시도했지만 해당 예측이 홀드 아웃 데이터와 일치하지 않습니다. 보류 데이터는 기본적으로 내가 사용하려는 교육 데이터의 양에 따라 2015 또는 2016의 일부에 불과합니다.
anthr

다운로드하는 데 문제가 있습니다. .. 내 이메일 주소로 csv 파일을 보내십시오
IrishStat

답변:


26

스티브 스캇 bsts 패키지를 작성했습니다. 몇 가지 제안이 있습니다. 첫째, 계절 구성 요소가 생각한대로 작동하지 않습니다. 7 시즌 구성 요소를 추가하려고하는데 매일 데이터가 있다고 생각합니다.이 구성 요소는 올바르게 작동해야합니다. 그러나 연간 계절 구성 요소에 12 일마다 반복하도록 지시했습니다. 일일 데이터를 사용하여 월별 계절 구성 요소를 얻는 것은 쉽지 않지만 계절별로 52 주를 수행 할 수 있습니다 AddSeasonal(..., nseasons = 52, season.duration = 7).

seasonal.duration논쟁은 모델에 각 시즌이 몇 시간 동안 지속되어야하는지 알려줍니다. nseasons인수는 많은 계절주기에있는 방법을 알려줍니다. 사이클의 총 시점 수는 season.duration * nseasons입니다.

두 번째 제안은 트렌드에 대한 다른 모델에 대해 생각할 수 있다는 것입니다. 이 LocalLinearTrend모델은 매우 유연하지만이 유연성은 장기 예측에서 원하지 않는 분산으로 나타날 수 있습니다. 약간 더 많은 구조를 포함하는 다른 트렌드 모델이 있습니다. GeneralizedLocalLinearTrend(비 설명 적 이름에 대해 유감스럽게도) 트렌드의 "기울기"구성 요소가 임의의 보행 대신 AR1 프로세스라고 가정합니다. 미래에 대해 멀리 예측하려면 기본 옵션입니다. 대부분의 시계열 변형은 계절성에서 비롯된 것으로 AddLocalLevel보이 므로 또는 AddAr대신에 시도 할 수도 있습니다 AddLocalLinearTrend.

마지막으로, 이상한 예측이 나오고 모델의 어느 부분이 책임 plot(model, "components")이 있는지 알아 내려면 요청한 개별 조각으로 모델이 분해 되는지 확인하십시오.


참고 : 나는 데이터에 대해서도 매우 비슷한 문제를 겪고 있습니다. 여기에 나열된 모든 제안을 이행했지만 도움이되지 않는 것 같습니다.
ZakJ

1
@Steve Scott Steve를 귀찮게해서 죄송합니다. 여러 시계열을 모델링하려고하는데 계층 혼합 모델 프레임 워크에있는 경우 패키지를 사용하여 모델링 할 수 있습니까? 그건 그렇고 : 패키지 주셔서 대단히 감사합니다!
Tommaso Guerrini

4

기본 화상도 변경할 수 있다고 생각합니다. bsts를 사용함에 따라 홀드 아웃 기간에 대한 통계로 MAPE를 사용하여 화상 및 니터 값의 그리드를 만들었습니다. 모델이 그러한 변동을 예상 할 수 있도록 데이터에 큰 변동이있는 경우 AddStudentLocalLinearTrend를 대신 사용해보십시오.


1
데이터 포인트가 거의없는 경우에 도움이되었습니다 (20)
SCallan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.