Использование createDataParition для создания точных индексированных наборов данных для нескольких результатов - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть набор данных с несколькими переменными результата. Я хотел бы создать наборы данных обучения и проверки, которые используют те же самые случаи, где я могу указать, какой результат использовать для данной модели, используя функцию caret createDataPartition.

По сути, это то, что я хотел бы воссоздать с помощью функции createDataPartition. Возможность ссылаться на несколько результатов, используя один и тот же образец.

n <-nrow(iris)
set.seed(123)
index <- sample(1:n, 25)
iris_train <- iris[index, ]
iris_valid <- iris[-index,]

outcome_length <- "Petal.Length"
outcome_width <- "Petal.Width"

predictors_length <- names(iris_train)[!names(iris_train) %in% outcome_length]
predictors_width <- names(iris_train)[!names(iris_train) %in% outcome_width]

#Outcome 1
iris_train[,predictors_length]
iris_train[,outcome_length]

#Outcome 2
iris_train[,predictors_width]
iris_train[,outcome_width]

Но у меня возникают проблемы, потому что я не могу получить другие данные, если они не созданы с помощью createDataParition. Когда я использую маршрут index, я сталкиваюсь с ошибками, что у newdata есть другое имя, чем у обучающих данных при использовании функции predict.

set.seed(123)
iris_length <- createDataPartition(y = iris$Petal.Length, p = .66, list = F)
iris_length_train <- iris[ iris_length,]
iris_length_valid <- iris[-iris_length,]

set.seed(123)
iris_width <- createDataPartition(y = iris$Petal.Width, p = .66, list = F)
iris_width_train <- iris[ iris_width,]
iris_width_valid <- iris[-iris_width,]

Результаты в разных созданных выборках.

> createDataPartition(y = iris$Petal.Length, p = .66, list = T)
$Resample1
  [1]   2   4   5   6   7   8  10  11  12  13  15  16  17  18  20  21  23  24  26  28  29  31  32  34  35  36  40  41  42  44  45  46  47  48  51  52  54  55  57  58  59  62  63  64  65  66  67  68  69  70  72  73  74  77  78  79  81  82  83  85
 [61]  86  87  88  89  92  93  96  97  99 100 101 102 106 107 108 109 112 113 114 115 116 118 122 125 126 127 129 130 131 132 133 134 135 136 137 140 141 142 143 145 146 149

> createDataPartition(y = iris$Petal.Width, p = .66, list = T)
$Resample1
  [1]   3   4   5   6   8   9  10  11  12  15  16  18  20  23  24  27  29  31  32  33  34  35  37  38  39  40  41  42  43  44  45  46  47  48  50  52  53  54  55  56  57  58  59  60  62  63  64  65  66  69  70  73  75  76  77  78  79  81  82  84
 [61]  87  89  90  91  92  95  96  97  98 100 102 103 106 108 109 110 111 112 114 116 117 119 120 121 122 123 124 125 126 127 129 130 132 133 134 136 140 144 145 146 148 149

Ниже приведен остаток будущего анализа и порядок использования образцов. Мне не удалось заставить команды caretList работать с командой прогнозирования, используя любой другой метод, кроме createDatapartition

fitControl <- trainControl(
  method = "repeatedcv",
  number = 3,
  repeats = 3,
  savePredictions = "final",
  search = "random")

model_list_length <- caretList(
  Petal.Length~.,
  data = iris_length_train,
  trControl=fitControl,
  tuneList=list(
    lm=caretModelSpec(method="lm", preProc = c("center", "scale"),tuneLength = 3,allowParallel = TRUE),
    gam=caretModelSpec(method="gam", preProc = c("center", "scale"),tuneLength = 3,allowParallel = TRUE)))

model_list_width <- caretList(
  Petal.Width~.,
  data = iris_width_train,
  trControl=fitControl,
  tuneList=list(
    lm=caretModelSpec(method="lm", preProc = c("center", "scale"),tuneLength = 3,allowParallel = TRUE),
    gam=caretModelSpec(method="gam", preProc = c("center", "scale"),tuneLength = 3,allowParallel = TRUE)))


iris_ensemble_length <- caretEnsemble(
  model_list_length,
  tuneLength=10,
  trControl=trainControl(
    method="boot",
    number=10,
    savePredictions="final"))

iris_ensemble_width <- caretEnsemble(
  model_list_width,
  tuneLength=10,
  trControl=trainControl(
    method="boot",
    number=10,
    savePredictions="final"))

length_pred <- predict(object=iris_ensemble_length,newdata=iris_length_valid, type = "raw")
width_pred <- predict(object=iris_ensemble_width,newdata=iris_width_valid, type = "raw")
...