Как разбить набор данных поезда / теста на основе центров? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть набор данных с 3 предикторами (P1-P3) и 1 переменной ответа в качестве результата (Response).Данные были собраны из 5 центров (200 идентификаторов).Я разбил все данные на Train (70%) и Test (30%).

Пример данных:

ID  Centers   P1    P2  P3  Response
ID1 Center1   12    1   1   Class1
ID2 Center2   73    1   3   Class2
ID3 Center3   56    2   1   Class1
ID4 Center1   44    1   3   Class2
ID5 Center4   33    1   1   Class1
ID6 Center5   26    1   1   Class2
ID7 Center2   61    1   1   Class1
ID8 Center3   44    1   3   Class2
ID9 Center5   45    1   1   Class1

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

library(caret)
set.seed(123)
train.index <- createDataPartition(data$Response, p = .7, list = FALSE)
train <- data[ train.index,]
test  <- data[-train.index,]

Как я могу написать код таким образом, чтобы при секционировании выбирались данные из всех центров?

1 Ответ

0 голосов
/ 20 декабря 2018

Возможно, это не идеальный ответ, но у меня возникла похожая проблема, и я справляюсь с ней, используя dplyr::group_by и dplyr::sanple_n.Мне нужно было сбалансированное обучение и тестирование по группам, и набор данных test, который был подмножеством моих данных, людей, которых не было в наборе данных train.

Например, используя знаменитый mtcarsнабор данных:

library(dplyr)
mtcars %>%              # in your case your data
    group_by(cyl) %>%   # in your case Centers
    sample_n(2)         # here the numbers of the sample for each group

Таким образом, это становится:

train <- data %>% group_by(Centers) %>% sample_n(28)

Это означает, что если у вас есть 200 строк и 5 центров, и одинаковое количество людей для каждого центра, (давайте назовемсбалансировано), у вас есть 200/5 = 40 для каждой группы, поэтому sample_n без повторений может быть максимум 40.

В случае сбалансированных данных на группу, если моя математика не ошибается, вы можете установить 28 (200/100 * 70/5), чтобы обеспечить 70% охват, сбалансированный для каждой группы.

Если группа не сбалансирована, без повторения вы можете установить параметр до наименьшей группы.

В других руках вы должны установить повторение.

Чтобы установить тестирование, если вы хотите, чтобы лица, которые не участвуют в обучении, вы можете сделать это:

test <- data %>% filter(!ID %in% train%ID)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...