gpt4 book ai didi

r - 通过sample()进行数据洗牌将测试集中的RMSE降低到比训练集中更低的值

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

我发现了一个特殊的效果,即使用带有 caret 包的 sample 函数,测试集的 RMSE 低于训练集的 RMSE。

我的代码对训练集和测试集进行了常见的分割:

  set.seed(seed)
training.index <- createDataPartition(dataset[[target_label]], p = 0.8, list = FALSE)
training.set <- dataset[training.index, ]
testing.set <- dataset[-training.index, ]

这个例如给出测试集 0.651 的 RMSE,它高于训练集 RMSE 0.575 - 正如预期的那样。

遵循许多来源的建议,例如here ,数据应该被打乱,所以我在上面的分割之前这样做:

  # shuffle data - short version:
set.seed(17)
dataset <- data %>% nrow %>% sample %>% data[.,]

经过这次洗牌,测试集 RMSE 比训练集 RMSE 0.5750.528!这一发现在许多算法中都是一致的,包括 lm、glm、knn、kknn、rf、gbm、svmLinear、svmRadial 等。

据我所知,sample()的默认值是replace = FALSE,因此测试集中不会有任何数据泄漏。尽管 createDataPartition 执行分层,但分类中也会出现相同的观察结果(针对准确性和 kappa),因此应处理任何数据不平衡。

我没有使用任何特殊的配置,只是普通的交叉验证:

  training.configuration <- trainControl(
method = "repeatedcv", number = 10
, repeats = CV.REPEATS
, savePredictions = "final",
# , returnResamp = "all"
)

我在这里错过了什么?

--

更新 1:预感数据泄漏到测试集中

我检查了数据分布并发现了所描述效果的潜在提示。

训练集分布:

  . Freq      prop
1 1 124 13.581599
2 2 581 63.636364
3 3 194 21.248631
4 4 14 1.533406

测试集分布随机播放:

  . Freq      prop
1 1 42 18.502203
2 2 134 59.030837
3 3 45 19.823789
4 4 6 2.643172

测试集分布随机播放:

  . Freq      prop
1 1 37 16.299559
2 2 139 61.233480
3 3 45 19.823789
4 4 6 2.643172

如果我们观察众数(最频繁的值),它在有 shuffle 的测试集中的比例 61.2% 比没有 shuffle 的情况更接近训练集的比例 63.6%随机播放 59.0%

我不知道如何通过基础理论来解释这一统计数据 - 有人可以吗?

我的直觉是,改组使得测试集分布的分层(由 createDataPartition() 隐式执行)“更加分层” - 我的意思是“更接近训练集分布” ”。这可能会导致数据泄漏到相反的方向 - 测试集。

更新 2:可重现的代码

library(caret)
library(tidyverse)
library(magrittr)
library(mlbench)

data(BostonHousing)

seed <- 171

# shuffled <- TRUE
shuffled <- FALSE

if (shuffled) {
dataset <- BostonHousing %>% nrow %>% sample %>% BostonHousing[., ]
} else {
dataset <- BostonHousing %>% as_tibble()
}

target_label <- "medv"
features_labels <- dataset %>% select_if(is.numeric) %>%
select(-target_label) %>% names %T>% print

# define ml algorithms to train
algorithm_list <- c(
"lm"
, "glmnet"
, "knn"
, "gbm"
, "rf"
)

# repeated cv
training_configuration <- trainControl(
method = "repeatedcv", number = 10
, repeats = 10
, savePredictions = "final",
# , returnResamp = "all"
)

# preprocess by standardization within each k-fold
preprocess_configuration = c("center", "scale")

# select variables
dataset %<>% select(target_label, features_labels) %>% na.omit

# dataset subsetting for tibble: [[
set.seed(seed)
training.index <- createDataPartition(dataset[[target_label]], p = 0.8, list = FALSE)
training.set <- dataset[training.index, ]
testing.set <- testing.set <- dataset[-training.index, ]

########################################
# 3.2: Select the target & features
########################################
target <- training.set[[target_label]]
features <- training.set %>% select(features_labels) %>% as.data.frame

########################################
# 3.3: Train the models
########################################
models.list <- list()

models.list <- algorithm_list %>%

map(function(algorithm_label) {
model <- train(
x = features,
y = target,
method = algorithm_label,
preProcess = preprocess_configuration,
trControl = training_configuration
)
return(model)
}
) %>%
setNames(algorithm_list)

更新:计算测试集性能的代码

observed <- testing.set[[target_label]]
models.list %>%
predict(testing.set) %>%
map_df(function(predicted) {
sqrt(mean((observed - predicted)^2))
}) %>%
t %>% as_tibble(rownames = "model") %>%
rename(RMSE.testing = V1) %>%
arrange(RMSE.testing) %>%
as.data.frame

testing.set 上为 shuffled = FALSEshuffled = TRUE 运行此代码会给出:

   model RMSE.testing RMSE.testing.shuffled
1 gbm 3.436164 2.355525
2 glmnet 4.516441 3.785895
3 knn 3.175147 3.340218
4 lm 4.501077 3.843405
5 rf 3.366466 2.092024

效果是可重现的!

最佳答案

您获得不同测试 RMSE 的原因是因为您有不同的测试集。您正在打乱数据,然后每次都使用相同的 training.index,因此没有理由相信测试集每次都是相同的。

在原始比较中,您需要将打乱后的测试数据的 RMSE 与打乱后的训练数据(而不是原始训练数据)的 RMSE 进行比较。

编辑:由于 createDataPartition 有自己的采样方案,因此也不需要进行改组。如果您想要不同的测试/训练分割,您只需更改种子即可

关于r - 通过sample()进行数据洗牌将测试集中的RMSE降低到比训练集中更低的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58147450/

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