Прибуток:
- Можливість розпізнавати типи витоку даних (ціль, час, попередня обробка, згрупований рядок) і запитувати оцінку «занадто добре, щоб бути правдою» як сигнал тривоги
- Можливість запобігання витоку за допомогою раннього відділення тестового набору, трубопроводу та правильного розподілу (хронологічно/згруповано)
- Можливість зробити аналіз відтворюваним за допомогою фіксованих початкових значень, керування версіями та видалення ручних кроків
Є дві помилки, які витрачають найбільше зусиль у науці про дані, і обидві вони підступні, оскільки призводять до катастрофи саме тоді, коли «здається, що все гаразд». По-перше, це витік даних: модель чудово працює на тестовому наборі, але падає у виробництві. Друге – невідтворюваність: ви проводите аналіз через півроку і отримуєте зовсім інший результат. Цей розділ присвячений глибокому знанню цих двох пасток і уникненню цих пасток. Штучний інтелект може збільшити обидва ризики (швидко генерує, припускає приховані витоки, полегшує вам виконання кроків вручну), але також може зменшити їх, якщо використовується правильно. Різниця в дисципліні.
Витік даних: модель ясновидця
Витік даних — це коли модель бачить інформацію під час навчання, якої вона не матиме під час фактичного прогнозування. Модель «обманює» цю інформацію, чудово виглядає на тестовому наборі, але виходить з ладу у виробництві без цієї інформації. Симптом витоку майже завжди однаковий: занадто добре, щоб бути правдою. Перш ніж радіти, побачивши 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)?
- [ ] Чи я зробив всю випадковість повторюваною за допомогою фіксованого початкового числа?
- [ ] Я видалив кроки вручну та зберіг усе в коді та контролі версій?