Разделение данных в Python таким образом, что каждый субъект остается в один раз (перекрестная проверка m раз)

Так вот в чем дело. Я применяю бинарный классификатор для 5 пациентов (P1,P2,...P5). У каждого пациента есть 100 образцов данных, и результат равен либо 0, либо 1.

Поэтому я отложил одного пациента (скажем, P5) в качестве данных тестирования и использовал оставшегося для проверки и обучения. Но я также хочу найти оптимальное количество гиперпараметров для классификатора (скажем, SVM), поэтому для этого я также использую 4-кратную перекрестную проверку.

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

Я использую GridSearchCV в Python для разделения данных, но я не знаю, как настроить его так, чтобы у нас было: 100 образцов p1 в тестовом сгибе и все 300 образцов p2,p3,p4 в тренировочном фолде.......... 100 образцов p4 в тестовом фолде и все 300 образцов p1,p2,p3 в тренировочном фолде.

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

У нас есть пакет на это, или я должен попробовать написать его вручную, не используя GridSearchCV или что-то в этом роде?

1 ответ

Решение

Вы должны использовать Scikit-Learn GroupKFold, Это должно решить вашу проблему легко. Используйте список patients как группы, такие, что patients[i] == "p2" если образец i принадлежит пациенту 2.

Вот документация.

Другие вопросы по тегам