在R上存储许多训练数据的最佳方法

时间:2018-04-14 05:13:45

标签: r dataset

我想将我在R上的数据集随机选择100次,并希望查看哪些训练和测试数据能够提供最佳模型结果。我应该如何存储这些数据,以便比较预测结果?我应该为每个训练和测试数据制作不同的变量还是将其保存在阵列上?我在R上很新,所以我真的不知道如何以最好的方式做到这一点。我正在使用RStudio 1.1.423。

这是我随机数据的方式,我使用包rminer中的holdout函数

H=holdout(myData$salary, ratio = 2/3, mode = "random")
trainData <- myData[H$tr,]
testData <- myData[H$ts,]

trainData和testData是我用来存储训练和测试数据的变量。 myData是我的数据集。

1 个答案:

答案 0 :(得分:0)

每当我处理同一结构的多个帧时,我倾向于将它们放入一个列表中并做一件事&#34;到该列表中的所有内容。可以在此处找到一个很好的参考资料:How do I make a list of data frames?

在此示例中,有两种方法可以继续。我没有您的数据,所以我会使用mtcars

dat <- mtcars[1:3]
ntrain <- (2/3) * nrow(dat)
n <- 3 # 100 for you?

重复性非常重要,但硬编码set.seed可能会有问题(至少在学术上),所以这是我们跟踪/存储的随机生成的种子:

(seed <- sample(.Machine$integer.max, size=1L))
seed
# [1] 558990070

我喜欢存储指数以便日后回忆。

set.seed(seed)
inds <- replicate(n, sample(nrow(dat), size=ntrain), simplify=FALSE)
str(inds)
# List of 3
#  $ : int [1:21] 22 32 15 16 30 20 21 3 14 1 ...
#  $ : int [1:21] 6 11 17 24 22 9 15 4 10 21 ...
#  $ : int [1:21] 23 26 4 21 14 10 20 17 32 28 ...

现在可以轻松地使用这些来生成训练和测试集:

trains <- lapply(inds, function(i) dat[i,,drop=FALSE])
tests <- lapply(inds, function(i) dat[-i,,drop=FALSE])
str(tests)
# List of 3
#  $ :'data.frame': 11 obs. of  3 variables:
#   ..$ mpg : num [1:11] 18.1 14.3 24.4 22.8 17.8 32.4 30.4 13.3 19.2 27.3 ...
#   ..$ cyl : num [1:11] 6 8 4 4 6 4 4 8 8 4 ...
#   ..$ disp: num [1:11] 225 360 147 141 168 ...
#  $ :'data.frame': 11 obs. of  3 variables:
#   ..$ mpg : num [1:11] 21 18.7 24.4 16.4 17.3 10.4 33.9 19.2 26 15.8 ...
#   ..$ cyl : num [1:11] 6 8 4 8 8 8 4 8 4 8 ...
#   ..$ disp: num [1:11] 160 360 147 276 276 ...
#  $ :'data.frame': 11 obs. of  3 variables:
#   ..$ mpg : num [1:11] 21 18.7 18.1 22.8 17.8 17.3 10.4 32.4 30.4 19.2 ...
#   ..$ cyl : num [1:11] 6 8 6 4 6 8 8 4 4 8 ...
#   ..$ disp: num [1:11] 160 360 225 141 168 ...

或者,您可以在每个元素中生成训练/测试,但我不知道这是否会增加很多价值:

str(both)
# List of 3
#  $ :List of 3
#   ..$ ind  : int [1:21] 22 32 15 16 30 20 21 3 14 1 ...
#   ..$ train:'data.frame': 21 obs. of  3 variables:
#   .. ..$ mpg : num [1:21] 15.5 21.4 10.4 10.4 19.7 33.9 21.5 22.8 15.2 21 ...
#   .. ..$ cyl : num [1:21] 8 4 8 8 6 4 4 4 8 6 ...
#   .. ..$ disp: num [1:21] 318 121 472 460 145 ...
#   ..$ test :'data.frame': 11 obs. of  3 variables:
#   .. ..$ mpg : num [1:11] 18.1 14.3 24.4 22.8 17.8 32.4 30.4 13.3 19.2 27.3 ...
#   .. ..$ cyl : num [1:11] 6 8 4 4 6 4 4 8 8 4 ...
#   .. ..$ disp: num [1:11] 225 360 147 141 168 ...
#  $ :List of 3
#   ..$ ind  : int [1:21] 6 11 17 24 22 9 15 4 10 21 ...
#   ..$ train:'data.frame': 21 obs. of  3 variables:
#   .. ..$ mpg : num [1:21] 18.1 17.8 14.7 13.3 15.5 22.8 10.4 21.4 19.2 21.5 ...
#   .. ..$ cyl : num [1:21] 6 6 8 8 8 4 8 6 6 4 ...
#   .. ..$ disp: num [1:21] 225 168 440 350 318 ...
#   ..$ test :'data.frame': 11 obs. of  3 variables:
#   .. ..$ mpg : num [1:11] 21 18.7 24.4 16.4 17.3 10.4 33.9 19.2 26 15.8 ...
#   .. ..$ cyl : num [1:11] 6 8 4 8 8 8 4 8 4 8 ...
#   .. ..$ disp: num [1:11] 160 360 147 276 276 ...
#  $ :List of 3
#   ..$ ind  : int [1:21] 23 26 4 21 14 10 20 17 32 28 ...
#   ..$ train:'data.frame': 21 obs. of  3 variables:
#   .. ..$ mpg : num [1:21] 15.2 27.3 21.4 21.5 15.2 19.2 33.9 14.7 21.4 30.4 ...
#   .. ..$ cyl : num [1:21] 8 4 6 4 8 6 4 8 4 4 ...
#   .. ..$ disp: num [1:21] 304 79 258 120 276 ...
#   ..$ test :'data.frame': 11 obs. of  3 variables:
#   .. ..$ mpg : num [1:11] 21 18.7 18.1 22.8 17.8 17.3 10.4 32.4 30.4 19.2 ...
#   .. ..$ cyl : num [1:11] 6 8 6 4 6 8 8 4 4 8 ...
#   .. ..$ disp: num [1:11] 160 360 225 141 168 ...

从这里开始,只需针对数据运行模型:

results <- lapply(trains, function(x) randomForest(mpg~., data=x, ...))

(其中...是您的其他模型参数)。然后是:

validation <- mapply(function(result, test) predict(result, data=test, ...),
                     results, tests, SIMPLIFY=FALSE)

(您当然可以做的不仅仅是predict,可能会检查yhat或类似内容。)