Разделение данных в 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.
Вот документация.