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

Матрица неточностей

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

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

Показатели

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

«Конкретные» показатели - точность и запоминание

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

ТОЧНОСТЬ

Что это? Точность показывает, сколько раз модель выявила истинные положительные результаты. В моем примере - сколько раз моя модель предсказывала, что пользователь совершит бронирование, в то время как это было правдой.

Недостаток. Проблема с точностью заключается в том, что для достижения почти 100% требуется только быть чрезвычайно консервативным и иметь очень высокий порог для определения положительного результата. В моем примере, если моя модель пометила пользователя положительным (= совершит бронирование) только тогда, когда была чрезвычайно уверена, что это будет правдой, точность будет очень высокой. Однако он будет неправильно маркировать других пользователей из-за своей высокой осторожности.

ОТЗЫВ

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

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

Точность или отзывчивость - какой показатель выбрать?

Это действительно зависит от целей вашего проекта.

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

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

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

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

«Общие» показатели - точность и оценка F1

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

Точность

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

F1 - Оценка

F1-оценка наказывает модель за большую разницу между отзывом и точностью. Таким образом, он представляет собой баланс между двумя «конкретными» показателями. Если и отзывчивость, и точность высоки, показатель F1 также будет высоким.

Как и другие показатели, показатель F1 находится в диапазоне от 0 до 1. Если ваша модель имеет высокую точность, но немного ниже показатель F1, это означает, что ваша модель не сбалансирована с точки зрения двух «конкретных» показателей и есть место для улучшение.

Получение показателей

Самый простой способ получить эти показатели - импортировать отчет о классификации из sklearn.

from sklearn.metrics import classification_report
print(classification_report(y_true, y_pred, target_names=target_names))

y_true = ваш набор ярлыков для тестирования (истинные ярлыки)

y_pred = предсказанные вами модели

target_names = имена ваших классов. Если ваша классификация двоичная, это будет просто [0,1]

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

Чтобы получить общую точность, вы также можете использовать инструмент из sklearn и передать истинные и предсказанные метки. Если вы измените normalize на False, на выходе будет количество правильных меток, а не процент.

from sklearn.metrics import accuracy_score
accuracy_score(y_true, y_pred, normalize=True)

Кривые ROC и AUC

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

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

Готовая функция для всего вышеперечисленного

from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
def model_stats(labels, predictions, name_of_model):
    print('Classification Report for: '+str(name_of_model))
    print("\n")
    print(classification_report(labels, predictions))
    print("\n")
    print('Confusion matrix')
    print(confusion_matrix(labels,predictions))
    print("\n")
    
    fpr, tpr, thresholds = roc_curve(labels, predictions)
    print('AUC: {}'.format(auc(fpr, tpr)))
    plt.figure(figsize=(5, 4))
    lw = 2
    plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label='ROC curve')
    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.yticks([i/20.0 for i in range(21)])
    plt.xticks([i/20.0 for i in range(21)])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver operating characteristic (ROC) Curve')
    plt.legend(loc='lower right')
    plt.show()

Эта функция предоставит вам отчет о классификации, матрицу неточностей и кривую ROC. Все, что вам нужно сделать, это передать ваши истинные метки, предсказанные метки, имя модели (в виде строки).

labels= [0,0,0,0,0,0,1,1,1,1,1]
preds= [1,1,0,0,0,1,1,1,0,1,1]
model_stats(labels, preds,'Model XYZ')