Поезд / Тестовые образцы не случайны при пониженной выборке R - PullRequest
0 голосов
/ 04 мая 2020

Мой набор данных состоит из информации, полученной от стационарных пациентов об их удовлетворенности услугами, которые они получили в больнице. Данные выглядят так, как показано ниже (здесь упоминается только набор переменных):

 $ Advised                                : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 1 2 2 ...
 $ Overall_Rate_Discharge_Process         : Factor w/ 5 levels "1","2","3","4",..: 3 4 5 5 4 4 4 4 4 5 ...
 $ Rights_Responsibilities                : Factor w/ 2 levels "0","1": 1 2 2 2 2 2 2 2 1 2 ...
 $ Overall_Care                           : Factor w/ 5 levels "1","2","3","4",..: 4 4 5 5 4 4 4 3 5 5 ...
 $ Recommend_Employees                    : Factor w/ 2 levels "0","1": 1 1 2 2 2 1 2 1 1 2 ...
 $ NPSVal3.1                              : Factor w/ 3 levels "Detractor","Passive",..: 3 2 3 3 3 2 2 1 3 3 ...

Моя цель - найти факторы, которые влияют на NPSVal3.1 пациентов (с использованием Ordinal Logisti c Регрессия). Столбец NPSVal3.1 не имеет одинакового количества строк на каждом уровне;

Detractor   Passive  Promoter 
  981     12932      8560 

Поэтому я пытаюсь использовать метод понижающей дискретизации для выбора набора данных. Ниже приведен код, который я использовал (из библиотеки "caret");

train3.1 <- downSample(mydata3.1, mydata3.1$NPSVal3.1)

Когда проверены head () и tail () набора поездов, он не выглядит случайным (идентификаторы строк: по порядку)

> head(train3.1)

  Discharge_Instructions_Treatment_Plans Advised Overall_Rate_Discharge_Process Rights_Responsibilities Overall_Care
1                                      1       1                              2                       1            3
2                                      1       1                              4                       0            4
3                                      1       0                              4                       0            5
4                                      1       1                              3                       1            4
5                                      1       1                              4                       0            4
6                                      1       0                              4                       1            4
  Recommend_Employees NPSVal3.1     Class
1                   0 Detractor Detractor
2                   0 Detractor Detractor
3                   0 Detractor Detractor
4                   0 Detractor Detractor
5                   0 Detractor Detractor
6                   1 Detractor Detractor

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

test3.1 <- dplyr::anti_join(mydata3.1, train3.1)

Являются ли эти наборы данных случайными? Если да, как я могу это узнать? Если нет, как я могу сделать наборы поездов и тестов случайными? Спасибо за вашу поддержку!

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Если у нового сотрудника есть равные шансы быть понижающей дискретизацией «Detractor», «Passive» или «Promoter», имеет смысл, но я не думаю, что вы должны использовать понижающую выборку для выбора наборов поездов / тестов. Я советую провести понижающую выборку, а затем использовать caret::createDataPartition для обеспечения квазислучайного разделения ваших данных на поезд / тест.

При понижающей выборке есть ряд ловушек / предостережений, о которых следует знать. В документах по каретам есть отличная дискуссия по этому вопросу: https://topepo.github.io/caret/subsampling-for-class-imbalances.html

Простой ответ на ваш вопрос (проверка «случайности» метода выборки) будет состоять в том, чтобы установить начальное значение до перейти на понижающую выборку, а затем посмотреть, изменяется ли начальное число, какие сотрудники включены / исключены в каждом кадре данных, например,

set.seed(123)
train3.1_v1 <- caret::downSample(mydata3.1, mydata3.1$NPSVal3.1)

set.seed(300)
train3.1_v2 <- caret::downSample(mydata3.1, mydata3.1$NPSVal3.1)

dplyr::anti_join(train3.1_v1, train3.1_v2)
0 голосов
/ 04 мая 2020

Вы также можете уменьшить размер до наименьшей категории (в вашем случае 'NPSVal3.1'), используя функцию sample из базы R:

# make some dummy data
mydata=data.frame(
    categories=as.factor(c(rep("a",100),rep("b",200),rep("c",300))), # want to sample these equally
    values=as.factor(sample(1:600)) # and get the corresponding values
)

# downsample to size of smallest category
n_smallest=min(table(mydata$categories))
mysampledcols=sapply(levels(mydata$categories), 
    function(cat) sample(which(mydata$categories==cat),size=n_smallest)
)
mysampleddata=mydata[mysampledcols,]

# if you want the categories to also appear in random order:
mysampleddata=mydata[sample(mysampledcols),]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...