如何避免我的 KNN 模型中的时间泄漏?

Posted

技术标签:

【中文标题】如何避免我的 KNN 模型中的时间泄漏?【英文标题】:How do I avoid time leakage in my KNN model? 【发布时间】:2019-10-07 07:24:07 【问题描述】:

我正在构建一个 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 或其他knn 库(如classkknn)中防止这种时间泄漏?

【问题讨论】:

你能做一个可重现的例子吗? ***.com/questions/5963269/… 【参考方案1】:

caret 中,createTimeSlices 实现了适应时间序列的交叉验证变体(通过滚动预测原点来避免时间泄漏)。 文档是here。

在您的情况下,根据您的确切需求,您可以使用类似的方法进行适当的交叉验证:

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
)

编辑: 如果您在日期上有联系,并且希望在测试集和火车集的同一天完成交易,您可以先修复 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)

【讨论】:

当您预测ith 收盘价时,在这个例子中,模型是否仍然可以访问在那之后关闭的房屋? 不,只对之前的 $i-1$ 记录。请参阅我包含的链接中的图片 我有多个房屋在同一天关闭。当您设置horizo​​n = 1时,这是否意味着时间片将持续到下一个家庭或下一个关闭日期?我想我可能想将第一个参数设置为 my_data$close_date。 如果你检查View(caret::createTimeSlices),你会看到第一个参数只用于它的长度,所以你的建议不起作用。抱歉,我没有直接回答时间点何时有联系

以上是关于如何避免我的 KNN 模型中的时间泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

R中的KNN混淆矩阵?

如何将 knn 模型用于 R 中的新数据?

如何在 swift 中避免由于 AFNetworking 导致的内存泄漏

避免、发现和消除 Cocoa 中的内存泄漏

避免dojo中的内存泄漏?

您如何检测/避免(非托管)代码中的内存泄漏? [关闭]