Это обзор основных способов оценки результатов алгоритмов классификации. Чтобы прояснить эту тему, я буду использовать примеры из своего проекта, основанного на наборе данных с 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')