如何避免我的 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 库(如class
和kknn
)中防止这种时间泄漏?
【问题讨论】:
你能做一个可重现的例子吗? ***.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)
【讨论】:
当您预测i
th 收盘价时,在这个例子中,模型是否仍然可以访问在那之后关闭的房屋?
不,只对之前的 $i-1$ 记录。请参阅我包含的链接中的图片
我有多个房屋在同一天关闭。当您设置horizon = 1时,这是否意味着时间片将持续到下一个家庭或下一个关闭日期?我想我可能想将第一个参数设置为 my_data$close_date。
如果你检查View(caret::createTimeSlices)
,你会看到第一个参数只用于它的长度,所以你的建议不起作用。抱歉,我没有直接回答时间点何时有联系以上是关于如何避免我的 KNN 模型中的时间泄漏?的主要内容,如果未能解决你的问题,请参考以下文章