2014-07-15 10 views
12

Я попытался использовать машинное обучение для прогнозирования на основе данных временных рядов. В одном из StackOverflow вопрос (createTimeSlices function in CARET package in R) является примером использования createTimeSlices для перекрестной проверки для модели обучения и настройки параметров:Временные ряды - разделение данных и оценка модели

library(caret) 
    library(ggplot2) 
    library(pls) 
    data(economics) 
    myTimeControl <- trainControl(method = "timeslice", 
            initialWindow = 36, 
            horizon = 12, 
            fixedWindow = TRUE) 

    plsFitTime <- train(unemploy ~ pce + pop + psavert, 
         data = economics, 
         method = "pls", 
         preProc = c("center", "scale"), 
         trControl = myTimeControl) 

Мое понимание:

  1. мне нужно разделить МАЕ данные для обучение и набор тестов.
  2. Используйте набор для настройки параметров.
  3. Evaluate получены модели на тестовом наборе (с помощью R2, RMSE и т.д.)

Поскольку мои данные временных рядов, я полагаю, что я не могу использовать bootstraping для spliting данных в подготовке и тестового набора. Итак, мои вопросы: я прав? И если так - Как использовать createTimeSlices для оценки модели?

+1

Это поможет, если вы определили, что вы имеете в виду «оценка модели». – topepo

+0

Я отредактировал свой вопрос. Может быть, сейчас легче понять? –

+1

1. необходимо установить пакет «pls» 2. Если вас беспокоит только порядок образцов (а не только месяц или год), вы можете указать им числовой идентификатор, и вы все равно можете использовать загрузку 3. почему бы не использовать что-то простое, как glm? –

ответ

27

Обратите внимание, что исходный вопрос, который вы опубликовали, позаботится о timeSlicing, и вам не нужно создавать timeSlices вручную.

Однако, вот как использовать createTimeSlices для разделения данных, а затем использовать его для обучения и тестирования модели.

Шаг 0: Установка данных и trainControl: (из вопроса)

library(caret) 
library(ggplot2) 
library(pls) 

data(economics) 

Шаг 1: Создание временных срезов для индекса данных:

timeSlices <- createTimeSlices(1:nrow(economics), 
        initialWindow = 36, horizon = 12, fixedWindow = TRUE) 

Это создает список времени обучения и тестирования.

> str(timeSlices,max.level = 1) 
## List of 2 
## $ train:List of 431 
## .. [list output truncated] 
## $ test :List of 431 
## .. [list output truncated] 

Для простоты понимания, я спасаю их в отдельной переменной:

trainSlices <- timeSlices[[1]] 
testSlices <- timeSlices[[2]] 

Шаг 2: Обучение на первом из trainSlices:

plsFitTime <- train(unemploy ~ pce + pop + psavert, 
        data = economics[trainSlices[[1]],], 
        method = "pls", 
        preProc = c("center", "scale")) 

Шаг 3: Тестирование на первый из trainSlices:

pred <- predict(plsFitTime,economics[testSlices[[1]],]) 

Шаг 4: Черчение:

true <- economics$unemploy[testSlices[[1]]] 

plot(true, col = "red", ylab = "true (red) , pred (blue)", ylim = range(c(pred,true))) 
points(pred, col = "blue") 

Вы можете сделать это для всех срезах:

for(i in 1:length(trainSlices)){ 
    plsFitTime <- train(unemploy ~ pce + pop + psavert, 
         data = economics[trainSlices[[i]],], 
         method = "pls", 
         preProc = c("center", "scale")) 
    pred <- predict(plsFitTime,economics[testSlices[[i]],]) 


    true <- economics$unemploy[testSlices[[i]]] 
    plot(true, col = "red", ylab = "true (red) , pred (blue)", 
      main = i, ylim = range(c(pred,true))) 
    points(pred, col = "blue") 
} 

Как уже упоминалось ранее, такого рода timeSlicing делается исходной функции в одном шаге:

> myTimeControl <- trainControl(method = "timeslice", 
+        initialWindow = 36, 
+        horizon = 12, 
+        fixedWindow = TRUE) 
> 
> plsFitTime <- train(unemploy ~ pce + pop + psavert, 
+      data = economics, 
+      method = "pls", 
+      preProc = c("center", "scale"), 
+      trControl = myTimeControl) 
> plsFitTime 
Partial Least Squares 

478 samples 
    5 predictors 

Pre-processing: centered, scaled 
Resampling: Rolling Forecasting Origin Resampling (12 held-out with a fixed window) 

Summary of sample sizes: 36, 36, 36, 36, 36, 36, ... 

Resampling results across tuning parameters: 

    ncomp RMSE Rsquared RMSE SD Rsquared SD 
    1  1080 0.443  796  0.297  
    2  1090 0.43  845  0.295  

RMSE was used to select the optimal model using the smallest value. 
The final value used for the model was ncomp = 1. 

Надеюсь, это поможет!

+0

Итак, если я использую управление движением каретки, нет необходимости в сплите данных для обучения и тестирования раньше? –

+2

Правильно. Автор сценария также говорит, что они собираются улучшить документацию об этом в следующей версии. – Shambho

+0

Действительно потрясающий ответ - большое спасибо, я многому научился! – d8aninja

2

Собственно, вы можете!

Во-первых, позвольте мне сообщить вам a scholarly article on the topic.

В R:

Использование пакета caret, createResample могут быть использованы для изготовления образцов простой начальной загрузки и createFolds может быть использован для создания сбалансированных группировки кросса-проверки из набора данных. Поэтому вы, вероятно, захотите использовать createResample. Вот пример его использования:

data(oil) 
createDataPartition(oilType, 2) 

x <- rgamma(50, 3, .5) 
inA <- createDataPartition(x, list = FALSE) 

plot(density(x[inA])) 
rug(x[inA]) 

points(density(x[-inA]), type = "l", col = 4) 
rug(x[-inA], col = 4) 

createResample(oilType, 2) 

createFolds(oilType, 10) 
createFolds(oilType, 5, FALSE) 

createFolds(rnorm(21)) 

createTimeSlices(1:9, 5, 1, fixedWindow = FALSE) 
createTimeSlices(1:9, 5, 1, fixedWindow = TRUE) 
createTimeSlices(1:9, 5, 3, fixedWindow = TRUE) 
createTimeSlices(1:9, 5, 3, fixedWindow = FALSE) 

Значения, которые вы видите в функции createResample являются данные и количество разделов для создания, в этом случае 2. Вы можете дополнительно указать, если результаты должны быть сохранены в качестве список с list = TRUE или list = FALSE.

Кроме того, caret содержит функцию, называемую createTimeSlices, которая может создавать индексы для этого типа разделения.

Три параметра для этого типа расщепления являются:

  • initialWindow: начальное число последовательных значений в каждом обучающем наборе образца
  • horizon: Количество последовательных значений в тесте установленного образца
  • fixedWindow: Логично: если FALSE, набор тренировок всегда начинается с первого образца, а размер набора тренировок будет зависеть от разделения данных.

Использование:

createDataPartition(y, 
        times = 1, 
        p = 0.5, 
        list = TRUE, 
        groups = min(5, length(y))) 
createResample(y, times = 10, list = TRUE) 
createFolds(y, k = 10, list = TRUE, returnTrain = FALSE) 
createMultiFolds(y, k = 10, times = 5) 
createTimeSlices(y, initialWindow, horizon = 1, fixedWindow = TRUE) 

Источники:

http://caret.r-forge.r-project.org/splitting.html

http://eranraviv.com/blog/bootstrapping-time-series-r-code/

http://rgm3.lab.nig.ac.jp/RGM/R_rdfile?f=caret/man/createDataPartition.Rd&d=R_CC

CARET. Relationship between data splitting and trainControl

+0

Не могли бы вы привести пример в R? –

+0

@JoteN Конечно. В этих двух ссылках есть примеры, но я добавлю их прямо к решению. –

+0

@JoteN На самом деле, да, я думаю, они предоставили примеры примеров с кодом других функций, а затем обсудили createResample и просто показали результат. Я нашел пример и общий пример использования для вас. –

4

Ответ Shambho дает достойный пример того, как использовать пакет каретки с TimeSlices, однако он может вводить в заблуждение с точки зрения техники моделирования. Поэтому, чтобы не вводить в заблуждение будущих читателей, которые хотят использовать пакет каретки для интеллектуального моделирования во временных рядах (и здесь я не имею в виду авторегрессионные модели), я хочу выделить несколько вещей.

Проблема с временными рядами данных заключается в том, что смещение вперед-назад легко, если не быть осторожным.В этом случае набор экономических данных сопоставляет данные по дате их экономической отчетности, а не к дате их выпуска, что никогда не имеет место в реальных реальных приложениях (точки экономических данных имеют разные отметки времени). Данные по безработице могут за два месяца отставать от других показателей с точки зрения даты выпуска, которые затем будут приводить модельный уклон в примере Шамбо.

Следующий пример - это описательная статистика, а не прогнозная (прогнозирование), потому что данные, которые мы хотим прогнозировать (безработица), не отставали должным образом. Он просто готовит модель, чтобы лучше объяснить вариации безработицы (которая также в этом случае представляет собой стационарный временной ряд, создающий всевозможные проблемы в процессе моделирования) на основе переменных-предикторов в тех же датах экономических отчетов.

Наконец, 12-месячный горизонт в этом примере не является истинным многопериодным прогнозированием, как это делает Хайндман в своих примерах.

Hyndman on cross-validation for time-series

Смежные вопросы