我需要使用交叉验证方法对R中的预测模型进行回溯测试。
因此,我应该从数据集中的总观察值中选择5个中的4个用于培训目的,并使用剩下的一个进行测试。
现在,我们假设x
是由100次观察组成的总数据集,我知道您可以通过输入以下内容在R中选择子样本x1
:
x1 <- x[1:80, ]
通过这种方式,我选择了数据集中第五个观察结果中的前4个。
如何选择第五个子样本中的第二个4,即观察[1:20]
和[40:100]
?
任何提示都将受到赞赏。如果问题不明确,请在评论中告诉我。
答案 0 :(得分:4)
您可以使用caret包具有许多有用的功能来进行预测建模。 createDataPartition
函数可以很好地创建测试和训练分区,但它是随机的。我们无法保证每个值都会在培训/测试集中显示4次,因为如果您使用以下操作进行拆分:x[1:80]
,x[c(1:20,41:100)]
,x[c(1:40,61:100)]
,x[c(1:20,81:100)]
,x[21:100]
。
以下是使用createDataPartition
的示例:
set.seed(1001)
x<- sample(1:1000, 100)
library(caret)
folds <- createDataPartition(x, times=5, p = 4/5) # p = percentage of data to include
# times = number of partitions
folds
包含来自x
的值的索引,因此您可以像这样使用它:
x[folds[[1]]] # first training set
x[-folds[[1]]] # first test set
x[folds[[2]]] # second training set
x[-folds[[2]]] # second test set
# and so on
答案 1 :(得分:4)
这是机器学习中的典型任务。通常不建议采用连续的数据集,例如100行中的前80行,因为数据可能是以有序方式收集的,而剩余的20行(观察值)可能包含显着不同的属性。普遍接受的解决方案是从总数据中取一个预定义大小的随机集(样本),通常介于70%和80%之间,并将其用作训练集,而其余部分则是测试集。
实现数据分割的一种简单方法是创建虚拟索引:
ind <- sample(2,nrow(x), replace=TRUE, prob=c(0.7,0.3))
然后可以轻松分离训练集和测试集:
train_data <- x[ind==1,]
test_data <- x[ind==2,]
请注意,使用此方法时,该集合通常不会精确地分为70%和30%。训练集可以例如代表总数据的75%,而测试集包括剩余的25%。在任何情况下,整个集合被分成两部分,这两部分的相对大小大致对应于prob
函数中sample()
属性中指定的参数。这种波动对于通常的机器学习任务是可以接受的,其中训练集大小与测试集大小的比率不需要精确定义。
希望这有帮助。
答案 2 :(得分:2)
如果你想特别留下特定的二十集,你可以这样做:
train_test_groups <- function(data, test_group, n_groups) {
group_size <- nrow(data) %/% n_groups
if (test_group == n_groups) {
# last group makes up the numbers if the data don't split up evenly
test_indices <- (group_size * (test_group - 1) + 1):nrow(data)
} else {
test_indices <- 1:group_size + group_size * (test_group - 1)
}
list(train = data[-test_indices, ],
test = data[test_indices, ])
}
示例:
my_data <- data.frame(x = 1:100, y = rnorm(100))
first_groups <- train_test_groups(my_data, 1, 5)
first_groups$train
first_groups$test