如何 select r中的子样本?
How to select a sub-sample in r?
我需要使用交叉验证方法对 R 中的预测模型进行回测。
因此,我应该 select 数据集中 5 个总观测值中的 4 个用于训练目的,并将剩余的用于测试。
现在,假设 x
是总数据集,由 100 个观察值组成,我知道您可以在 R 中 select 子样本 x1
输入:
x1 <- x[1:80, ]
通过这种方式,我 select 编辑了数据集中第五个观测值中的前 4 个。
我应该如何处理 select 第五个子样本中的第二个 4,即观察结果 [1:20]
和 [40:100]
?
如有任何提示,我们将不胜感激。如果问题会导致不清楚,请在评论中ping我。
您可以使用 caret 包,其中包含许多用于预测建模的有用函数。 createDataPartition
函数可以很好地创建测试和训练分区,但它是随机的。不能保证每个值都会在 training/test 集合中恰好出现 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
如果你想专门遗漏特定的 20 组,你可以这样做:
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
这是机器学习中的典型任务。通常不建议采用连续的数据集,例如 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%。在任何情况下,整个集合分为两部分,它们的相对大小大致对应于 sample()
函数中 prob
属性中指定的参数。这种波动对于通常的机器学习任务来说是可以接受的,其中不需要精确定义训练集大小与测试集大小的比率。
希望这对您有所帮助。
我需要使用交叉验证方法对 R 中的预测模型进行回测。
因此,我应该 select 数据集中 5 个总观测值中的 4 个用于训练目的,并将剩余的用于测试。
现在,假设 x
是总数据集,由 100 个观察值组成,我知道您可以在 R 中 select 子样本 x1
输入:
x1 <- x[1:80, ]
通过这种方式,我 select 编辑了数据集中第五个观测值中的前 4 个。
我应该如何处理 select 第五个子样本中的第二个 4,即观察结果 [1:20]
和 [40:100]
?
如有任何提示,我们将不胜感激。如果问题会导致不清楚,请在评论中ping我。
您可以使用 caret 包,其中包含许多用于预测建模的有用函数。 createDataPartition
函数可以很好地创建测试和训练分区,但它是随机的。不能保证每个值都会在 training/test 集合中恰好出现 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
如果你想专门遗漏特定的 20 组,你可以这样做:
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
这是机器学习中的典型任务。通常不建议采用连续的数据集,例如 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%。在任何情况下,整个集合分为两部分,它们的相对大小大致对应于 sample()
函数中 prob
属性中指定的参数。这种波动对于通常的机器学习任务来说是可以接受的,其中不需要精确定义训练集大小与测试集大小的比率。
希望这对您有所帮助。