如何在r中选择子样本?

时间:2015-07-04 13:31:26

标签: r dataset sample

我需要使用交叉验证方法对R中的预测模型进行回溯测试。

因此,我应该从数据集中的总观察值中选择5个中的4个用于培训目的,并使用剩下的一个进行测试。

现在,我们假设x是由100次观察组成的总数据集,我知道您可以通过输入以下内容在R中选择子样本x1

x1 <- x[1:80, ]

通过这种方式,我选择了数据集中第五个观察结果中的前4个。

如何选择第五个子样本中的第二个4,即观察[1:20][40:100]

任何提示都将受到赞赏。如果问题不明确,请在评论中告诉我。

3 个答案:

答案 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