我正在建立一个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
)中防止这种时间泄漏?
答案 0 :(得分:3)
在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)