Печалби:
- Възможност за разпознаване на типове изтичане на данни (цел, време, предварителна обработка, групиран ред) и запитване до резултата „прекалено хубаво, за да е истина“ като аларма
- Възможност за предотвратяване на изтичане с ранно отделяне на комплекта за изпитване, тръбопровода и правилно разделяне (хронологично/групирано)
- Възможност да направите анализа възпроизводим с фиксирани семена, контрол на версиите и премахване на ръчни стъпки
Има две грешки, които губят най-много усилия в науката за данните, и двете са коварни, защото водят до катастрофа точно когато всичко „изглежда е наред“. Първият е изтичането на данни: моделът работи чудесно на тестовия набор, но се срива в производството. Второто е невъзпроизводимостта: пускате анализ шест месеца по-късно и получавате напълно различен резултат. Тази част е посветена на познаването и избягването на тези два капана в дълбочина. AI може да увеличи и двата риска (генерира бързо, предполага скрити течове, улеснява ви да предприемете ръчни стъпки), но може също така да ги намали, ако се използва правилно. Разликата е в дисциплината.
Изтичане на данни: модел на ясновидец
Изтичането на данни е, когато моделът вижда информация по време на обучение, която няма да има по време на действителното прогнозиране. Моделът "изневерява" с тази информация, изглежда страхотно на тестовия комплект, но се срива в производството без тази информация. Симптомът на изтичане е почти винаги един и същ: твърде добър, за да е истина. Преди да се зарадвате, когато видите 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. Ще ви дам този списък с функции. За ВСЯКА характеристика: (a) следствие от целта ли е, (b) достъпна ли е за мен по време на прогнозата, (c) времевият прозорец включва ли бъдещето? Маркирайте го като „небезопасно/подозрително/изтичане“ и напишете причина. Характеристики: [списък]
2) Тръбопровод без течове:
Настройте sklearn Pipeline: първо разделете влак/тест (стратифициран, seed=42), СЛЕД ТОВА поставете цялата предварителна обработка (импутиране, мащабиране, кодиране) в конвейера САМО от обучението. Обяснете защо кодът е без изтичане, коя стъпка къде е научена.
3) Код на контролния списък за възпроизводимост:
Искам да направя анализа си възпроизводим. Предложете код/структура, която добавя: (1) твърдо начално начало за всяка случайност, (2) използвани версии на библиотека за печат, (3) таг за дата/версия за данни и изход. Дайте ми също контролен списък, за да се уверя, че няма ръчни стъпки.
4) Групиран дял (изтичане на едно и също устройство):
В данните същият customer_id съществува в множество редове. Направете разделяне (GroupKFold илиGroupShuffleSplit, group = customer_id), което ПРЕДПАЗВА един и същ клиент да бъде едновременно в обучение и тестване. Включете код, за да проверите дали няма клиенти и в двата комплекта след разделянето.
Слаба подкана / Силна подкана
Слаба подкана:
Моят модел върна 98% точност, не е ли страхотно? Оптимизирайте кода.
Празнуването на 98% скрива теча. Преди да се оптимизира, трябва да се постави под въпрос дали този резултат е реален или не.
Мощна подкана:
Вашата роля: инспектор за течове. Моят модел връща 98% точност на тестовия набор, което ми звучи „твърде добре, за да е истина“. Проверете: (1) дали някои функции са резултат от целта, (2) направени ли са преобразуванията преди разделянето, (3) една и съща единица са в два набора, (4) има ли изтичане на време. Избройте всички подозрителни точки; Съсредоточете се върху намирането на теча, а не върху коригирането на резултата.
Тук високият резултат се третира като знак, който трябва да бъде поставен под въпрос, а не да бъде празнуван.
Често срещани грешки
- Честване на "много добър" резултат. Резултатът, който е твърде добър, за да е истина, е предупреждение за изтичане на информация, а не постижение.
- Изучаване на трансформацията от всички данни преди разделяне. Най-честият теч; Разделете първо с тръбопровод.
- Разделяне на времевата поредица на случаен принцип. Моделът вижда бъдещето; Хронологичното деление е задължително.
- Оставянето на една и съща единица в два комплекта. Моделът запаметява човека; Разделете по групи.
- Без да влизате ръчно и да пишете в кода. Анализът става невъзпроизводим; всичко трябва да е в код и Git.
Съвет: Напишете „обет за чест“ от две изречения в началото на вашия проект: „Не съм докосвал тестовия набор по никакъв начин, преди да го видя в производство. Всяка стъпка е в кода и семето е фиксирано.“ Ако не можете да подпишете тези две изречения честно, вашият резултат все още не е надежден.
В обобщение
Изтичането на данни и невъзпроизводимостта са двете най-скъпи тихи грешки в науката за данните. Изтичането е визията на модела за бъдещето и се представя като фалшив успех; Решението е да разделите набора от тестове рано, да научите трансформациите само от обучение (конвейер), да зададете на всяка функция въпроса „Имам ли го по време на прогнозиране“ и да извърша правилно разделяне (хронологично/групирано). Възпроизводимостта е възможността да получите един и същ резултат два пъти; неговото решение е ръчно да премахне стъпките, да закачи семената, да замрази версиите и да запази всичко в Git. ИИ може или да увеличи, или да намали тези рискове; Вашата дисциплина е това, което определя.
Задача за приложение
Вземете списъка с функции на модел, който сте създали (или хипотетичен) и задайте на всяка функция въпроса „имам ли тази информация по време на прогнозирането?“ писмено; Намерете поне един кандидат за теч. След това попълнете контролен списък, за да направите анализа си възпроизводим: началната стойност е фиксирана, има ли ръчни стъпки, регистрирани ли са версиите, в Git ли са. Коригирайте недостатъците.
контролен списък
- [ ] Зададох ли запитване за резултата „прекалено хубаво, за да е истина“ като предупреждение за теч?
- [ ] Научих ли всички трансформации след разделяне, само от обучение?
- [ ] Разделил ли съм според структурата на времето/групата (хронологично/GroupKFold)?
- [ ] Направил ли съм цялата произволност повторяема с фиксирано семе?
- [ ] Премахнах ли ръчните стъпки и запазих ли всичко в кода и контрола на версиите?