Разделите данные, сохраняя группы с помощью курсора

Приносим извинения за сообщение о кросс-стеке, я не был уверен, что это больше подходит для stackoverflow или для перекрестной проверки. Сначала я разместил пост на последнем, но понял, что это может быть более подходящим местом.

Итак, у меня есть набор данных со многими рядами лиц, каждый из которых имеет уникальный индивидуальный ID.

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

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

Мой вопрос: поскольку членство в разных домохозяйствах важно, есть ли способ разделить данные на обучающие и тестовые наборы, где все люди, принадлежащие к одному и тому же домашнему хозяйству, хранятся вместе, а не распределяются случайным образом по обоим наборам? (т. е. любое заданное число householdID не должно появляться в обоих наборах). Но также возможно ли разделить домохозяйства как на обучающие, так и на тестовые наборы и сохранить сбалансированную переменную Target?

Итак, используя функцию createDataPartition в caret, мне удалось получить сбалансированное значение Target как в поезде, так и в тесте, когда я установил y = Target, и мне удалось четко разделить домохозяйства как в поезде, так и в тесте, когда я установил y = unique(householdID), но Я не могу понять, есть ли способ получить оба этих результата одновременно.

У меня довольно много идей, поэтому любые предложения будут приветствоваться!

Спасибо!


person anguyen1210    schedule 18.09.2019    source источник
comment
Это называется блокировкой (по номеру домохозяйства). Трудно выполнить стратифицированное разделение на основе y, а также блокировать по другой переменной без ручного вмешательства. Я предлагаю сконцентрироваться только на блокировке. Сделайте несколько сплитов с разными семенами и проверьте цель в каждом. Затем выберите тот, который является наиболее сбалансированным. Если вам нужна дополнительная помощь, пожалуйста, предоставьте некоторые данные для игры.   -  person missuse    schedule 20.09.2019
comment
Спасибо @missuse за предложение. Не увидев другого подхода, я попробую то, что вы предлагаете, поскольку это должно быть выполнимо. Спасибо!   -  person anguyen1210    schedule 20.09.2019


Ответы (1)


groupKFold это путь. Но вместо использования data$Target вам нужно разделить на data$householdID (или как там называется ваш столбец идентификатора домохозяйства). Это гарантирует, что все члены группы будут в одной группе.

После этого вы можете использовать складки в trainControl для моделирования данных $Target.

person phiver    schedule 18.09.2019
comment
Привет, @phiver, спасибо за предложение, но вы упомянули, что члены группы находятся в одной группе, что меня смущает в функции groupKFold, а именно, эта функция должна использоваться только для создания k-кратных данные для резюме? В моем случае я пытаюсь выполнить первоначальное разделение данных на обучающий и тестовый наборы, где значения householdID не появляются в обоих наборах, но также переменная Target сбалансирована для обоих. Имеет ли это смысл? - person anguyen1210; 20.09.2019