in caret:为测试/培训/验证创建多个不同大小的分区

时间:2014-09-08 17:54:16

标签: r r-caret data-partitioning

我尝试将数据集分成3个部分:培训:60%,测试:20%,验证:20%。

part1 <- createDataPartition(fullDataSet$classe, p=0.8, list=FALSE)
validation <- fullDataSet[-part1,]
workingSet <- fullDataSet[part1,]

当我做同样的事情再次分区时:

inTrain <- createDataPartition(workingSet$classe, p=.75, list=FALSE)

我收到错误:

Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?

有没有办法要么a)创建3个不同大小的分区,或者b)像我试图做的那样做一个嵌套分区?我认为c)使用sample()代替,但是对于教师只使用createDataPartition的类,我们必须显示我们的代码。有没有人在这里有任何建议?

2 个答案:

答案 0 :(得分:4)

实际上我想知道同样的事情,我想出了一个非常优雅的解决方案,但这似乎有效。

因此,在我的情况下,我想创建一个包含60%数据和测试和验证数据集的训练数据集,每个数据集占20%。 我是这样做的:

set.seed(1234)
inTraining <- createDataPartition(mydata$FLAG, p=0.6, list=FALSE)
training.set <- mydata[inTraining,]
Totalvalidation.set <- mydata[-inTraining,]
# This will create another partition of the 40% of the data, so 20%-testing and 20%-validation
inValidation <- createDataPartition(Totalvalidation.set$FLAG, p=0.5, list=FALSE)
testing.set <- Totalvalidation.set[inValidation,]
validation.set <- Totalvalidation.set[-inValidation,]

看起来它给了我正确的数据集,并将在今天进行测试。 希望它对你有用,如果有人有更优雅的答案请分享! :)

答案 1 :(得分:0)

  #METHOD 1 : EQUAL SPLITS
  # allind <- sample(1:nrow(m.d),nrow(m.d))
  # #split in three parts 
  # trainind <- allind[1:round(length(allind)/3)]
  # valind <- allind[(round(length(allind)/3)+1):round(length(allind)*(2/3))]
  # testind <- allind[round(length(allind)*(2/3)+1):length(allind)]

  set.seed(1234)

 #METHOD 2 : 60-30-20 SPLIT
 allind <- sample(1:nrow(m.d),nrow(m.d))
 trainind <- allind[1:round(length(allind)*0.6)]
 valind <- allind[(round(length(allind)*0.6)+1):((round(length(allind)*0.6)+1)+    
 (round(length(allind)*0.3)))]
 testind <- allind[((round(length(allind)*0.6)+1)+
 (round(length(allind)*0.3))+1):length(allind)]
 m.dTRAIN <- m.d[trainind,]
 m.dVAL   <- m.d[valind,]
 m.dTEST  <- m.d[testind,]