Рубрики
Без рубрики

24 показатели оценки для бинарной классификации (и когда их использовать)

Эта статья была первоначально размещена на neptune.ml/blog, где вы можете найти более подробные статьи для m … Tagged с помощью машинного обучения, Python.

Эта статья была изначально Опубликовано на neptune.ml/blog где вы можете найти более подробные статьи для практиков машинного обучения.

Не уверены, какую показатель оценки вы должны выбрать для вашей бинарной проблемы классификации? Прочитав этот пост в блоге, у вас должна быть хорошая идея.

Вы узнаете о куче общих и менее известных показателей оценки и диаграмм до понять, как выбрать Производительность модели Метрика для вашей проблемы Анкет В частности, для каждой метрики я расскажу:

  • Что Определение и Интуиция за этим,
  • Нетехническое объяснение что вы можете общаться с заинтересованными сторонами,
  • Как рассчитать или построить это В
  • Когда Вы должны Используйте это Анкет

При этом вы поймете компромиссы, так что принятие решений, связанных с метрикой, было проще.

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

Вы будете использовать эти показатели оценки в контексте проекта, поэтому я подготовил пример проблемы обнаружения мошенничества на основе недавней Kaggle конкурент Анкет

Я выбрал 43 Особенности и отобрано 66000 наблюдений Из исходного набора данных настройки Доля положительного класса до 0,09 Анкет

Затем я обучил кучу классификаторов LightGBM с разными гиперпараметрами. Я использовал только Learning_Rate и n_estimators Параметры, потому что я хотел иметь интуицию относительно того, какие модели «действительно» лучше. В частности, я подозреваю, что модель с 10 деревьями хуже, чем модель с 100 деревьями. Конечно, поскольку используют больше деревьев и меньшие ставки обучения, это становится сложно, но я думаю, что это приличный прокси.

Итак, для комбинаций Learning_Rate и n_estimators , Я сделал следующее:

  • Определенные значения гиперпараметра:
MODEL_PARAMS = {'random_state': 1234,    
                'learning_rate': 0.1,                
                'n_estimators': 10}
  • Прогнозируется по данным тестирования: log_binary_classification_metrics (y_test, y_test_pred)
model = lightgbm.LGBMClassifier(**MODEL_PARAMS)
model.fit(X_train, y_train)
  • прогнозируется на тестовых данных:
y_test_pred = model.predict_proba(X_test)
  • зарегистрировал все метрики для каждого запуска:
log_binary_classification_metrics(y_test, y_test_pred)

Для полной кодовой базы Перейти к этому репозиторию или Прокрутите вниз к примеру скрипта Анкет

Вы также можете Исследуйте эксперимент запуска с:

  • показатели оценки
  • Производительные диаграммы
  • метрика по пороговом значениям

Хорошо, теперь мы готовы поговорить об этих показателях классификации!

  1. Матрица путаницы
  2. Ложная положительная скорость | Ошибка типа I.
  3. Ложная отрицательная скорость | Ошибка типа II
  4. Истинная негативная скорость | Специфичность
  5. Отрицательная прогностическая ценность
  6. Ложно обнаружение
  7. Истинная положительная скорость | Напомним | Чувствительность
  8. Положительная прогностическая ценность | Точность
  9. Точность
  10. F Бета -оценка
  11. F1 Оценка
  12. F2 Оценка
  13. Коэн Каппа
  14. Коэффициент корреляции Мэтьюса | МакК
  15. Кривая ROC
  16. ROC AUC Score
  17. Кривая точности
  18. Pr auc | Средняя точность
  19. Потеря
  20. Брир счет
  21. Совокупный график усиления
  22. Кривая подъема | Лифт диаграммы
  23. Колмогоров-Смирновский участок
  24. Колмогорова Смирнова Статистика

Я знаю, что это много, чтобы пройти сразу. Вот почему вы можете перейти к разделу, который интересен вам и прочитать именно это.

Как вычислить:

Это общий способ представления истинного положительного (TP), истинного отрицательного (TN), ложного положительного (FP) и ложных отрицательных (FN) прогнозов. Эти значения представлены в форме матрицы, где ось Y показывает истинные классы, в то время как ось X показывает прогнозируемые классы.

Он рассчитывается по прогнозам класса, что означает, что выходы из вашей модели должны быть сначала

from sklearn.metrics import confusion_matrix

y_pred_class = y_pred_pos > threshold
cm = confusion_matrix(y_true, y_pred_class)
tn, fp, fn, tp = cm.ravel()

Как это выглядит:

Итак, в этом примере мы видим это:

  • 11918 Предсказания были Настоящие негативы В
  • 872 были Истинные позитивы В
  • 82 были Ложные позитивы В
  • 333 Предсказания были Ложные негативы Анкет

Кроме того, как мы уже знаем, это несбалансированная проблема. Кстати, если вы хотите прочитать больше о несбалансированных проблемах, я рекомендую взглянуть на это Статья Тома Фосетта Анкет

Когда его использовать:

  • В значительной степени всегда. Мне нравится видеть номинальные значения, а не нормализован, чтобы почувствовать, как модель делает на разных, часто несбалансированных классах.

Переверните обратно в список показателей оценки ->

Когда мы предсказываем что -то, когда это не так, мы вносим свой вклад в ложную положительную скорость. Вы можете думать об этом как о Фракция ложных оповещений Это будет поднято на основе ваших модельных прогнозов.

Как вычислить:

from sklearn.metrics import confusion_matrix

y_pred_class = y_pred_pos > threshold
tn, fp, fn, tp = confusion_matrix(y_true, y_pred_class).ravel()
false_positive_rate = fp / (fp + tn)

Как модели оценки в этой метрике.5):

Для всех моделей предупреждения о ошибках типа 1 довольно низкие, но приспособляя порог, мы можем получить еще более низкое соотношение. Поскольку у нас есть истинные негативы в знаменателе, наша ошибка будет иметь тенденцию быть низкой только потому, что набор данных несбалансирован.

Как это зависит от порога:

Очевидно, что если мы увеличим порог, только более высокие оценки наблюдения будут классифицированы как положительные. В нашем примере мы видим, что для достижения идеального FPR 0 нам нужно увеличить порог до 0,83. Однако это, вероятно, будет означать лишь очень мало предсказаний, классифицированных.

Когда его использовать:

  • Вы редко бы использовали эту метрику в одиночку. Обычно как вспомогательный с какой -то другой метрикой,
  • Если Стоимость борьбы с предупреждением высока Вы должны рассмотреть возможность увеличения порога, чтобы получить меньше оповещений.

Переверните обратно в список показателей оценки ->

Когда мы не предсказываем что -то, когда это так, мы вносим свой вклад в ложную негативную скорость. Вы можете думать об этом как о Фракция пропущенных мошеннических транзакций что ваша модель пропускает.

Как вычислить:

from sklearn.metrics import confusion_matrix

y_pred_class = y_pred_pos > threshold
tn, fp, fn, tp = confusion_matrix(y_true, y_pred_class).ravel()
false_negative_rate = fn / (tp + fn)

Как модели оценки в этой метрике.5):

Мы видим, что в нашем примере ошибки типа 2 немного выше, чем ошибки типа 1. Интересно наше BIN-98 Эксперимент У этого была самая низкая ошибка типа 1 имеет самую высокую ошибку типа-2. Существует простое объяснение, основанное на том факте, что наш набор данных является несбалансированным, и с ошибкой типа 2 у нас нет истинных негативов в знаменателе.

Как это зависит от порога:

Если мы уменьшим порог, больше наблюдений будет классифицировано как положительные. На определенном пороге мы будем отмечать все как положительное (например, мошенническое). На самом деле мы можем добраться до FNR 0,083, уменьшив порог до 0,01.

Когда его использовать:

  • Обычно он используется не в одиночку, а с какой -то другой метрикой,
  • Если стоимость пропускания мошеннических транзакций является высокой, а ценность, которую вы получаете от пользователей, не можете ли вы рассмотреть возможность сосредоточиться на этом номере.

Переверните обратно в список показателей оценки ->

  1. Истинная негативная скорость | Специфичность

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

Как вычислить:

from sklearn.metrics import confusion_matrix

y_pred_class = y_pred_pos > threshold
tn, fp, fn, tp = confusion_matrix(y_true, y_pred_class).ravel()
true_negative_rate = tn / (tn + fp)

Как модели оценки в этой метрике.5):

Очень высокая специфичность для всех моделей. Если вы подумаете об этом, в нашей несбалансированной проблеме вы ожидаете этого. Классификация негативных случаев как негативные намного проще, чем классификация положительных случаев, и, следовательно, оценка высока.

Как это зависит от порога:

Чем выше порог, тем больше наблюдений – действительно негативные наблюдения, которые мы можем вспомнить. Мы можем видеть, что начиная с Say.4 Наша модель действительно хорошо справляется с классификацией негативных случаев как негативные.

Когда его использовать:

  • Обычно вы не используете его в одиночку, а в качестве вспомогательной метрики,
  • Когда вы действительно хотите быть уверенным, что вы правы, когда говорите, что что -то безопасно. Типичным примером может быть врач, рассказывающий пациенту «вы здоровы». Сделать ошибку здесь и рассказать больному, что он в безопасности и может пойти домой – это то, чего вы можете избежать.

Переверните обратно в список показателей оценки ->

Он измеряет, сколько прогнозов из всех негативных прогнозов было правильным. Вы можете думать об этом как о точности для негативного класса. В нашем примере он говорит нам, какова часть правильно предсказанных чистых транзакций во всех нездоровых прогнозах.

Как вычислить:

from sklearn.metrics import confusion_matrix

y_pred_class = y_pred_pos > threshold
tn, fp, fn, tp = confusion_matrix(y_true, y_pred_class).ravel()
negative_predictive_value = tn/ (tn + fn)

Как модели оценки в этой метрике.5):

Все модели набирают очень высокие оценки и неудивительно, так как с несбалансированной проблемой легко предсказать негативный класс.

Как это зависит от порога:

Чем выше порог, тем больше случаев классифицируется как отрицательные, а оценка снижается. Однако в нашем несбалансированном примере даже на очень высоком пороге отрицательная прогностическая ценность все еще хороша.

Когда его использовать:

  • Когда мы заботимся о высокой точности на негативных прогнозах. Например, представьте, что мы действительно не хотим иметь какой -либо дополнительный процесс для проверки транзакций, предсказанных как чистые. В этом случае мы можем убедиться, что наша отрицательная прогностическая ценность высока.

Переверните обратно в список показателей оценки ->

Он измеряет, сколько прогнозов из всех положительных прогнозов было неверным. Вы можете думать об этом как просто 1-й вариант. В нашем примере он говорит нам, какова часть неправильно предсказанных мошеннических транзакций во всех мошеннических прогнозах.

Как вычислить:

from sklearn.metrics import confusion_matrix

y_pred_class = y_pred_pos > threshold
tn, fp, fn, tp = confusion_matrix(y_true, y_pred_class).ravel()
false_discovery_rate = fp/ (tp + fp)

Как модели оценки в этой метрике.5):

«Лучшая модель» – невероятно мелкая Lightgbm, которую, как мы ожидаем, будет неверной (более глубокая модель должна работать лучше).

Это важный вывод, который рассматривает точность (или только отзыв), может привести к выбору неоптимальной модели.

Как это зависит от порога:

Чем выше порог, тем менее положительные прогнозы. Менее положительные прогнозы, те, которые классифицируются как положительные, имеют более высокие показатели уверенности. Следовательно, уровень ложного обнаружения снижается.

Когда это использовать

  • Опять же, обычно не имеет смысла использовать его в одиночку, а в сочетании с другими показателями, такими как отзыв.
  • При повышении ложных оповещений дорого, и когда вы хотите, чтобы все положительные прогнозы стоили взглянуть на вас, должны оптимизировать точность.

Переверните обратно в список показателей оценки ->

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

Когда вы оптимизируете отзыв, вы хотите поставить все вину в тюрьму .

Как вычислить:

from sklearn.metrics import confusion_matrix, recall_score

y_pred_class = y_pred_pos > threshold
tn, fp, fn, tp = confusion_matrix(y_true, y_pred_class).ravel()
true_positive_rate = tp / (tp + fn)

# or simply

recall_score(y_true, y_pred_class)

Как модели оценки в этой метрике.5):

Наша лучшая модель может вспомнить 0,72 мошеннических транзакций на пороге 0,5. Разница в отзывах между нашими моделями весьма значительна, и мы можем ясно видеть лучшие и худшие модели. Конечно, для каждой модели мы можем отрегулировать порог, чтобы вспомнить все мошеннические транзакции.

Как это зависит от порога:

Для порога 0,1 мы классифицируем подавляющее большинство транзакций как мошеннические и, следовательно, получаем действительно высокий отзыв 0,917. По мере того, как порог увеличивает отзыв падает.

Когда его использовать:

  • Обычно вы не будете использовать его в одиночку, а скорее в сочетании с другими показателями, такими как точность.,
  • При этом, отпомните, это показатель, когда вы действительно заботитесь о том, чтобы поймать все мошеннические транзакции даже по цене ложных оповещений. Потенциально для вас дешево обрабатывать эти оповещения и очень дорого, когда транзакция остается невидимой.

Переверните обратно в список показателей оценки ->

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

Когда вы оптимизируете точность, вы хотите убедиться, что Люди, которых вы вложили в тюрьму, виновны Анкет

Как вычислить:

from sklearn.metrics import confusion_matrix, precision_score

y_pred_class = y_pred_pos > threshold
tn, fp, fn, tp = confusion_matrix(y_true, y_pred_class).ravel()
positive_predictive_value = tp/ (tp + fp)

# or simply

precision_score(y_true, y_pred_class)

Как модели оценки в этой метрике.5):

Кажется, что все модели имеют довольно высокую точность на этом пороге. «Лучшая модель» – невероятно мелкая лайтгбм, которая, очевидно, пахнет подозрительной. Это важный вывод, который рассматривает точность (или только отзыв), может привести к выбору неоптимальной модели.

Конечно, для каждой модели мы можем отрегулировать порог, чтобы повысить точность. Это потому, что если мы возьмем небольшую часть прогнозов с высокой оценкой, точность на них, вероятно, будет высокой.

Как это зависит от порога:

Чем выше порог, тем лучше точность, и с порогом 0,68 мы можем получить совершенно точную модель. За этот порог модель ничего не классифицирует как положительное И поэтому мы не планируем это.

Когда его использовать:

  • Опять же, обычно не имеет смысла использовать его в одиночку, а в сочетании с другими показателями, такими как отзыв.
  • При повышении ложных оповещений дорого, если вы хотите, чтобы все положительные прогнозы стоили взглянуть на вас, должны оптимизировать точность.

Переверните обратно в список показателей оценки ->

Он измеряет, сколько наблюдений, как положительных, так и отрицательных, было правильно классифицировано.

Ты Не должен использовать точность для несбалансированных задач Анкет Затем легко получить высокую оценку точности, просто классифицируя все наблюдения как большинство класса. Например, в нашем случае, классифицируя все транзакции как нездоровые, мы можем получить точность более 0,9.

Как вычислить:

from sklearn.metrics import confusion_matrix, accuracy_score

y_pred_class = y_pred_pos > threshold
tn, fp, fn, tp = confusion_matrix(y_true, y_pred_class).ravel()
accuracy = (tp + tn) / (tp + fp + fn + tn)

# or simply

accuracy_score(y_true, y_pred_class)

Как модели оценки в этой метрике.5):

Мы видим, что для всех моделей мы бьем манекен -модель (все чистые транзакции) с большим отрывом. Кроме того, модели, которые мы ожидаем быть лучше, на самом деле на самом деле.

Как это зависит от порога:

С точностью вы действительно можете использовать диаграммы, подобные вышеуказанному, чтобы определить оптимальный порог. В этом случае выбрать что-то чуть более стандартного 0,5 может увеличить счет на чуть-чуть 0,9686-> 0,9688.

Когда его использовать:

  • Когда ваша проблема сбалансирована, использование точности, как правило, является хорошим началом. Дополнительным преимуществом является то, что в вашем проекте действительно легко объяснить это нетехническим заинтересованным сторонам,
  • Когда каждый класс одинаково важен для вас.

Переверните обратно в список показателей оценки ->

Проще говоря, он сочетает в себе точность и вспоминает в одну метрику. Чем выше оценка, тем лучше наша модель. Вы можете рассчитать это следующим образом:

При выборе бета-версии в своей F-бета-оценке Чем больше вы заботитесь о отзыве над точностью Высшая бета Вы должны выбрать. Например, с оценкой F1 мы заботимся о том, как отзыв и точность с оценкой F2, отзыв для нас в два раза больше.

С 01 наш оптимальный порог движется к нижним порогам и с ним где -то посередине.

Как вычислить:

from sklearn.metrics import fbeta_score

y_pred_class = y_pred_pos > threshold
fbeta_score(y_true, y_pred_class, beta)

Переверните обратно в список показателей оценки ->

Это гармоническое среднее между точностью и отзывами.

Как модели оценки в этой метрике.5):

Как мы видим, объединяет точность, и отзыв дал нам более реалистичный взгляд на наши модели. Мы получаем 0,808 за лучшую и много места для улучшения.

Что хорошо, так это то, что он, кажется, правильно ранжирует наши модели с этими большими LightGBM наверху.

Как это зависит от порога:

Мы можем Отрегулируйте порог, чтобы оптимизировать оценку F1 Анкет Обратите внимание, что как для точности, так и для отзыва вы можете получить идеальные оценки, увеличив или уменьшая порог. Хорошо, что Вы можете найти сладкое место для F1 метрика. Как вы можете видеть, получение правильного порога может фактически улучшить ваш счет на 0,8077-> 0,8121.

Когда его использовать:

  • В значительной степени в каждой проблеме бинарной классификации. Это мой показатель, работая над этими проблемами. Это может быть легко объяснено заинтересованным сторонам бизнеса.

Переверните обратно в список показателей оценки ->

Это метрика, которая сочетает в себе точность и отзыв, вкладывая 2x акцент на отзыве Анкет

Как модели оценки в этой метрике.5):

Этот балл даже ниже для всех моделей, чем F1, но может быть увеличен, настройка порога. Опять же, это, кажется, правильно ранжирует наши модели, по крайней мере, в этом простом примере.

Как это зависит от порога:

Мы видим это с более низким порогом и, следовательно, более настоящими позитивами, напоминающими, что мы получаем более высокий балл. Вы обычно можете Найдите сладкое место для порога. Возможный выигрыш от 0,755 -> 0,803 Покажите, как Важно Пороговые настройки могут быть здесь.

Когда его использовать:

  • Я бы подумал об использовании, когда напоминание о положительных наблюдениях (мошеннические транзакции) важнее, чем точнее в этом

Переверните обратно в список показателей оценки ->

Проще говоря, Коэн Каппа говорит вам, насколько лучше ваша модель по сравнению с случайным классификатором, который предсказывает на основе частот классов.

Чтобы рассчитать это, нужно рассчитать две вещи: «наблюдаемое соглашение» (PO) и «Ожидаемое соглашение» (PE) Анкет Наблюдаемое согласие (PO) – это просто то, как наши прогнозы классификатора согласуются с основной истиной, что означает, что это просто точность. Ожидаемое соглашение (PE) – это то, как прогнозы Случайный классификатор, который выборы в соответствии с частотами классов Согласитесь с основной истиной или точностью случайного классификатора.

С точки зрения интерпретации, мне нравится, что он расширяет что -то очень простое в объяснении (точности) на ситуации, когда ваш набор данных несбалансирован путем включения базового (фиктивного) классификатора.

Как вычислить:

from sklearn.metrics import cohen_kappa_score

cohen_kappa_score(y_true, y_pred_class)

Как модели оценки в этой метрике.5):

Мы можем легко различить худшие/лучшие модели на основе этой метрики. Кроме того, мы видим, что есть еще много возможностей для улучшения нашей лучшей модели.

Как это зависит от порога:

С диаграммой, как и выше, мы можем найти порог, который оптимизирует Коэна Каппа. В этом случае он составляет 0,31, что дает нам некоторое улучшение 0,7909 -> 0,7947 из стандарта 0,5.

Когда его использовать:

  • Этот показатель не используется в контексте классификации. Тем не менее, это может очень хорошо работать для несбалансированных проблем и кажется отличным компаньоном/альтернативой точности.

Переверните обратно в список показателей оценки ->

Это корреляция между предсказанными классами и наземной правдой. Он может быть рассчитан на основе значений из матрицы путаницы:

В качестве альтернативы вы также можете рассчитать корреляцию между Y_TRUE и Y_PRED.

Как вычислить:

from sklearn.metrics import matthews_corrcoef

y_pred_class = y_pred_pos > threshold
matthews_corrcoef(y_true, y_pred_class)

Как модели оценки в этой метрике.5):

Мы можем ясно видеть улучшения в качестве модели и много места для выращивания, что мне действительно нравится. Кроме того, он оценивает наши модели разумно и ставит модели, которые, как вы ожидаете, будут лучше. Конечно, MCC зависит от порога, который мы выбираем.

Как это зависит от порога:

Мы можем настроить порог для оптимизации MCC. В нашем случае лучшая оценка – 0,53, но мне действительно нравится, что он не очень чувствителен к пороговым изменениям.

Когда его использовать:

  • При работе над несбалансированными проблемами,
  • Когда вы хотите, чтобы что -то легко интерпретирулось.

Переверните обратно в список показателей оценки ->

Это диаграмма, которая визуализирует компромисс между истинной положительной скоростью (TPR) и ложным положительным уровнем (FPR). По сути, для каждого порога мы рассчитываем TPR и FPR и наносите его на одну диаграмму.

Конечно, чем более высокий TPR и более низкий FPR для каждого порога, тем лучше и поэтому классификаторы, которые имеют кривые, более левые верхние левые, лучше.

Обширное обсуждение кривой ROC и оценки ROC AUC можно найти в этом Статья Тома Фосетта Анкет

Как вычислить:

from scikitplot.metrics import plot_roc

fig, ax = plt.subplots()
plot_roc(y_true, y_pred, ax=ax)

Как это выглядит:

Мы можем увидеть здоровую кривую ROC, подталкивающуюся к верхней левой стороне как для положительного, так и для отрицательного класса. Неясно, какой, какой работает лучше по всему плату, так как при FPR <~ 0,15 положительный класс выше, и начиная с FPR ~ 0,15 отрицательный класс выше.

Переверните обратно в список показателей оценки ->

Чтобы получить один номер, который сообщает нам, насколько хороша наша кривая, мы можем рассчитать область под кривой ROC или оценку ROC AUC. Чем более верхняя левая ваша кривая, тем выше площадь и, следовательно, более высокий балл ROC AUC.

В качестве альтернативы, Можно показать, что оценка ROC AUC эквивалентна вычислению корреляции ранга между прогнозами и целями. С точки зрения интерпретации, это более полезно, потому что он говорит нам, что этот показатель показывает Насколько хорош в ранжировании прогнозов ваша модель Анкет Он говорит вам, какова вероятность того, что случайно выбранного положительного экземпляра ранжируется выше, чем случайно выбранного отрицательного экземпляра.

Как вычислить:

from sklearn.metrics import roc_auc_score

roc_auc = roc_auc_score(y_true, y_pred_pos)

Как модели оценки в этом показателе:

Мы можем видеть улучшения, и модели, которые можно предположить, что они действительно лучше забивают. Кроме того, счет не зависит от порога, который пригодится.

Когда его использовать:

  • Ты должен использовать его Когда вы в конечном итоге забота о ранжировании прогнозов и не обязательно о выводе хорошо калиброванных вероятностей (прочтите это Статья Джейсона Браунли Если вы хотите узнать о калибровке вероятности).
  • Ты не должен использовать его Когда ты Данные сильно несбалансированы Анкет Это широко обсуждалось в этом Статья Такая Сайто и Марка Рехмсмейера Анкет Интуиция является следующей: ложная положительная скорость для высоко дисбалансированных наборов данных снижается из -за большого количества истинных негативов.
  • Ты должен использовать его, когда вы одинаково заботитесь о положительных и отрицательных классах . Естественно расширяет бесбалансированное обсуждение данных из последнего раздела. Если мы заботимся о истинных негативах так же сильно, как и мы заботимся о истинных положительных моментах, то вполне имеет смысл использовать ROC AUC.

Переверните обратно в список показателей оценки ->

Это кривая, которая сочетает в себе точность (PPV) и отзыв (TPR) в одной визуализации. На каждый порог вы рассчитываете PPV и TPR и набираете его. Чем выше оси Y ваша кривая, тем лучше производительность вашей модели.

Вы можете использовать этот сюжет, чтобы принять образованное решение, когда речь заходит о классической дилемме точности/отзыва. Очевидно, чем выше вспоминание, тем ниже точность. Знание причем напомним, что ваша точность начинает быстро падать может помочь вам выбрать порог и предоставить лучшую модель.

Как вычислить:

from scikitplot.metrics import plot_precision_recall

fig, ax = plt.subplots()
plot_precision_recall(y_true, y_pred, ax=ax)

Как это выглядит:

Мы видим, что для негативного класса мы поддерживаем высокую точность и высокий отзыв почти на протяжении всего диапазона порогов. Поскольку положительная точность класса начинает падать, как только мы вспоминаем 0,2 истинных положительных результатов, и к тому времени, когда мы достигли 0,8, она уменьшается примерно до 0,7.

Переверните обратно в список показателей оценки ->

Подобно показателю ROC AUC, вы можете рассчитать область под кривой точно-рецидивного, чтобы получить одно число, которое описывает производительность модели.

Вы также можете подумать о PR AUC как о среднем показателях точности, рассчитанных для каждого порога отзыва [0,0, 1,0]. Вы также можете настроить это определение в соответствии с потребностями вашего бизнеса, выбирая/при необходимости выбирая/подрезание пороговых значений.

Как вычислить:

from sklearn.metrics import average_precision_score

average_precision_score(y_true, y_pred_pos)

Как модели оценки в этом показателе:

Модели, которые, как мы подозреваем, «по -настоящему» лучше, на самом деле лучше в этой метрике, что определенно хорошо. В целом, мы можем видеть высокие оценки, но намного менее оптимистичные, чем оценки ROC AUC (0,96+).

Когда его использовать:

  • Когда вы хотите Сообщите решение о точности/отзыве другим заинтересованным сторонам
  • Когда вы хотите Выберите порог, который соответствует проблеме бизнеса Анкет
  • Когда ваши данные будут сильно несбалансированно Анкет Как упоминалось ранее, это широко обсуждалось в этом Статья Такая Сайто и Марка Рехмсмейера Анкет Интуиция является следующим: поскольку PR AUC фокусируется в основном на положительном классе (PPV и TPR), он меньше заботится о частых отрицательных классах.
  • Когда Вы больше заботитесь о положительном, чем отрицательном классе Анкет Если вы больше заботитесь о положительном классе и, следовательно, PPV и TPR, вы должны перейти с кривой точно-рецизионной и PR AUC (средняя точность).

Переверните обратно в список показателей оценки ->

Потеря журнала часто используется в качестве целевой функции, которая оптимизируется под капотом моделей машинного обучения. Тем не менее, его также можно использовать в качестве метрики производительности.

По сути, мы рассчитываем разницу между наземной истиной и прогнозируемой оценкой для каждого наблюдения и средним этим ошибками по всем наблюдениям. Для одного наблюдения формула ошибки гласит:

Чем уверенна наша модель, что наблюдение является положительным, когда на самом деле это положительно, тем меньше ошибка. Но это не линейные отношения. Хорошо взглянуть на то, как меняется ошибка, поскольку эта разница увеличивается:

Таким образом, наша модель очень сильно наказывается, когда мы уверены в чем -то, что не соответствует действительности. Например, когда мы даем оценку 0,9999 для наблюдения, которое отрицательно, наша потеря перепрыгивает через крышу. Вот почему иногда имеет смысл обрезать ваши прогнозы, чтобы снизить риск этого происходящего.

Если вы хотите узнать больше о Log-Loss Прочтите это Статья Даниэля Годоа Анкет

Как вычислить:

from sklearn.metrics import log_loss

log_loss(y_true, y_pred)

Как модели оценки в этом показателе:

Трудно увидеть сильное улучшение и получить интуитивное ощущение, насколько сильна модель. Кроме того, модель, которая была выбрана как лучшая до (BIN-101), находится в середине пакета. Это может указывать на то, что использование логарифмического потери в качестве метрики производительности может быть рискованным предложением.

Когда его использовать:

  • В значительной степени Всегда есть Производительность Метрика, которая лучше соответствует вашему Бизнес Проблема Анкет Из-за этого я бы использовал логарифмические потери в качестве цели для вашей модели с какой-то другой метрикой для оценки производительности.

Переверните обратно в список показателей оценки ->

Это мера того, как далеко ваши прогнозы лежат от истинных значений. Для одного наблюдения это просто гласит:

По сути, это средняя квадратная ошибка в пространстве вероятности, и из -за этого она обычно используется для калибровки вероятностей моделей машинного обучения. Если вы хотите прочитать больше о калибровке вероятности, я рекомендую вам прочитать это Статья Джейсона Браунли Анкет

Это может быть отличным дополнением к вашему баллу ROC AUC и другим показателям, которые сосредоточены на других вещах.

Как вычислить:

from sklearn.metrics import brier_score_loss

brier_score_loss(y_true, y_pred_pos)

Как модели оценки в этом показателе:

Модель из Эксперимент bin-101 имеет лучшую калибровку и для этой модели, в среднем наши прогнозы были выключены на 0,16 (√0.0263309).

Когда его использовать:

  • Когда Вы заботитесь о калиброванных вероятностях Анкет

Переверните обратно в список показателей оценки ->

Проще говоря, это помогает вам оценить, сколько вы получаете, используя свою модель по случайной модели для данной доли лучших оцениваемых прогнозов.

Проще говоря:

  • Вы заказываете свои прогнозы с самых высоких до самых низких и
  • Для каждого процентиля вы рассчитываете долю истинных положительных наблюдений до этого процентиля.

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

Как вычислить:

from scikitplot.metrics import plot_cumulative_gain

fig, ax = plt.subplots()
plot_cumulative_gain(y_true, y_pred, ax=ax)

Как это выглядит:

Мы видим, что наша совокупная диаграмма прибыли стреляет очень быстро, поскольку мы увеличиваем выборку с самыми высокими показателями. К тому времени, когда мы добираемся до 20 -го процентиля, более 90% положительных случаев покрываются. Вы можете использовать эту диаграмму для определения приоритетов и отфильтровать возможные мошеннические транзакции для обработки.

Скажем, мы должны были использовать нашу модель для назначения возможных мошеннических транзакций для обработки, и нам нужно было расставить приоритеты. Мы могли бы использовать эту диаграмму, чтобы рассказать нам, где имеет смысл выбрать отсечение.

Когда его использовать:

  • Всякий раз, когда вы хотите выбрать наиболее перспективных клиентов или транзакций для цели, и вы хотите использовать свою модель для сортировки.
  • Это может быть хорошим дополнением к оценке ROC AUC, который измеряет рейтинг/сортировку вашей модели.

Переверните обратно в список показателей оценки ->

Это в значительной степени просто другое представление диаграммы совокупных выигрыш:

  • Мы заказываем прогнозы от самых высоких до самых низких
  • Для каждого процентиля мы рассчитываем долю истинных положительных наблюдений до этого процентиля для нашей модели и для случайной модели,
  • Мы рассчитываем соотношение этих фракций и график его.

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

Как вычислить:

from scikitplot.metrics import plot_lift_curve

fig, ax = plt.subplots()
plot_lift_curve(y_true, y_pred, ax=ax)

Как это выглядит:

Таким образом, для лучших 10% прогнозов наша модель в 10 раз лучше, чем случайная, для 20% более чем в 4 раза лучше и так далее.

Когда его использовать:

  • Всякий раз, когда вы хотите выбрать наиболее перспективных клиентов или транзакций для цели, и вы хотите использовать свою модель для сортировки.
  • Это может быть хорошим дополнением к оценке ROC AUC, который измеряет рейтинг/сортировку вашей модели.

Переверните обратно в список показателей оценки ->

График KS помогает оценить разделение между распределением прогнозирования для положительных и отрицательных классов.

Чтобы создать это вам:

  • Сортируйте свои наблюдения по оценке прогнозирования,
  • Для каждой точки отсечения [0,0, 1,0] отсортированного набора данных (глубины) рассчитайте долю истинных положительных и истинных отрицательных.
  • Постройте эти фракции, положительные (глубину)/положительный (все), отрицательный (глубина)/отрицательный (все), на оси y и глубину набора данных на оси x.

Таким образом, он работает аналогично совокупной диаграмме прибыли, но вместо того, чтобы просто смотреть на положительный класс, он смотрит на разделение между положительным и отрицательным классом.

Хорошее объяснение сюжета KS и статистики KS можно найти в этом Статья Риаз Хана Анкет

Как вычислить:

from scikitplot.metrics import plot_ks_statistic

fig, ax = plt.subplots()
plot_ks_statistic(y_true, y_pred, ax=ax)

Как это выглядит:

Таким образом, мы видим, что самая большая разница находится в точке отсечения 0,034 лучших прогнозов. После этого порога он уменьшается по умеренной скорости, поскольку мы увеличиваем процент лучших прогнозов. Около 0,8 это действительно становится все хуже очень быстро. Таким образом, хотя лучшее разделение – 0,034, мы могли бы потенциально подтолкнуть его немного выше, чтобы получить более позитивно классифицированные наблюдения.

Переверните обратно в список показателей оценки ->

Если мы хотим взять график KS и получить одно число, которое мы можем использовать в качестве метрики, мы можем посмотреть на все пороговые значения (отсечение набора данных) с графика KS и найти тот, на который расстояние (разделение) между распределением истинного положительного и Истинные негативные наблюдения являются самыми высокими.

Если есть порог, для которого все вышеуказанные наблюдения действительно положительны, и все наблюдения, приведенные ниже, действительно отрицательны, мы получаем идеальную статистику KS 1.0.

Как вычислить:

from scikitplot.helpers import binary_ks_curve

res = binary_ks_curve(y_true, y_pred_pos)
ks_stat = res[3]

Как модели оценки в этом показателе:

Используя статистику KS в качестве метрики, мы смогли ранжировать BIN-101 как лучшую модель, которую мы действительно ожидаем быть «по-настоящему» лучшей моделью.

Когда его использовать:

  • Когда ваша проблема заключается в сортировке/приоритетах наиболее важных наблюдений и в равной степени заботитесь о положительных и отрицательных классах.
  • Это может быть хорошим дополнением к оценке ROC AUC, который измеряет рейтинг/сортировку вашей модели.

Переверните обратно в список показателей оценки ->

В этом сообщении вы узнали о различных показателях классификации и таблицах производительности.

Мы провели метрические определения, интерпретации, мы узнали, как их рассчитать, и говорили о том, когда их использовать.

Надеемся, что со всеми этими знаниями вы будете полностью оборудованы для решения проблем, связанных с метрикой в ваших будущих проектах.

Чтобы помочь вам использовать информацию из этого блога в полной мере, я подготовил:

  • Функция журнала HERPER Это рассчитывает и регистрирует все метрики, диаграммы производительности и метрику по порогам диаграммы
  • Метрика бинарной классификации читшхет Со всем, что я говорил о переваренном виде в несколько страниц.

Проверьте их ниже!

Функция журнала HERPER

Если вы хотите зарегистрировать все эти метрики и диаграммы производительности, которые мы рассмотрели для вашего проекта машинного обучения только одним вызовом функции и изучите их в Нептуне.

  • Установите пакет:
pip install neptune-contrib[all]

  • импортировать и запустить:
import neptunecontrib.monitoring.metrics as npt_metrics

npt_metrics.log_binary_classification_metrics(y_true, y_pred)
  • Исследуйте все в приложении:

Бинарная лист метрик классификации

Мы создали для вас хороший чит-лист, который занимает весь контент, который я зашел в этом сообщении в блоге, и помещает его на несколько страниц, усваиваемый документ, который вы можете распечатать и использовать всякий раз, когда вам нужно что-либо, связанное с показателями бинарной классификации.

Скачать чит -лист метрик бинарной классификации

Пример скрипта

import lightgbm
import matplotlib.pyplot as plt
import neptune
from neptunecontrib.monitoring.utils import pickle_and_send_artifact
from neptunecontrib.monitoring.metrics import log_binary_classification_metrics
from neptunecontrib.versioning.data import log_data_version
import pandas as pd

plt.rcParams.update({'font.size': 18})
plt.rcParams.update({'figure.figsize': [16, 12]})
plt.style.use('seaborn-whitegrid')

# Define parameters
PROJECT_NAME = 'neptune-ml/binary-classification-metrics'

TRAIN_PATH = 'data/train.csv'
TEST_PATH = 'data/test.csv'
NROWS = None

MODEL_PARAMS = {'random_state': 1234,
                'learning_rate': 0.1,
                'n_estimators': 1500}

# Load data
train = pd.read_csv(TRAIN_PATH, nrows=NROWS)
test = pd.read_csv(TEST_PATH, nrows=NROWS)

feature_names = [col for col in train.columns if col not in ['isFraud']]

X_train, y_train = train[feature_names], train['isFraud']
X_test, y_test = test[feature_names], test['isFraud']

# Start experiment
neptune.init(PROJECT_NAME)
neptune.create_experiment(name='lightGBM training',
                          params=MODEL_PARAMS,
                          upload_source_files=['train.py', 'environment.yaml'])
log_data_version(TRAIN_PATH, prefix='train_')
log_data_version(TEST_PATH, prefix='test_')

# Train model
model = lightgbm.LGBMClassifier(**MODEL_PARAMS)
model.fit(X_train, y_train)

# Evaluate model
y_test_pred = model.predict_proba(X_test)

log_binary_classification_metrics(y_test, y_test_pred)
pickle_and_send_artifact((y_test, y_test_pred), 'test_predictions.pkl')

neptune.stop()

Оригинал: “https://dev.to/jakubczakon/24-evaluation-metrics-for-binary-classification-and-when-to-use-them-4042”