Прибыль:
- Возможность распознавать типы утечки данных (цель, время, предварительная обработка, сгруппированная строка) и запрашивать оценку «слишком хорошо, чтобы быть правдой» в качестве сигнала тревоги.
- Возможность предотвращения утечек за счет раннего разделения тестового набора, конвейера и правильного разделения (хронологическое/групповое)
- Возможность сделать анализ воспроизводимым с помощью фиксированных начальных значений, контроля версий и удаления ручных действий.
Есть две ошибки, на которые тратится больше всего усилий в науке о данных, и обе они коварны, потому что приводят к катастрофе именно тогда, когда «кажется, все в порядке». Первый — утечка данных: модель отлично работает на тестовом наборе, но дает сбой в производстве. Второе — невоспроизводимость: вы проводите анализ через полгода и получаете совершенно другой результат. Этот модуль посвящен подробному знанию и избежанию этих двух ловушек. ИИ может увеличить оба риска (быстро генерирует, предполагает скрытые утечки, облегчает выполнение действий вручную), но также может и снизить их при правильном использовании. Разница в дисциплине.
Утечка данных: модель ясновидящей
Утечка данных — это когда модель во время обучения видит информацию, которой у нее не будет во время фактического прогнозирования. Модель «обманывает» эту информацию, отлично выглядит на тестовом наборе, но без этой информации не работает в производстве. Симптом утечки почти всегда один и тот же: слишком хорошо, чтобы быть правдой. Прежде чем радоваться, увидев точность в 99%, стоит поискать утечки.
Основными видами утечки являются:
1. Утечка цели. Функция является результатом достижения цели. В прогнозе «было отменено» столбцы «Дата отмены» или «Сумма возврата» являются результатом целевого значения; Они будут заполнены только тогда, когда результат будет очевиден.
2. Утечка времени: перенос будущей информации в прошлое. При расчете «среднего значения за последние 30 дней» включите дни после прогнозируемого дня или разделите временной ряд случайным образом.
3. Утечка предварительной обработки: преобразования обучения, такие как масштабирование, заполнение, кодирование всех данных перед разделом обучения/тестирования. Усреднение тестовых данных мешает обучению.
4. Утечка повторяющихся/сгруппированных строк: строки, принадлежащие одному и тому же человеку, присутствуют как в обучении, так и в тестировании (два посещения одного и того же пациента в разных наборах). Модель запоминает человека.
Тип утечки
Как рождается
Как предотвратить
целевая утечка
Столбец, который является результатом цели
Тест «Есть ли оно у меня в момент предсказания»
утечка времени
Привнесение будущего в прошлое
Хронологическое деление, управление окнами
Утечка предварительной обработки
Преобразование до разделения
Пайплайн, подошёл только после тренировки
Утечка сгруппированной строки
Один и тот же блок в двух комплектах
Разделить по группам (GroupKFold)
Единственная дисциплина, предотвращающая утечку
Общее решение для всех типов утечек сводится к одному предложению: изолировать набор тестов как можно раньше, чтобы имитировать реальное будущее, и не «учить» его ничему. На практике это означает: сначала разделить, затем выучить все преобразования только из обучения и применить их в конвейере (структуре, собирающей все шаги в одну цепочку). По каждому признаку задайте вопрос «имею ли я эту информацию на момент предсказания?» Если есть время, разделите его в хронологическом порядке; Если один и тот же модуль повторяется, разделите его на группы.
Внимание: Самый опасный аспект утечки заключается в том, что она представляется успешной. Плохая модель, очевидно, даст плохие результаты и будет замечена; Слитая модель прекрасно работает, всех радует, запущена в производство — вот тут-то и начинается развал. Поэтому «очень хороший» результат – это повод для тревоги, а не для празднования.
Воспроизводимость: получение одного и того же результата дважды.
Воспроизводимость — это возможность получить тот же результат при повторном запуске анализа в другое время на другой машине. Без этого ваш анализ будет случайным, а не научным. Основные причины и решения, ухудшающие воспроизводимость:
Действия вручную: изменение ячейки в Excel вручную, редактирование диаграммы вручную. Решение: запишите каждый шаг в коде.
Нефиксированная случайность: обучение модели, выборка, разделение подразумевают случайность. Решение: исправить случайное начальное число (начальное значение генератора случайных чисел) (random_state=42).
Смена версий: результат может измениться при изменении версии библиотеки. Решение: исправить зависимости (requirements.txt, файл окружения).
Никакого учета: непонятно, какие данные, какой код, какой параметр использовались. Решение: контроль версий (Git — система, сохраняющая все версии кода) и версионирование данных.
«Это работает только на моей машине»: Решение: задокументируйте среду, по возможности используйте контейнеры (Docker).
три мини-кейса
Случай 1 — Целевая утечка. Анализ состояния здоровья включал столбец «Лекарства после выписки», позволяющий прогнозировать, «будет ли пациент повторно госпитализирован». Эта графа заполнялась только после выписки пациента. Модель дала 96%, в производстве 61%. 8-недельный проект был мусором. Урок: задайте каждому признаку вопрос «присутствует ли он на момент предсказания?»
Случай 2 — Утечка при предварительной обработке. Одна команда масштабировала все данные, а затем разделила их. Среднее значение тестовых данных участвовало в масштабировании. Оценка CV 89%, фактическое производство 76%. Фальшивый успех исчез, когда я перешёл в Pipeline и узнал о трансформациях только во время обучения. Урок: сначала разделите, потом преобразуйте.
Случай 3 — Невозможность воспроизвести. Аналитик хотел обновить диаграмму, которую он представил руководству три месяца спустя, но не мог вспомнить, как он ее составил; многие шаги выполнялись вручную в Excel. Результата не получилось и доверие пошатнулось. Урок: никаких ручных действий, все в коде и Git.
Четыре копируемых шаблона
1) Проверка утечек:
Ваша роль: инспектор по утечкам. Цель: «отток» (0/1), базовая дата прогноза: Record_date. Я дам вам этот список функций. Для КАЖДОГО признака: (а) является ли он следствием цели, (б) доступен ли он мне в момент прогнозирования, (в) включает ли временное окно будущее? Отметьте его как «небезопасное/подозрительное/утечка» и напишите причину. Особенности: [список]
2) Герметичный трубопровод:
Настройте конвейер sklearn: сначала разделите поезд/тест (стратифицированный, начальное значение = 42), ЗАТЕМ поместите всю предварительную обработку (вменение, масштабирование, кодирование) в конвейер ТОЛЬКО из обучения. Объясните, почему код не содержит утечек, какой шаг и где был изучен.
3) Код контрольного списка воспроизводимости:
Я хочу, чтобы мой анализ был воспроизводимым. Предложите код/структуру, которая добавляет: (1) жесткое начальное значение для всей случайности, (2) используемые версии библиотеки печати, (3) тег даты/версии для данных и вывода. Также дайте мне контрольный список, чтобы убедиться, что нет никаких действий вручную.
4) Сгруппированный раздел (утечка одного и того же блока):
В данных один и тот же customer_id существует в нескольких строках. Сделайте разделение (GroupKFold илиGroupShuffleSplit, group = customer_id), которое ПРЕДОТВРАЩАЕТ участие одного и того же клиента как в обучении, так и в тестировании. Включите код, проверяющий, что после разделения в обоих наборах нет клиентов.
Слабая подсказка / Сильная подсказка
Слабая подсказка:
Моя модель показала точность 98 %, разве это не здорово? Оптимизируйте код.
Празднование 98% скрывает утечку. Прежде чем приступать к оптимизации, следует задаться вопросом, реальна ли эта оценка или нет.
Мощная подсказка:
Ваша роль: инспектор по утечкам. Моя модель возвращает точность 98% на тестовом наборе, что для меня звучит «слишком хорошо, чтобы быть правдой». Проверьте: (1) являются ли какие-либо функции результатом цели, (2) выполнены ли преобразования перед разделением, (3) являются ли одни и те же единицы в двух наборах, (4) есть ли какие-либо утечки времени. Перечислите все подозрительные моменты; Сосредоточьтесь на поиске утечки, а не на исправлении ситуации.
Здесь высокий балл рассматривается как знак, который следует подвергать сомнению, а не праздновать.
Распространенные ошибки
- Отмечаем «очень хороший» результат. Оценка «слишком хорошо, чтобы быть правдой» — это предупреждение об утечке информации, а не достижение.
- Изучение преобразования всех данных перед разделением. Самая распространенная утечка; Сначала разделите трубопровод.
- Разбиение временного ряда случайным образом. Модель видит будущее; Хронологическое деление обязательно.
- Оставляем один и тот же блок в двух комплектах. Модель запоминает человека; Разделите по группам.
- Не вмешиваясь вручную и не записывая код. Анализ становится невоспроизводимым; все должно быть в коде и Git.
Совет: напишите «клятву чести» из двух предложений в начале вашего проекта: «Я никоим образом не трогал тестовый набор до того, как увидел его в производстве. Каждый шаг записан в коде, а начальное число фиксировано». Если вы не можете честно подписать эти два предложения, ваш результат еще не надежен.
В заключение
Утечка данных и невоспроизводимость — две самые дорогостоящие молчаливые ошибки в науке о данных. Утечка — это видение будущего модели, которое представляет собой ложный успех; Решение состоит в том, чтобы заранее разделить тестовый набор, изучить преобразования только в процессе обучения (конвейер), задать каждой функции вопрос «Есть ли она у меня на момент прогнозирования» и выполнить правильное разделение (хронологическое/групповое). Воспроизводимость – это возможность получить один и тот же результат дважды; его решение — вручную удалить шаги, закрепить начальное значение, заморозить версии и сохранить все в Git. ИИ может либо увеличить, либо уменьшить эти риски; Это ваша дисциплина, которая определяет.
Задача приложения
Возьмите список функций построенной вами модели (или гипотетической) и задайте каждой функции вопрос: «Есть ли у меня эта информация на момент прогнозирования?» в письменной форме; Найдите хотя бы одного кандидата на утечку. Затем заполните контрольный список, чтобы ваш анализ был воспроизводимым: исправлено ли начальное значение, есть ли ручные действия, зарегистрированы ли версии, находятся ли они в Git. Устраните недостатки.
контрольный список
- [ ] Ссылался ли я на оценку «слишком хорошо, чтобы быть правдой» как на предупреждение об утечке?
- [ ] Изучил ли я все трансформации после разделения только во время тренировок?
- [ ] Разделился ли я по временной/групповой структуре (хронологическая/GroupKFold)?
- [ ] Сделал ли я всю случайность повторяемой с фиксированным начальным числом?
- [ ] Удалил ли я действия, выполняемые вручную, и сохранил ли все код и контроль версий?