В этом посте я четко объясню, что такое кривая ROC и как ее читать. Я использую пример COVID-19, чтобы выразить свою точку зрения, а также говорю о матрице путаницы. Наконец, я предоставляю код Python для построения ROC и матрицы путаницы из случаев мультиклассовой классификации.

1. Введение

В 99% случаев, когда используется классификация модели машинного обучения, люди сообщают ее график ROC кривой (а также AUC: площадь согласно ROC) вместе с другими показателями, такими как точность модели или матрица путаницы .

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

1.1. Определение ROC

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

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

Кривая ROC создается путем построения графика истинно положительной скорости (TPR) против ложной положительной скорости (FPR) при различных порог. Уровень истинно положительных результатов также известен как чувствительность, отзыв или вероятность обнаружения в машинном обучении. Частота ложных срабатываний также известна как вероятность ложной тревоги и может быть рассчитана как (1– специфичность). Он говорит нам, насколько хорошо наша модель может различать классы.

Много терминологии, не так ли? Подождите секунду, я объясню все эти термины в следующем разделе на примере, который заставит вас всегда помнить все эти термины.

1.2. Четкое объяснение терминологии (TP, TN, FP, FN)

Пример теста на COVID-19

Представим, что у нас есть тест на COVID-19, который в течение нескольких секунд может определить, пострадал ли один человек от вируса или нет. Таким образом, результат теста может быть либо положительным (затронутым), либо отрицательным (не затронутым) - у нас есть случай двоичной классификации .

Также предположим, что мы знаем основную истину и что у нас есть 2 группы населения:

  • а) люди, которые действительно затронуты (TP: истинно положительные результаты, распределение синего цвета на рисунке ниже) и
  • б) люди, которые не затронуты (TN: True Negative, красный на рисунке ниже) - случай двоичной классификации.

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

Затем мы используем наш тест covid и определяем порог (допустим, 20). Если тестовое значение, если выше порога, обозначает этого человека как затронутого (положительный, зараженный коронавирусом). С другой стороны, если тестовое значение, если ниже порога, мы обозначаем этого человека как не - затронуты (отрицательно, без вирусов). Таким образом, основываясь на результатах теста, мы можем обозначить человека как затронутое (положительное, синее население ) или не затронут (отрицательный, красный совокупность).

Чтобы все это усвоить, взгляните на рисунок ниже.

Но есть загвоздка! Наш тест не может быть идеальным!

Некоторые люди будут ошибочно классифицированы как положительные (зараженные коронавирусом, мы называем это ложными положительными результатами ( FP)) или отрицательный (без covid, мы называем это False Negatives (FN )).

Резюме:

  • Истинно-положительные (TP, синий распределение) - это люди, которые действительно заражены вирусом COVID-19.
  • Истинно-отрицательные (TN, красный распределение ) - это люди, которые действительно НЕ заражены вирусом COVID-19.
  • Ложноположительные результаты (FP) - это люди, которые на самом деле НЕ больны, но на основании теста они были ложно (Неверно) обозначено как Заболевание (Положительно).
  • Ложноотрицательные (FN) - это люди, которые действительно больны, но на основании теста они были ложно ( Неверно) обозначается как НЕ болен (Отрицательно).
  • Для идеального случая нам нужны высокие значения TP и TN и ноль FP и FN - это была бы идеальная модель с идеальной кривой ROC.

1.3. Кривая ROC, AUC и матрица неточностей

РПЦ

Теперь, когда мы поняли термины TP, TN, FP, FN, давайте снова вернемся к определению кривой ROC.

Кривая ROC создается путем построения графика истинно положительной скорости (TPR) против ложной положительной скорости (FPR) при различных порог. Другими словами, кривая ROC показывает компромисс между TPR и FPR для различных настроек пороговых значений базовой модели.

  • Если кривая находится выше диагонали, модель хорошая и выше вероятности (вероятность составляет 50% для двоичный регистр). Если кривая находится ниже диагонали, модель считается плохой.

AUC

AUC (площадь под кривой) указывает, находится ли кривая выше или ниже диагонали (уровень вероятности). . Значение AUC составляет от 0 до 1. Модель, прогнозы которой на 100% ошибочны, имеет AUC 0,0, а модель, прогнозы которой на 100% верны, имеет AUC 1,0.

Матрица замешательства

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

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

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

Это достигается изменением некоторых пороговых значений. Кривая ROC показывает компромисс между TPR и FPR для различных пороговых значений.

Например, в случае Поддержки Вектор Машины (SVC) этот порог - это не что иное, как член смещения в уравнении границы решения. Итак, мы изменим это смещение (это изменит положение границы решения) и оценим FPR и TPR для данных значений смещения.

Чтобы узнать все о SVM, загляните в этот пост.

1.4. Кривая ROC и матрица неточностей для задач многоклассовой классификации

Кривая ROC только определена для двоичной классификации проблем. Однако есть способ интегрировать его в задачи многоклассовой классификации. Для этого, если у нас есть N классов, нам нужно будет определить несколько моделей.

Например, если у нас есть N = 3 класса, нам нужно будет определить следующие случаи: case / model 1 для класса 1 vs class 2, case / модель 2 для класса 1 по сравнению с классом 2 и случай / модель 3 для класса 1 по сравнению с классом 3.

Помните, что в нашем примере теста на Covid-19 у нас было 2 возможных исхода, т. е. влияние вируса (положительные) и отсутствие воздействия (отрицательные). . Точно так же в случаях с несколькими классами мы снова должны определить положительные и отрицательные результаты.

В случае с несколькими классами для каждого случая положительный класс является вторым :

  • для случая 1: «класс 1 по сравнению с классом 2», положительный класс - это класс 2
  • для случая 2: «класс 2 по сравнению с классом 3», положительный класс - это класс 3
  • для случая 3: «класс 1 по сравнению с классом 3», положительным классом является класс 3.

Другими словами, мы можем думать об этом следующим образом: мы спрашиваем классификатора: «Этот образец положительный или отрицательный?» и классификатор предугадывает метку (положительный или отрицательный). ROC будет оцениваться для каждого случая 1,2,3 независимо.

То же самое и с матрицей неточностей. У нас будет одна матрица неточностей для каждого случая.

2. Рабочий пример Python

Теперь вы должны знать все о кривой ROC и матрице путаницы, а также должны быть знакомы с такой терминологией, как TP, TN, FP, FN, TPR, FPR. Теперь давайте создадим пример работающего python.

2.1 Модель классификации

В предыдущем сообщении я объяснил, что такое SVC, поэтому здесь мы будем использовать такую ​​модель.

2.2 Набор данных

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

С этой целью модель будет использоваться для класса 1 против класса 2, класса 2 против класса 3 и класса 1 против класса 3. Итак, у нас есть 3 случая в конце, и в каждом случае смещение будет варьироваться, чтобы получить кривую ROC для данный случай - итак, 3 кривых ROC на выходе.

2.3 Пример использования данных Iris и scikit-learn

Кривая ROC и показатель AUC

import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.metrics import roc_curve, auc
from sklearn.multiclass import OneVsRestClassifier
from itertools import cycle
plt.style.use('ggplot')

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

# Load the iris data
iris = datasets.load_iris()
X = iris.data
y = iris.target
# Binarize the output
y_bin = label_binarize(y, classes=[0, 1, 2])
n_classes = y_bin.shape[1]
# We split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y_bin, test_size= 0.5, random_state=0)

Наконец, мы строим нашу модель (SVC) и оцениваем кривую ROC для трех случаев: класс 1 против класса 2, класс 2 против класса 3 и класс 1 против класса 3.

Каждый раз положительный класс становится вторым , т. Е. для case 1 : «класс 1 против класса 2», положительный класс - это класс 2, для случая 2: « класс 2 по сравнению с классом 3 », положительный класс - это класс 3 и т. д.

#We define the model as an SVC in OneVsRestClassifier setting.
#this means that the model will be used for class 1 vs class 2, #class 2vs class 3 and class 1 vs class 3. So, we have 3 cases at #the end and within each case, the bias will be varied in order to #get the ROC curve of the given case - 3 ROC curves as output.
classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True, random_state=0))
y_score = classifier.fit(X_train, y_train).decision_function(X_test)
# Plotting and estimation of FPR, TPR
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])
colors = cycle(['blue', 'red', 'green'])
for i, color in zip(range(n_classes), colors):
    plt.plot(fpr[i], tpr[i], color=color, lw=1.5, label='ROC curve of class {0} (area = {1:0.2f})' ''.format(i+1, roc_auc[i]))
plt.plot([0, 1], [0, 1], 'k-', lw=1.5)
plt.xlim([-0.05, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic for multi-class data')
plt.legend(loc="lower right")
plt.show()

Напоминание. Кривая ROC показывает обмен - выкл TPR и FPR для различных пороговых настроек базовой модели. Если кривая находится выше диагонали, модель хорошая и выше вероятности (вероятность составляет 50% для двоичный регистр). Если кривая находится ниже диагонали, модель считается плохой.

AUC (площадь под кривой) указывает, находится ли кривая выше или ниже диагонали (уровень вероятности). .

Матрица замешательства

Теперь давайте также оценим матрицу путаницы.

from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
# Load the iris data
iris = datasets.load_iris()
X = iris.data
y = iris.target
# We split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.5, random_state=0)
# the model
classifier_svc = svm.SVC(kernel='linear',random_state=0)
# fit the model using the training set
classifier_svc.fit(X_train, y_train)
# predict the labels/classes of the test set
y_pred = classifier_svc.predict(X_test)

Имея метки y_test предсказанное y_pred и основание истинности, оцените матрицу неточности:

# build the confusion matrix
cnf_matrix = confusion_matrix(y_test, y_pred)
print(cnf_matrix)
#[[21  0  0]
# [ 0 29  1]
# [ 0  1 23]]

Мы видим, что мы можем действительно предсказать ярлыки / класс всех 3 групп (значения в основном по диагонали, означающие высокое Истинно Положительные (TP) ставки).

Напоминание: матрица неточностей показывает TN, TP, FN, FP. Значения на диагонали - это подсчет TP, поэтому чем выше эти значения, тем лучше прогнозирующая способность модели.

Вот и все, ребята! Надеюсь, вам понравилась эта статья!

Последние посты











Следите за обновлениями и поддержите эти усилия

Если вам понравилась и эта статья показалась вам полезной, подпишитесь на меня!

Вопросов? Отправьте их как комментарий, и я отвечу как можно скорее.

использованная литература

[1] https://en.wikipedia.org/wiki/Confusion_matrix

[2] https://en.wikipedia.org/wiki/Support_vector_machine

[3] https://en.wikipedia.org/wiki/Receiver_operating_characteristic

[4] https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

Свяжись со мной