Перехресний аналіз часових рядів


37

Я використовував пакет карети в R для побудови прогнозних моделей для класифікації та регресії. Caret надає уніфікований інтерфейс для налаштування гіпер-параметрів моделі шляхом перехресної перевірки або обв'язки завантаження. Наприклад, якщо ви будуєте просту модель "найближчих сусідів" для класифікації, скільки сусідів слід використовувати? 2? 10? 100? Caret допомагає вам відповісти на це питання шляхом повторного відбору проб ваших даних, випробування різних параметрів, а потім агрегування результатів, щоб визначити, який результат дає найкращу точність прогнозування.

Мені подобається такий підхід, оскільки він надає надійну методологію вибору гіперпараметрів моделі, і після того, як ви обрали кінцеві гіперпараметри, він дає перехресну оцінку того, наскільки «хороша» модель, використовуючи точність для класифікаційних моделей і RMSE для регресійних моделей.

Зараз у мене є деякі дані часових рядів, для яких я хочу побудувати регресійну модель, можливо, використовуючи випадковий ліс. Яка хороша методика для прогнозування точності прогнозування моєї моделі, враховуючи характер даних? Якщо випадкові ліси дійсно не застосовуються до даних часових рядів, який найкращий спосіб побудувати точну модель ансамблю для аналізу часових рядів?


Я знайшов справді цікаве питання. Чи є спосіб я відзначити питання, щоб виконати його?
Маріана соффер

1
@mariana soffer Клацніть піктограму "Зірка" під стрілками вгору / вниз.
Зак

4
Каретка підтримує тимчасові ряди перехресної перевірки - r-bloggers.com/time-series-cross-validation-5
captain_ahab

1
@Zach Це старий пост, але мені цікаво, чи є у вас нові думки? Чи знаєте ви про нещодавні роботи з послідовного підтвердження моделі?
horaceT

Відповіді:


10

"Класична" методика перехресної перевірки k-разів заснована на тому, що кожен зразок у доступному наборі даних використовується (k-1) -рази для підготовки моделі та 1 раз для її тестування. Оскільки дуже важливо перевірити моделі часових рядів за "майбутніми" даними, такий підхід не сприятиме стабільності моделі.

Однією з важливих властивостей багатьох (найбільш?) Часових рядів є співвідношення суміжних значень. Як зазначає IrishStat, якщо ви використовуєте попередні читання як незалежні змінні вашого кандидата в модель, це співвідношення (або відсутність незалежності) відіграє важливу роль і є ще однією причиною того, що перехресне підтвердження k-разів не є хорошою ідеєю.

Один із способів подолати цю проблему - це "зразки" даних та декорреляції. Якщо процес декорреляції є успішним, то використання перехресної перевірки на часових рядах стає менш проблематичним. Однак це не вирішить питання перевірки моделі за допомогою майбутніх даних

Роз'яснення

під валідацією моделі на майбутніх даних я маю на увазі побудову моделі, очікування нових даних, які були недоступні під час побудови моделі, тестування, тонкої настройки тощо та перевірки її на цих нових даних.

маючи на увазі надмірне моделювання даних, я маю на увазі збір даних часових рядів на частоті, значно вищій, ніж практично потрібно. Наприклад: вибірки цін на акції кожні 5 секунд, коли ви дійсно зацікавлені в погодинних змінах. Тут, коли я кажу "вибірки", я не маю на увазі "інтерполяція", "оцінка" тощо. Якщо дані не можна виміряти на більш високій частоті, ця методика є безглуздою.


What is the 'classical' way to validate a model on future data? What do you mean by 'oversampling?' Thank you!
Zach

It should be noted that the statistical properties of real-world time series data (especially financial data) can vary depending on the sampling frequency. For many financial time series there is no straightforward T relationship between the standard deviations sampled with period p and with period pT. In fact the standard deviation tends to increase as the sampling frequency increases. Similarly correlation decreases as the sampling frequency increases (this is commonly know as the Epps effect)
Chris Taylor

@bgbg I'm facing very similar problem and just found your post. Can you cite some references on oversampling and decorrelating time series data? I'd think if the memory in the time series is short enough (could show that fitting an arima), one could just take "non-overlapping" samples and do the usual cross-validation. Any thought appreciated.
horaceT

9

http://robjhyndman.com/researchtips/crossvalidation/ contains a quick tip for cross validation of time series. Regarding using random forest for time series data....not sure although it seems like an odd choice given that the model is fitted using bootstrap samples. There are classic time series methods of course (e.g. ARIMA) that can be used, as can ML techniques like Neural Nets (example example pdf). Perhaps some of the time series experts can comment on how well ML techniques work compared to time series specific algorithms.


2
This pretty much hits the nail on the head. I'm trying to figure out to apply Machine Learning techniques to time series analysis.
Zach

I have had success using random forests for forecasting before. Check out: biomedcentral.com/1471-2105/15/276
captain_ahab

6

Here is some example code for cross-validating time series models. I expanded on this code in my blog, incorporating the foreach package to speed things up and allowing for a possible xreg term in the cross-validation.

Here's a copy of the code from Rob Hyndman's blog:

library(fpp) # To load the data set a10
plot(a10, ylab="$ million", xlab="Year", main="Antidiabetic drug sales")
plot(log(a10), ylab="", xlab="Year", main="Log Antidiabetic drug sales")

k <- 60 # minimum data length for fitting a model
n <- length(a10)
mae1 <- mae2 <- mae3 <- matrix(NA,n-k,12)
st <- tsp(a10)[1]+(k-2)/12

for(i in 1:(n-k))
{
  xshort <- window(a10, end=st + i/12)
  xnext <- window(a10, start=st + (i+1)/12, end=st + (i+12)/12)
  fit1 <- tslm(xshort ~ trend + season, lambda=0)
  fcast1 <- forecast(fit1, h=12)
  fit2 <- Arima(xshort, order=c(3,0,1), seasonal=list(order=c(0,1,1), period=12), 
      include.drift=TRUE, lambda=0, method="ML")
  fcast2 <- forecast(fit2, h=12)
  fit3 <- ets(xshort,model="MMM",damped=TRUE)
  fcast3 <- forecast(fit3, h=12)
  mae1[i,1:length(xnext)] <- abs(fcast1[['mean']]-xnext)
  mae2[i,1:length(xnext)] <- abs(fcast2[['mean']]-xnext)
  mae3[i,1:length(xnext)] <- abs(fcast3[['mean']]-xnext)
}

plot(1:12, colMeans(mae1,na.rm=TRUE), type="l", col=2, xlab="horizon", ylab="MAE",
     ylim=c(0.65,1.05))
lines(1:12, colMeans(mae2,na.rm=TRUE), type="l",col=3)
lines(1:12, colMeans(mae3,na.rm=TRUE), type="l",col=4)
legend("topleft",legend=c("LM","ARIMA","ETS"),col=2:4,lty=1)

Results


Hi Zach. I implemented a slightly different version of Hyndman's code in order to detect the appropriate number of terms for a regression model with time series. Unfortunately, the CV error plot showed several local minima which made me question about how to select the number of terms correctly. The full problem is described here. Have you faced something similar before?
jroberayalas

5

If you have time series data then you might have a "degrees of freedom problem" . For example if you have 4 observations taken at hourly intervals and then decide to use 241 observations at 1minute intervals, you have 241 observations but they are not necessarily independent. When you submit these 241 values/measurements to an analytical package, the package might expect that these are 241 independent values as it proceeds to perform it's particular magic. If you have time series data you might have to upgrade your analytics. I don't know the program you refer to but it is a reasonable guess on my part ( I could be wrong ! ) that it's tests ( F tests / T tests ...etc ) probably don't apply to your problem set.


1

I can recomend you 2 interesting papers to read that are online 1.Streamed Learning: One-Pass SVMs, by Piyush Rai, Hal Daum´e III, Suresh Venkatasubramanian 2.Streaming k-means approximation, by Nir Ailon

Hope it clarifies you a little your ideas


Can you provide links to those papers? Thanks.
Zach

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.