Як розрахувати довірчі інтервали для показників продуктивності в машинному навчанні за допомогою методу автоматичного завантаження

Вихідний вузол: 1178501

Як розрахувати довірчі інтервали для показників продуктивності в машинному навчанні за допомогою методу автоматичного завантаження

Вимірювання продуктивності вашої моделі дуже точні через «великий» тестовий набір чи дуже невпевнені через «маленький» чи незбалансований тестовий набір?


By Девід Б. Розен (доктор філософії), провідний спеціаліст із автоматизованого затвердження кредитів у IBM Global Financing



Помаранчева лінія показує 89.7% як нижню межу довірчого інтервалу збалансованої точності, зелена для початкової спостережуваної збалансованої точності=92.4% (точкова оцінка), а червона для верхньої межі 94.7%. (Це та всі зображення належать автору, якщо не зазначено інше.)

Вступ

 
 
Якщо ви повідомляєте, що продуктивність вашого класифікатора має Точність = 94.8% і F1 = 92.3% для тестового набору, це не означає багато, якщо ви не знаєте нічого про розмір і склад тестового набору. Похибка цих вимірювань продуктивності значно відрізнятиметься залежно від розміру тестового набору або, для незбалансованого набору даних, головним чином залежно від кількості незалежних екземплярів меншість клас, який він містить (більше копій тих самих екземплярів із надмірної вибірки не допоможе для цієї мети).

Якби ви змогли зібрати інший незалежний тестовий набір подібного походження, точність і F1 вашої моделі на цьому наборі даних навряд чи будуть однаковими, але наскільки вони правдоподібно відрізнятимуться? На подібне запитання статистика відповідає як довірчий інтервал вимірювання.

Якби ми витягли багато незалежних вибіркових наборів даних із основної сукупності, то для 95% цих наборів даних справжнє базове значення метрики знаходилося б у межах 95% довірчого інтервалу, який ми б обчислили для цього конкретного вибіркового набору даних.

У цій статті ми покажемо вам, як обчислити довірчі інтервали для будь-якої кількості показників продуктивності машинного навчання одночасно за допомогою методу початкового завантаження, який автоматично визначає, скільки завантажувальних зразків наборів даних генерувати за замовчуванням.

Якщо ви просто хочете побачити, як викликати цей код для обчислення довірчих інтервалів, перейдіть до розділу «Підрахуйте результати!” внизу.

Методологія початкового завантаження

 
 
Якби ми змогли отримати додаткові тестові набори даних із справжнього розподілу, що лежить в основі даних, ми змогли б побачити розподіл цікавих показників ефективності між цими наборами даних. (Під час малювання цих наборів даних ми не будемо робити нічого, щоб запобігти малюванню ідентичного або схожого екземпляра кілька разів, хоча це може траплятися лише рідко.)

Оскільки ми не можемо цього зробити, наступне найкраще – отримати додаткові набори даних із емпіричний розподіл цього тестового набору даних, що означає вибірку із заміною з його екземплярів для створення нових початкових зразків наборів даних. Вибірка із заміною означає, що як тільки ми малюємо певний екземпляр, ми повертаємо його, щоб ми могли намалювати його знову для того самого зразка набору даних. Таким чином, кожен такий набір даних, як правило, має кілька копій деяких екземплярів і не включає всі екземпляри, які входять до базового тестового набору.

Якщо ми взяли пробу без заміни, то ми просто щоразу отримуватимемо ідентичну копію оригінального набору даних, перемішувану в іншому випадковому порядку, що не принесе жодної користі.

Команда процентиль Методологія початкового завантаження для оцінки довірчого інтервалу така:

  1. Генерувати nboots набори даних «bootstrap sample», кожен такого ж розміру, що й вихідний тестовий набір. Кожен вибірковий набір даних отримується випадковим вибором екземплярів із тестового набору із заміною.
  2. Для кожного зразка наборів даних обчисліть метрику та збережіть її.
  3. 95% довірчий інтервал задається 2.5th до 97.5th процентиль серед nboots розрахункові значення метрики. Якщо nboots=1001, і ви відсортували значення в серії/масиві/списку X довжиною 1001, 0th процентиль є X[0] і 100th процентиль є X[1000], тож довірчий інтервал буде задано як X[25] до X[975].

Звичайно, ви можете обчислити скільки завгодно показників для кожного зразка набору даних на кроці 2, але на кроці 3 ви знайдете процентилі для кожного показника окремо.

Приклад набору даних і результатів довірчого інтервалу

 
 
Ми використаємо результати цієї попередньої статті як приклад: Як поводитися з незбалансованою класифікацією без повторного балансування данихПерш ніж розглядати надмірну вибірку спотворених даних, спробуйте налаштувати поріг прийняття рішення про класифікацію.

У цій статті ми використовували дуже-незбалансований двокласний Kaggle набір даних ідентифікації шахрайства з кредитною карткою. Ми вирішили використовувати порогове значення класифікації, яке значно відрізняється від порогового значення за замовчуванням 0.5, яке є неявним у використанні методу predict(), що робить непотрібним збалансувати дані. Цей підхід іноді називають переміщення порогу, у якому наш класифікатор призначає клас, застосовуючи вибране порогове значення до прогнозованої ймовірності класу, наданої прогнозом_проба() метод.

Ми обмежимо сферу застосування цієї статті (і коду) бінарною класифікацією: класи 0 і 1, причому клас 1 за домовленістю є «позитивним» класом і, зокрема, класом меншості для незбалансованих даних, хоча код повинен працювати для регресії (єдиний безперервна ціль).

Створення одного набору даних зразка завантаження

 
 
Хоча наш код довірчого інтервалу може обробляти різну кількість аргументів даних, які передаються до метричних функцій, ми зосередимося на метриках у стилі sklearn, які завжди приймають два аргументи даних, y_true і y_pred, де y_pred буде або передбаченнями двійкового класу (0 або 1), або безперервні передбачення класу ймовірності або функції прийняття рішень, або навіть прогнози безперервної регресії, якщо y_true також є безперервним. Наступна функція генерує один набір даних зразка завантаження. Він приймає будь-які data_args, але в нашому випадку ці аргументи будуть ytest(наш фактичний/істинний тест встановлює цільові значення в попередня стаття) і hardpredtst_tuned_thresh (прогнозований клас). Обидва містять нулі та одиниці, щоб вказати справжній або прогнозований клас для кожного екземпляра.

Спеціальна метрика specificity_score() і корисні функції

 
 
Ми визначимо спеціальну метричну функцію для Specificity, яка є просто іншою назвою для Recall of the негативний клас (клас 0). Також функція calc_metrics, яка застосовує послідовність метрик, що цікавлять наші дані, і кілька службових функцій для неї:

Тут ми складаємо список показників і застосовуємо їх до даних. Ми не вважали точність релевантним показником, оскільки хибний негатив (невірна класифікація справжнього шахрайства як законного) набагато дорожчий для бізнесу, ніж хибний позитивний результат (невірна класифікація справжнього шахрайства як шахрайства), тоді як точність розглядає обидва типи неправильної класифікації однаково погані, і тому сприяє правильній класифікації тих, чий справжній клас є класом більшості, оскільки вони трапляються набагато частіше і тому значно більше сприяють загальній точності.

met=[ metrics.recall_score, specificity_score, metrics.balanced_accuracy_score ]
calc_metrics(met, ytest, hardpredtst_tuned_thresh)



Створення кожного набору даних зразка завантаження та обчислення показників для нього

 
 
У raw_metric_samples() ми фактично згенеруємо кілька зразків наборів даних один за одним і збережемо показники кожного:

Ви надаєте raw_metric_samples() список метрик (або лише одну метрику), що вас цікавить, а також істинні та прогнозовані дані класу, і він отримує зразки наборів даних nboots і повертає фрейм даних лише зі значеннями метрик, обчисленими з кожного набору даних. Через _boot_generator() він викликає one_boot() один за раз у виразі генератора, а не зберігає всі набори даних одночасно як потенційно-величезний список

Подивіться на показники 7 наборів даних зразків завантаження

 
 
Ми складаємо список метричних функцій і викликаємо raw_metric_samples(), щоб отримати результати лише для 7 зразків наборів даних. Ми викликаємо raw_metric_samples() тут для розуміння — це не обов’язково для отримання довірчих інтервалів за допомогою ci_auto() нижче, хоча вказується список метрик (або лише одна метрика) для ci_auto() is необхідно.

np.random.seed(13)
raw_metric_samples(met, ytest, hardpredtst_tuned_thresh, nboots=7).style.format('{:.2%}') #optional #style



Кожен стовпець вище містить показники, обчислені з одного набору даних зразка завантаження (пронумеровані від 0 до 6), тому обчислені значення показників відрізняються через випадкову вибірку.

Кількість наборів даних завантаження з обчисленим за замовчуванням

 
 
У нашій реалізації за замовчуванням кількість завантажувальних наборів даних nboots буде розраховано автоматично з бажаного рівня довіри (наприклад, 95%), щоб відповідати рекомендації Норт, Кертіс і Шем мати мінімальну кількість результатів завантаження в кожному хвості дистрибутива. (Насправді ця рекомендація стосується p-цінності і, таким чином, перевірка гіпотези приймальні регіони, Але довірчі інтервали досить схожі на ті, щоб використовувати це як правило.) Хоча ці автори рекомендують мінімум 10 результатів завантаження в хвості, Девідсон і Маккіннон рекомендуємо принаймні 399 черевиків для 95% впевненості, що вимагає 11 черевиків у хвості, тому ми використовуємо цю більш консервативну рекомендацію.

Ми вказуємо альфа, яка дорівнює 1 – рівень достовірності. наприклад 95% впевненість стає 0.95, а альфа = 0.05. Якщо ви вкажете явну кількість чобіт (можливо, меншу nboots оскільки вам потрібні швидші результати), але цього недостатньо для запитуваної альфа-версії, буде автоматично вибрано вищу альфа-версію, щоб отримати точний довірчий інтервал для цієї кількості завантажень. Буде використано щонайменше 51 чоботи, оскільки будь-яке менше може точно розрахувати лише дивно малі рівні достовірності (наприклад, 40% достовірності, що дає інтервал від 30th процентиль до 70th процентиль, який має 40% всередині інтервалу, але 60% поза ним), і незрозуміло, що рекомендація щодо мінімальних завантажень навіть передбачає такий випадок.

Функція get_alpha_nboots() встановлює nboots за замовчуванням або змінює запитані альфа та nboots згідно з вище:

Давайте покажемо стандартні nboots для різних значень alpha:

g = get_alpha_nboots pd.DataFrame( [ g(0.40), g(0.20, None), g(0.10), g(), g(alpha=0.02), g(alpha=0.01, nboots=None), g(0.005, nboots=None) ], columns=['alpha', 'default nboots'] ).set_index('alpha')



Ось що станеться, якщо ми запросимо явний nboots:

req=[(0.01,3000), (0.01,401), (0.01,2)]
out=[get_alpha_nboots(*args) for args in req]
mydf = lambda x: pd.DataFrame(x, columns=['alpha', 'nboots'])
pd.concat([mydf(req),mydf(out)],axis=1, keys=('Requested','Using'))



Малі значення nboots підвищують альфа-версію до 0.05 і 0.40, а nboots=2 змінюється до мінімуму 51.

Гістограма початкового зразка наборів даних із довірчим інтервалом лише для збалансованої точності

 
 
Знову ж таки, нам не потрібно цього робити, щоб отримати наведені нижче довірчі інтервали, викликавши ci_auto().

np.random.seed(13)
metric_boot_histogram (metrics.balanced_accuracy_score, ytest, hardpredtst_tuned_thresh)



Помаранчева лінія показує 89.7% як нижню межу довірчого інтервалу збалансованої точності, зелена для початкової спостережуваної збалансованої точності=92.4% (точкова оцінка), а червона для верхньої межі 94.7%. (Те саме зображення показано у верхній частині статті.)

Як розрахувати всі довірчі інтервали для списку показників

 
 
Ось основна функція, яка викликає наведене вище та обчислює довірчі інтервали з процентилів результатів метрики та вставляє точкові оцінки як перший стовпець вихідного кадру даних результатів.

Підрахуйте результати!

 
 
Це все, що нам потрібно було зробити: викликати ci_auto() у такий спосіб зі списком показників (met призначені вище), щоб отримати їх довірчі інтервали. Відсоткове форматування необов’язкове:

np.random.seed(13)
ci_auto( met, ytest, hardpredtst_tuned_thresh ).style.format('{:.2%}')



Обговорення отриманих довірчих інтервалів

 
 
Ось матриця плутанини від оригінал статті. Клас 0 – негативні (клас більшості), а клас 1 – позитивні (дуже рідкісний клас)



Відкликання (Справжній позитивний коефіцієнт) 134/(134+14) має найширший довірчий інтервал, оскільки це біноміальна пропорція, що включає невеликі підрахунки.

Специфічність (справжній негативний показник) становить 80,388/(80,388+4,907), що включає багато більші показники, тому він має надзвичайно вузький довірчий інтервал лише [94.11% до 94.40%].

Оскільки збалансована точність обчислюється як середнє значення запам’ятовування та специфічності, ширина його довірчого інтервалу є проміжною між їхніми.

Похибка метричних вимірювань через варіації даних тестування порівняно з варіаціями даних поїзда

 
 
Тут ми не розглядали мінливість в модель на основі випадковості нашого навчання дані (хоча це також може бути цікавим для деяких цілей, наприклад, якщо ви автоматизували повторне навчання і хочете знати, наскільки продуктивність майбутніх моделей може відрізнятися), а скоріше лише варіабельність у вимірюванні ефективності цього приватність моделі (створеної з певних даних навчання) через випадковість нашої тест дані.

Якби ми мали достатньо незалежних тестових даних, ми могли б дуже точно виміряти ефективність цієї конкретної моделі на основній популяції, і ми б знали, як вона працюватиме, якщо цю модель розгорнути, незалежно від того, як ми побудували модель і чи можемо ми отримати кращу або гіршу модель з іншим набором навчальних зразків.

Незалежність окремих інстанцій

 
 
Метод початкового завантаження передбачає, що кожен із ваших екземплярів (випадків, спостережень) витягується незалежно від базової сукупності. Якщо ваш тестовий набір містить групи рядків, які не є незалежними один від одного, наприклад, повторювані спостереження однієї сутності, які, ймовірно, будуть корельовані одне з одним, або екземпляри, які мають надмірну вибірку/тиражовані/генеровані з інших екземплярів у вашому тесті встановлено, результати можуть бути недійсними. Можливо, вам знадобиться використати згруповані вибірка, коли ви збираєте випадковим чином цілі групи, а не окремі рядки, уникаючи при цьому розбивання будь-якої групи або просто використання її частини.

Крім того, ви хочете переконатися, що у вас немає груп, які були розділені на навчальний і тестовий набір, тому що тоді тестовий набір не обов’язково буде незалежним, і ви можете отримати непомічене переобладнання. Наприклад, якщо ви використовуєте передискретизацію, ви, як правило, повинні робити тільки після його було відокремлено від тестового набору, не раніше. І зазвичай ви перебираєте навчальний набір, але не тестовий набір, оскільки тестовий набір має залишатися репрезентативним для екземплярів, які модель бачитиме під час майбутнього розгортання. А для перехресної перевірки ви захочете використати scikit-learn model_selection.GroupKFold().

Висновок

 
 
Ви завжди можете розрахувати довірчі інтервали для своїх показників оцінки, щоб побачити, наскільки точно ваші тестові дані дозволяють виміряти ефективність вашої моделі. Я планую ще одну статтю, щоб продемонструвати довірчі інтервали для метрик, які оцінюють прогнози ймовірностей (або оцінки довіри — не пов’язані зі статистичною достовірністю), тобто м’яку класифікацію, таку як Log Loss або ROC AUC, а не метрики, які ми використовували тут, які оцінюють дискретний вибір класу за моделлю (жорстка класифікація). Той самий код працює для обох, а також для регресії (передбачення безперервної цільової змінної) — вам просто потрібно передати йому інший тип прогнозу (і інший тип справжніх цілей у випадку регресії).

Цей блокнот Jupyter доступний на github: bootConfIntAutoV1o_standalone.ipynb

Чи була ця стаття інформативною та/або корисною? Будь ласка, опублікуйте коментар нижче, якщо у вас є коментарі чи запитання щодо цієї статті або щодо довірчих інтервалів, початкового завантаження, кількості завантажень, цієї реалізації, набору даних, моделі, переміщення порогу або результатів.

На додаток до вищезгаданого попередня стаття, вас також може зацікавити мій Як автоматично визначити стовпці дати/дати та встановити їх тип даних під час читання файлу CSV у Pandas, хоча це не має прямого відношення до цієї статті.

Деякі права захищено

 
Біо: Девід Б. Розен (доктор філософії) є провідним спеціалістом із автоматизованого затвердження кредитів у IBM Global Financing. Більше з написаного Девіда див dabruro.medium.com.

Оригінал. Повідомлено з дозволу.

За темою:

Джерело: https://www.kdnuggets.com/2021/10/calculate-confidence-intervals-performance-metrics-machine-learning.html

Часова мітка:

Більше від KDnuggets