gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:31:10 27 4
gpt4 key购买 nike

我正在构建一个 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)中防止这种时间泄漏?

最佳答案

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)

关于r - 如何避免 KNN 模型中的时间泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56229145/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com