Площадь под ROC-кривой (Area Under Curve – площадь под кривой, Receiver Operating Characteristic – рабочая характеристика приёмника) – это метрика оценки для задач Бинарной классификации (Binary Classification). Площадь под кривой (AUC) является мерой способности классификатора различать классы и используется в качестве сводки кривой ROC:
Представьте: вы создали свою Модель (Model) Машинного обучения (ML), но что же дальше? Вам необходимо оценить ее и оценить качество, чтобы затем Вы могли решить, стоит ли она внедрения. Вот тут-то и пригодится кривая AUC ROC.
Название может показаться скучным, но оно просто говорит о том, что мы вычисляем «Площадь под кривой» (AUC) «рабочей характеристики приёмника (ROC). Пока много неясного, но мы подробно рассмотрим, что означают эти термины, и все встанет на свои места.
ROC-кривая помогает визуализировать, насколько хорошо работает классификатор машинного обучения. Хотя она работает только для задач двоичной классификации, ближе к концу мы увидим, как расширить его, чтобы решать проблемы Мультиклассовой классификации (Multi-Class Classification).
Мы также затронем такие темы, как Чувствительность (Sensitivity) и Специфичность (Specificity), поскольку это ключевые вспомогательные термины.
Из Матрицы ошибок (Confusion Matrix) мы можем вывести некоторые важные показатели. Это показатель успешности классификации, где классов два или более. Это таблица с 4 различными комбинациями сочетаний прогнозируемых и фактических значений.
Давайте рассмотрим значения ячеек (истинно позитивные, ошибочно позитивные, ошибочно негативные, истинно негативные) с помощью "беременной" аналогии.
Истинно позитивное предсказание (True Positive, сокр. TP)
Вы предсказали положительный результат, и женщина действительно беременна.
Истинно отрицательное предсказание (True Negative, TN)
Вы предсказали отрицательный результат, и мужчина действительно не беременен.
Ошибочно положительное предсказание (ошибка типа I, False Positive, FN)
Вы предсказали положительный результат (мужчина беременен), но на самом деле это не так.
Ошибочно отрицательное предсказание (ошибка типа II, False Negative, FN)
Вы предсказали, что женщина не беременна, но на самом деле она беременна.
Очевидно, желательны более высокий уровень TP и более низкий уровень FN. Чувствительность говорит нам, какая часть положительного класса была правильно классифицирована:
$$Чувствительность = \frac{TP}{TP + FN}$$
$$TP\space{}{–}\space{количество}\space{истинно}\space{позитивных}\space{предсказаний,}$$
$$FN\space{}{–}\space{количество}\space{ошибочно}\space{отрицательных}\space{предсказаний}$$
Специфичность говорит нам, какая часть отрицательного класса была правильно классифицирована:
$$Специфичность = \frac{TN}{TN + FP}$$
$$TN\space{}{–}\space{количество}\space{истинно}\space{негативных}\space{предсказаний,}$$
$$FP\space{}{–}\space{количество}\space{ошибочно}\space{позитивных}\space{предсказаний}$$
Если взять тот же пример, что и в случае с чувствительностью, специфичность будет означать определение доли здоровых людей, которые были правильно идентифицированы моделью.
Доля ложных положительных классификаций (FPR) сообщает нам, какая часть отрицательного класса была неправильно классифицирована классификатором:
$$FPR = 1 - Специфичность$$
Из этих показателей чувствительность и специфичность, пожалуй, самые важные, и позже мы увидим, как они используются для построения оценочной метрики. Но перед этим давайте разберемся, почему вероятность предсказания лучше, чем предсказание целевого класса напрямую.
Модель классификации может использоваться для непосредственного определения класса Наблюдения (Observation) или прогнозирования ее вероятности принадлежности к разным классам. Последнее, как ни странно, дает нам больше контроля над результатом. Мы можем задать наш собственный порог для интерпретации результата. Иногда это более благоразумно, чем просто построить совершенно новую модель!
Установка различных пороговых значений для классификации положительного класса непреднамеренно изменит чувствительность и специфичность модели. И один из этих пороговых значений, вероятно, даст лучший результат, чем другие, в зависимости от того, стремимся ли мы снизить количество ложноотрицательных или ложноположительных результатов. Взгляните на таблицу ниже:
Показатели меняются с изменением пороговых значений. Мы можем генерировать различные матрицы путаницы и сравнивать различные метрики, которые обсуждали в предыдущем разделе. Но это было бы неразумно. Вместо этого мы можем создать график между некоторыми из этих показателей, чтобы легко увидеть, какой порог дает наилучший результат. Кривая AUC-ROC решает именно эту проблему!
ROC-кривая – это кривая вероятности, которая отображает отношение TPR к FPR при различных пороговых значениях и по существу отделяет «сигнал» от «шума». Площадь под кривой (AUC) является мерой способности классификатора различать классы. Чем выше площадь под кривой, тем лучше производительность модели.
Когда AUC равен единице, тогда классификатор может правильно различать все положительные и отрицательные точки класса:
Однако, если бы AUC была равна 0, тогда классификатор предсказывал бы все отрицательные значения как положительные, а все положительные – как отрицательные.
Когда 0,5 < AUC < 1, высока вероятность, что классификатор сможет различить положительные и отрицательных значения класса. Это так, потому что классификатор может обнаруживать больше истинно положительных и истинно отрицательных результатов, чем ложно отрицательных и ложно положительных результатов:
Когда AUC = 0,5, тогда классификатор не может различать положительные и отрицательные баллы класса. Это означает, что либо классификатор предсказывает случайный класс, либо существует один постоянный класс для всех точек данных:
Таким образом, чем выше значение AUC для классификатора, тем лучше его способность различать положительные и отрицательные классы.
На ROC-кривой более высокое значение по оси X указывает на бо́льшее количество ложных, чем истинно отрицательных "срабатываний". В то время как более высокое значение по оси Y указывает на большее количество истинно положительных, чем ложно отрицательных результатов. Итак, выбор порога зависит от способности балансировать между "ложными срабатываниями" и "ложными отрицаниями".
Давайте копнем немного глубже и поймем, как наша кривая будет выглядеть для разных пороговых значений и как будут меняться специфичность и чувствительность.
Мы можем попытаться понять этот график, сгенерировав матрицу путаницы для каждой точки, соответствующей порогу, и поговорим о производительности нашего классификатора:
В точке А графика выше чувствительность самая высокая, а специфичность – самая низкая. Это означает, что все представители положительного класса классифицируются правильно, а все представители отрицательного – неправильно. Фактически, любая точка на синей линии соответствует ситуации, когда TPR равен FPR.
Все точки над этой линией соответствуют ситуации, когда доля правильно классифицированных точек, принадлежащих к положительному классу, больше, чем доля неправильно классифицированных точек, принадлежащих к отрицательному классу.
Хотя точка B имеет ту же чувствительность, что и точка A, у нее более высокая специфичность. Это означает, что количество баллов ложно отрицательного класса ниже по сравнению с предыдущим порогом. Это указывает на то, что данный порог лучше предыдущего.
Чувствительность в точке C выше, чем в D при той же специфичности. Это означает, что для того же количества неправильно классифицированных представителей отрицательного класса классификатор предсказал большее количество баллов положительного класса. Следовательно, порог в точке C лучше, чем в точке D.
Теперь, в зависимости от того, сколько неправильно классифицированных очков мы хотим допустить для нашего классификатора, мы будем выбирать между точкой B или C.
Точка E – это место, где специфичность становится самой высокой:
Это означает, что модель не содержит ложных срабатываний. Модель может правильно классифицировать все отрицательные записи! Мы бы выбрали эту точки, если бы наша задача заключалась в генерации рекомендации Spotify.
Следуя этой логике, можете ли вы угадать, где на графике будет находиться точка, соответствующая идеальному классификатору? Да! Она будет в верхнем левом углу графика ROC, соответственно координатам (0, 1). Именно здесь чувствительность и специфичность будут наивысшими, и классификатор правильно классифицирует все положительные и отрицательные наблюдения.
Давайте посмотрим, как кросс-валидация реализована в SkLearn. Для начала импортируем необходимые библиотеки:
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
Сгенерируем игрушечный Датасет (Dataset) из 1000 наблюдений, каждое из которых принадлежит одному из двух классов. Разделим его на Тренировочные данные (Train Data) и Тестовые данные (Test Data) в пропорции 3 к 7:
X, y = make_classification(n_samples = 1000, n_classes = 2, n_features = 20, random_state = 27)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 27)
Инициируем модели Логистической регрессии (Logistic Regression) и Метода K-ближайших соседей (kNN). Затем обучим модели и сгенерируем предсказания классов для тестовой выборки:
model1 = LogisticRegression()
model2 = KNeighborsClassifier(n_neighbors = 4)
model1.fit(X_train, y_train)
model2.fit(X_train, y_train)
pred_prob1 = model1.predict_proba(X_test)
pred_prob2 = model2.predict_proba(X_test)
Конечно, мы можем вручную проверить чувствительность и специфичность для каждого порога, однако предпочту дать scikit-learn сделать всю работу за нас. В этой прекрасной библиотеке есть очень мощный метод roc_curve()
, который вычисляет ROC для классификатора за считанные секунды! Он возвращает значения FPR, TPR и пороговые значения:
fpr1, tpr1, thresh1 = roc_curve(y_test, pred_prob1[:, 1], pos_label = 1)
fpr2, tpr2, thresh2 = roc_curve(y_test, pred_prob2[:, 1], pos_label = 1)
random_probs = [0 for i in range(len(y_test))]
p_fpr, p_tpr, _ = roc_curve(y_test, random_probs, pos_label = 1)
Дело за малым: рассчитаем площади под кривой:
auc_score1 = roc_auc_score(y_test, pred_prob1[:, 1])
auc_score2 = roc_auc_score(y_test, pred_prob2[:, 1])
print(auc_score1, auc_score2)
Модель логистической регрессии более эффективна в данной ситуации, чем метод K-ближайших соседей:
0.9762374461979914 0.9233769727403157
Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.
Автор оригинальной статьи: Aniruddha Bhandari
© Лена Капаца. Все права защищены.