GroupKFold и KFold: проверка утечки групп на Python
Измерения одной машины могут оказаться и в обучении, и в проверке. Постройте разбиения KFold и GroupKFold, посчитайте пересечения идентификаторов и найдите фолды с утечкой групп.
Программа курса «Классическое машинное обучение: алгоритмы и практика на Python».
Аудит изоляции групп в схемах кросс-валидации
Что уже дано
Проверяющая система запускает решение как независимый скрипт Python в среде с библиотеками numpy, pandas и scikit-learn. Никаких предопределённых переменных или файлов в окружении не создаётся.
Что нужно сделать
Напишите программу, которая считывает из стандартного потока ввода параметры разбиения и строки таблицы измерений, выполняет разбиение на фолды и выводит результаты аудита по каждому фолду.
Программа должна поддерживать два режима валидации по значению флага mode:
- Если
mode == "group", применитеGroupKFold(n_splits=k). - Если
mode == "kfold", применитеKFold(n_splits=k, shuffle=False).
Для каждого сгенерированного фолда (нумерация от 1 до k по порядку итератора разбиения):
- Определите размер обучающей выборки в строках и число уникальных идентификаторов машин в обучении.
- Определите размер валидационной выборки в строках и число уникальных идентификаторов машин в валидации.
- Посчитайте количество общих идентификаторов машин, присутствующих одновременно и в train, и в val данного фолда (
overlap). - Выведите строку фолда в формате:
Fold {i}: train={n_train_rows} ({n_train_groups} groups), val={n_val_rows} ({n_val_groups} groups), overlap={n_overlap}
После вывода строк по всем k фолдам выведите суммарное число фолдов с утечкой групп (то есть фолдов, где overlap > 0):Leaking folds: {leaking_folds_count}
Ввод и вывод
Программа читает данные из stdin и пишет результат в stdout.
Формат ввода
- Первая строка: текстовый режим разбиения — ровно строка
groupилиkfold. - Вторая строка: целое число
k(k >= 2) — число фолдов кросс-валидации. - Третья строка: целое число
n(n >= k) — общее число строк таблицы. - Следующие
nстрок: каждая содержит три значения через пробел:machine_id load_pct temperature_c(текстовый идентификатор машины, затем вещественные числа нагрузки и температуры).
Гарантируется, что при режиме group число уникальных machine_id не меньше k.
Формат вывода
kстрок с аудитом каждого фолда в формате:
Fold {i}: train={n_train_rows} ({n_train_groups} groups), val={n_val_rows} ({n_val_groups} groups), overlap={n_overlap}- Финальная строка:
Leaking folds: {leaking_folds_count}.
Пример
- Ввод
group 4 12 M01 70.5 82.0 M01 72.0 83.5 M02 55.0 65.0 M02 58.0 67.0 M03 80.0 90.0 M03 82.0 91.5 M04 40.0 50.0 M04 42.0 52.0 M05 60.0 70.0 M05 61.0 71.0 M06 75.0 85.0 M06 77.0 88.0
- Вывод
Fold 1: train=8 (4 groups), val=4 (2 groups), overlap=0 Fold 2: train=8 (4 groups), val=4 (2 groups), overlap=0 Fold 3: train=10 (5 groups), val=2 (1 groups), overlap=0 Fold 4: train=10 (5 groups), val=2 (1 groups), overlap=0 Leaking folds: 0
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
