Как я могу сохранить случайно сгенерированные наборы данных поезда и теста? - PullRequest
0 голосов
/ 07 ноября 2018

Я использую цикл for для генерации 100 различных наборов поездов и тестов.

Что я хочу сделать сейчас, так это сохранить эти 100 различных наборов поездов и тестов, чтобы можно было просмотреть, например, где итерация была 17.

В этом коде показана моя программа с циклом for и разделением на поезд и набор тестов:

result_df<-matrix(ncol=3,nrow=100)
colnames(result_df)<-c("Acc","Sens","Spec")

for (g in 1:100 )
{

  # Divide into Train and test set
  smp_size <- floor(0.8 * nrow(mydata1))
  train_ind <- sample(seq_len(nrow(mydata1)), size = smp_size)
  train <- mydata1[train_ind, ]
  test <- mydata1[-train_ind, ]

  REST OF MY CODE




  # Calculate some statistics

  overall <- cm$overall
  overall.accuracy <- format(overall['Accuracy'] * 100, nsmall =2, digits = 2)
  overall.sensitivity <- format(cm$byClass['Sensitivity']* 100, nsmall =2, digits = 2)
  overall.specificity <- format(cm$byClass['Specificity']* 100, nsmall =2, digits = 2)

  result_df[g,1] <- overall.accuracy
  result_df[g,2] <- overall.sensitivity
  result_df[g,3] <- overall.specificity

}

Как я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 07 ноября 2018

Одним из вариантов может быть сохранение индексов строк ваших разделов вместо сохранения всех наборов данных, а затем выбор индексов строк для интересующей вас итерации.

Пакет caret имеет функцию createDataPartition, которая сделает это за вас:

library(caret)

df <- data.frame(col1 = rnorm(100), col2 = rnorm(100))

# create 100 partitions
train.idxs <- createDataPartition(1:nrow(df), times = 100, p = 0.8)

for(i in 1:length(train.idxs)) {
# create train and test sets 
idx <- train.idxs[[i]]
train.df <- df[idx, ]
test.df <- df[-idx, ]

# calculate statistics ...

result_df[i,1] <- overall.accuracy
result_df[i,2] <- overall.sensitivity
result_df[i,3] <- overall.specificity
}

# check the datasets for the nth partition
# train set
df[train.idxs[[n]], ]

# test set
df[-train.idxs[[n]], ]
0 голосов
/ 07 ноября 2018

Вы можете сделать следующее, например, сохранить каждый набор тестов и наборов в виде элементов в списке:

result_df<-matrix(ncol=3,nrow=100)
colnames(result_df)<-c("Acc","Sens","Spec")
testlist <- list()
trainlist <- list()
for (g in 1:100 )
{
  # Divide into Train and test set
  smp_size <- floor(0.8 * nrow(mydata1))
  train_ind <- sample(seq_len(nrow(mydata1)), size = smp_size)
  train <- mydata1[train_ind, ]
  test <- mydata1[-train_ind, ]
  trainlist[[g]] <- train
  testlist[[g]] <- test
  }

EDIT Чтобы получить 7-й элемент этих списков, вы можете использовать trainlist[[7]]

0 голосов
/ 07 ноября 2018

Поместите свой код в функцию и выполните lapply():

result_df <- matrix(ncol=3, nrow=100)
colnames(result_df)<-c("Acc", "Sens", "Spec")

SIMg <- function(g) {

  # Divide into Train and test set
  smp_size <- floor(0.8 * nrow(mydata1))
  train_ind <- sample(seq_len(nrow(mydata1)), size = smp_size)
  train <- mydata1[train_ind, ]
  test <- mydata1[-train_ind, ]

  REST OF THE CODE

  return(list(train=train, test=test, ...))
}
L <- lapply(1:100, SIMg)

Результирующий список L содержит 100 элементов, каждый элемент представляет собой список, содержащий два кадра данных и ваши результаты за один прогон моделирования.
Чтобы получить отдельные списки trainlist и testlist, вы можете сделать:

trainlist <- lallpy(L, '[[', "train")
testlist  <- lallpy(L, '[[', "test")
0 голосов
/ 07 ноября 2018

Вы можете сохранить их в файле CSV, используя следующий метод

write.csv(train, file = paste0("train-", Sys.time(), ".csv", sep=""))
write.csv(test, file = paste0("test-", Sys.time(), ".csv", sep=""))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...