Код-ревью Senior PyTorch на практике обновлено
Ревью: подготовка данных и валидация
Вопрос
Пайплайн обучения модели по табличным данным на PyTorch. Найдите проблемы, искажающие оценку качества.
X = (df[features] - df[features].mean()) / df[features].std()
y = df["target"]
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, shuffle=True)
best = 0
for epoch in range(200):
train_one_epoch(model, X_train, y_train)
model.eval()
with torch.no_grad():
acc = accuracy(model(X_val), y_val)
if acc > best:
best = acc
torch.save(model.state_dict(), "best.pt")
model.train()
print("Итоговое качество", best)
Коротко
Утечки в оценке опаснее багов в обучении: модель выглядит отлично и проваливается в проде. Препроцессинг обучается только на трейне, схема разбиения повторяет прод (время, группы), а финальная оценка делается на тесте, который не участвовал ни в выборе эпохи, ни в выборе гиперпараметров.
Что должен найти ревьюер
- Ошибкастрока 1Нормализация по всему датасету до разбиения: статистики валидации попадают в препроцессинг. Нужно считать среднее и std только по трейну.
- Ошибкастрока 3Если данные временные или есть группы (пользователи), случайное перемешанное разбиение даёт утечку: нужно разбиение по времени или по группам.
- Стильстрока 3Нет фиксированного random_state: разбиение и результат невоспроизводимы.
- Стильстрока 9Accuracy без учёта баланса классов может вводить в заблуждение.
- Ошибкастрока 14Итоговое качество это максимум по 200 эпохам на той же валидации, по которой выбирали чекпоинт: оценка оптимистична, нужна отдельная тестовая выборка.
Разбор
Утечки в оценке опаснее багов в обучении: модель выглядит отлично и проваливается в проде. Препроцессинг обучается только на трейне, схема разбиения повторяет прод (время, группы), а финальная оценка делается на тесте, который не участвовал ни в выборе эпохи, ни в выборе гиперпараметров.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.