Как избежать утечки времени в моей модели KNN? - PullRequest
4 голосов
/ 21 мая 2019

Я строю модель KNN для прогнозирования цен на жилье.Я посмотрю мои данные и мою модель, а затем мою проблему.

Данные -

# A tibble: 81,334 x 4
   latitude longitude close_date          close_price
      <dbl>     <dbl> <dttm>                    <dbl>
 1     36.4     -98.7 2014-08-05 06:34:00     147504.
 2     36.6     -97.9 2014-08-12 23:48:00     137401.
 3     36.6     -97.9 2014-08-09 04:00:40     239105.

Модель -

library(caret)
training.samples <- data$close_price %>%
  createDataPartition(p = 0.8, list = FALSE)
train.data  <- data[training.samples, ]
test.data <- data[-training.samples, ]

model <- train(
  close_price~ ., data = train.data, method = "knn",
  trControl = trainControl("cv", number = 10),
  preProcess = c("center", "scale"),
  tuneLength = 10
)

Моя проблема - утечка времени.Я делаю прогнозы на дом, используя другие дома, которые впоследствии закрылись, и в реальном мире у меня не должно быть доступа к этой информации.

Я хочу применить правило к модели, которое говорит, что для каждого значения y используйте только дома, которые были закрыты перед домом для этого y.Я знаю, что могу разделить свои тестовые данные и данные о поездах на определенную дату, но это не совсем так.

Можно ли предотвратить эту утечку времени, либо в caret, либо в других библиотеках длякнн (как class и kknn)?

1 Ответ

3 голосов
/ 27 мая 2019

В caret, createTimeSlices реализуется вариация перекрестной проверки, адаптированная к временным рядам (предотвращение утечки времени путем прокручивания источника прогноза). Документация здесь .

В вашем случае, в зависимости от ваших конкретных потребностей, вы можете использовать что-то вроде этого для правильной перекрестной проверки:

your_data <- your_data %>% arrange(close_date)

tr_ctrl <- createTimeSlices(
  your_data$close_price, 
  initialWindow  = 10, 
  horizon = 1,
  fixedWindow = FALSE)

model <- train(
  close_price~ ., data = your_data, method = "knn",
  trControl = tr_ctrl,
  preProcess = c("center", "scale"),
  tuneLength = 10
)

EDIT: если у вас есть связи в датах и ​​вы хотите, чтобы сделки закрывались в один и тот же день в тестовом наборе и наборе поездов, вы можете исправить tr_ctrl, прежде чем использовать его в train:

filter_train <- function(i_tr, i_te) {
  d_tr <- as_date(your_data$close_date[i_tr]) #using package lubridate
  d_te <- as_date(your_data$close_date[i_te])
  tr_is_ok <- d_tr < min(d_te)

  i_tr[tr_is_ok]
}

tr_ctrl$train <- mapply(filter_train, tr_ctrl$train, tr_ctrl$test)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...