График ROC-прямой и расчет площади AUC
Есть готовые реализации функций, однако я пытаюсь написать код вручную. И построить график. Имеем следующий подход: мы по обученной модели соотносим истинные и ложные предсказания с тестовой выборкой. Если спрогнозировали с вероятностью больше 0.5, то величина берется за единицу и при тесте, равном также единице, относится к категории tp (то есть true positive), при нулевом тесте — к fp ( то есть false positive). Если тест единица, а у нас предсказание ноль, то имеем fn (false negative), если везде нули — tn (true negative). На основе рассчитанных счетчиков, получаем метрики tpr (true positive rate) и fpr (false positive rate). Проделав все это, затем пытаюсь готовой функцией рассчитать площадь под графиком (AUC — area under curve) и построить сам график. Площадь и график не получаются: AUC — потому что передаются float (хотя чему там еще передаваться — это же прогноз методом predict_proba!); график — пытался передать точки циклом, но тоже споткнулся о float (этот тип в цикле не перебирается)
import pandas as pd import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from matplotlib import pyplot as plt from sklearn import metrics # Создаём сэмпл n_samples = 890 # числа в диапазоне до 3 в количестве n_samples (т.е. 890 штук)+2 к каждому числу: number_of_passengers = np.random.choice(3, n_samples) + 2 price_of_ticket = np.random.choice(35000, n_samples) + 28 invoice_amount = ((np.random.choice(12, n_samples)) * price_of_ticket) + 1538 age_of_passengers = np.random.choice(78, n_samples) + 5 data = pd.DataFrame() # вообще я использовал файл с датасетом, однако здесь попробовал реализовать линейную модель, где # переменная 'Amount' при обучении может вступить целевой: X = data[['Number_of_passengers', 'Age', 'Price']] y = data['Amount'] model = LogisticRegression() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42 ) model.fit(X_train, y_train) tp = 0 # True positive fp = 0 # False positive fn = 0 # False negative tn = 0 # True negative y_pred = model.predict_proba( X_test ) for predicted_prob, actual in zip( y_pred[:,1], y_test ): if predicted_prob >= 0.5: predicted = 1 else: predicted = 0 if predicted == 1: if actual == 1: tp += 1 else: fp += 1 else: if actual == 1: fn += 1 else: tn += 1 tpr = tp/(tp+fn) fpr = fp/(fp+tn) print('Площадь, рассчитанная ручным способом: ', metrics.auc(fpr, tpr)) plt.plot(fpr, tpr)
Отслеживать
Alex_Kazantsev
задан 13 мая 2021 в 17:03
Alex_Kazantsev Alex_Kazantsev
617 1 1 золотой знак 7 7 серебряных знаков 19 19 бронзовых знаков
Погодите, вы сначала разберитесь, что у вас за задача — регрессия или классификация. У вас целевая переменная сделана под регрессию и model = LinearRegression() , но при этом вы вызываете метод model.predict_proba() , которого у LinearRegression вообще-то нет. Зато он есть у классификатора LogisticRegression и вся логика подстчёта TPR и FPR — она справедлива именно для классификации. Приведите сначала код в порядок, а то у вас сейчас помесь ежа с ужом и код нормально не запускается.
13 мая 2021 в 18:27
Спасибо за замечание. Моя невнимательность. Как говорил, в оригинальном исполнении классификация строится по имеющемуся датасету. Правку внес
14 мая 2021 в 14:59
Посмотрите ещё раз внимательно свой код и мой. У вас целевая переменная Amount — вещественная, там 12 разных значений. Как вы собираетесь определять true positive , false negative и т.д., если у вас actual — 12 разных величин, а не 1 и 0 ? Перечитайте ещё раз внимательно мой комментарий и мой ответ.
Как построить несколько кривых ROC в Python (с примером)

Одним из способов визуализации эффективности моделей классификации в машинном обучении является создание кривой ROC , которая означает кривую «рабочей характеристики приемника».
Часто вам может потребоваться подогнать несколько моделей классификации к одному набору данных и создать кривую ROC для каждой модели, чтобы визуализировать, какая модель лучше всего работает с данными.
В следующем пошаговом примере показано, как построить несколько кривых ROC в Python.
Шаг 1: Импортируйте необходимые пакеты
Во-первых, мы импортируем несколько необходимых пакетов в Python:
from sklearn import metrics from sklearn import datasets from sklearn. model_selection import train_test_split from sklearn. linear_model import LogisticRegression from sklearn. ensemble import GradientBoostingClassifier import numpy as np import matplotlib.pyplot as plt
Шаг 2: Создайте поддельные данные
Далее мы будем использовать функцию make_classification() из sklearn для создания поддельного набора данных с 1000 строками, четырьмя переменными-предикторами и одной переменной бинарного ответа:
#create fake dataset X, y = datasets. make_classification (n_samples= 1000 , n_features= 4 , n_informative= 3 , n_redundant= 1 , random_state= 0 ) #split dataset into training and testing set X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= .3 ,random_state= 0 )
Шаг 3. Подгонка нескольких моделей и построение кривых ROC
Затем мы подгоним модель логистической регрессии, а затем модель с градиентным усилением к данным и построим кривую ROC для каждой модели на одном графике:

#set up plotting area plt.figure(0).clf () #fit logistic regression model and plot ROC curve model = LogisticRegression() model. fit (X_train, y_train) y_pred = model. predict_proba (X_test)[:, 1] fpr, tpr, _ = metrics. roc_curve (y_test, y_pred) auc = round(metrics. roc_auc_score (y_test, y_pred), 4) plt.plot (fpr,tpr,label=»Logistic Regression, AUC=»+str(auc)) #fit gradient boosted model and plot ROC curve model = GradientBoostingClassifier() model. fit (X_train, y_train) y_pred = model. predict_proba (X_test)[:, 1] fpr, tpr, _ = metrics. roc_curve (y_test, y_pred) auc = round(metrics. roc_auc_score (y_test, y_pred), 4) plt.plot (fpr,tpr,label=»Gradient Boosting, AUC kg-card kg-image-card»>
Синяя линия показывает кривую ROC для модели логистической регрессии, а оранжевая линия показывает кривую ROC для модели с градиентным усилением.
Чем больше кривая ROC охватывает верхний левый угол графика, тем лучше модель классифицирует данные по категориям.
Чтобы дать количественную оценку, мы можем рассчитать AUC — площадь под кривой, которая говорит нам, какая часть графика расположена под кривой.
Чем ближе AUC к 1, тем лучше модель.
На нашем графике мы видим следующие показатели AUC для каждой модели:
- AUC модели логистической регрессии: 0,7902
- AUC модели с градиентным усилением: 0,9712
Очевидно, что модель с градиентным усилением лучше справляется с классификацией данных по категориям по сравнению с моделью логистической регрессии.
Дополнительные ресурсы
В следующих руководствах представлена дополнительная информация о моделях классификации и кривых ROC:
Глубокое погружение в ROC-AUC
Я думаю, что большинство людей слышали о ROC-кривой или о AUC (площади под кривой) раньше. Особенно те, кто интересуется наукой о данных. Однако, что такое ROC-кривая и почему площадь под этой кривой является хорошей метрикой для оценки модели классификации?
Теория ROC-кривой
Полное название ROC — Receiver Operating Characteristic (рабочая характеристика приёмника). Впервые она была создана для использования радиолокационного обнаружения сигналов во время Второй мировой войны. США использовали ROC для повышения точности обнаружения японских самолетов с помощью радара. Поэтому ее называют рабочей характеристикой приемника.
AUC или area under curve — это просто площадь под кривой ROC. Прежде чем мы перейдем к тому, что такое ROC-кривая, нужно вспомнить, что такое матрица ошибок.

Как видно из рисунка выше, матрица ошибок — это комбинация вашего прогноза (1 или 0) и фактического значения (1 или 0). В зависимости от результата предсказания и того, корректна ли была проведена классификация, матрица разделена на 4 части. Например, true positive (истинно положительный) результат — это количество случаев, в которых вы правильно классифицируете семпл как положительный. А false positive (ложноположительный) — это число случаев, в которых вы ошибочно классифицируете семпл как положительный.
Матрица ошибок содержит только абсолютные числа. Однако, используя их, мы можем получить множество других метрик, основанных на процентных соотношениях. True Positive Rate (TPR) и False Positive Rate (FPR) — две из них.
True Positive Rate (TPR) показывает, какой процент среди всех positive верно предсказан моделью.
TPR = TP / (TP + FN).
False Positive Rate (FPR): какой процент среди всех negative неверно предсказан моделью.
FPR = FP / (FP + TN).
Хорошо, давайте теперь перейдем к кривой ROC!
Что такое ROC-кривая?

Как вы можете видеть на графике, кривая ROC — это просто отношение TPR к FPR. Теперь вам все понятно, в заключение…
Поверили?
Если серьезно, вы можете прочитать намного больше информации из диаграммы. Первый вопрос, который я хочу здесь обсудить: у нас же есть только один набор TPR, FPR, посчитанный на основе сделанных моделью предсказаний. Так откуда взялось такое количество точек для построения целого графика?
Все следует из того, как работает модель классификации. Когда вы строите классификационную модель, такую как дерево решений, и хотите определить, будут ли акции расти в цене или падать на основе входных данных. Модель сначала рассчитает вероятность увеличения или уменьшения, используя предоставленные вами исторические данные. После этого, основываясь на пороговом значении, она решит, будет ли результат увеличиваться или уменьшаться.
Да, ключевое слово здесь — порог. Разные пороговые значения создают разные TPR и FPR. Они представляют те самые точки, что образуют кривую ROC. Вы можете выбрать «Увеличение» в качестве предсказания модели, если полученная на основе исторических данных вероятность роста акций больше 50%. Также можете изменить пороговое значение и отобразить «Увеличение», только если соответствующая вероятность больше 90%. Если вы установите 90% порог вместо 50%, вы будете более уверены в том, что выбранные для «Увеличения» акции действительно вырастут. Но так вы можете упустить некоторые потенциально выгодные варианты.
Что значит синяя пунктирная линия на графике?
Как мы знаем, чем больше площадь под кривой (AUC), тем лучше классификация. Идеальная или наилучшая кривая — это вертикальная линия от (0,0) до (0,1), которая тянется до (1,1). Это означает: модель всегда может различить положительные и отрицательные случаи. Однако, если вы выбираете класс случайным образом для каждого семпла, TPR и FPR должны увеличиваться с одинаковой скоростью. Синяя пунктирная линия показывает кривую TPR и FPR при случайном определении positive или negative для каждого случая. Для этой диагональной линии площадь под кривой (AUC) составляет 0.5.
Что произойдет с TPR, FPR и ROC-кривой, если изменить пороговое значение?

Посмотрите на две точки на ROC-кривой. Зеленая точка имеет очень высокий порог, это означает, что только если вы уверены на 99%, можете классифицировать случай как positive. Красная точка имеет относительно более низкий порог. Это означает, что вы можете классифицировать случай как positive, если вы уверены на 90%.
Как изменяются TPR и FPR при движении от зеленой точки к красной?
И TPR, и FPR увеличиваются. Когда вы уменьшаете порог, модель будет определять больше положительных случаев. Таким образом, TP увеличивается, как и TP/(TP + FN). С другой стороны, вы неизбежно ошибочно классифицируете некоторые отрицательные случаи как положительные из-за снижения порога, и поэтому FP и FP/(FP + TN) также увеличиваются.
Мы видим, что TPR и FPR положительно коррелируют. Вам нужно балансировать между максимальным охватом positive случаев и минимизацией неправильной классификации negative случаев.
Как выбрать оптимальную точку на кривой ROC?
Трудно определить оптимальную точку, потому что нужно выбрать наиболее подходящее пороговое значение, учитывая сферу применения модели. Однако общее правило — максимизировать разницу (TPR-FPR), которая на графике представлена вертикальным расстоянием между оранжевой и синей пунктирной линией.
Почему площадь под кривой ROC – хорошая метрика для оценки модели классификации?
Хорошая метрика модели машинного обучения должна отображать истинную и постоянную способность модели к прогнозированию. Это означает, что, если я изменю тестовый набор данных, он не должен давать другой результат.
ROC-кривая учитывает не только результаты классификации, но и вероятность предсказания всех классов. Например, если результат корректно классифицирован на основе 51% вероятности, то он, скорее всего, будет классифицирован неверно, если вы воспользуетесь другим тестовым датасетом. Кроме того, ROC-кривая также учитывает эффективность модели при различных пороговых значениях. Она является комплексной метрикой для оценки того, насколько хорошо разделяются случаи в разных группах.
Какое значение AUC является приемлемым для модели классификации?
Как я показал ранее, для задачи двоичной классификации при определении классов случайным образом, вы можете получить 0.5 AUC. Следовательно, если вы решаете задачу бинарной классификации, разумное значение AUC должно быть > 0.5. У хорошей модели классификации показатель AUC > 0.9, но это значение сильно зависит от сферы ее применения.
Как рассчитать AUC и построить ROC-кривую в Python?
Если вы просто хотите рассчитать AUC, вы можете воспользоваться пакетом metrics библиотеки sklearn (ссылка).
Если вы хотите построить ROC-кривую для результатов вашей модели, вам стоит перейти сюда.
Вот код для построения графика ROC, который я использовал в этой статье.
from sklearn.datasets import make_classification from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import roc_curve, auc from sklearn.metrics import roc_auc_score from matplotlib import pyplot as plt # генерируем датасет на 2 класса X, y = make_classification(n_samples=1000, n_classes=2, random_state=1) # разделяем его на 2 выборки trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.5, random_state=2) # обучаем модель model = LogisticRegression(solver='lbfgs') model.fit(trainX, trainy) # получаем предказания lr_probs = model.predict_proba(testX) # сохраняем вероятности только для положительного исхода lr_probs = lr_probs[:, 1] # рассчитываем ROC AUC lr_auc = roc_auc_score(testy, lr_probs) print('LogisticRegression: ROC AUC=%.3f' % (lr_auc)) # рассчитываем roc-кривую fpr, tpr, treshold = roc_curve(testy, lr_probs) roc_auc = auc(fpr, tpr) # строим график plt.plot(fpr, tpr, color='darkorange', label='ROC кривая (area = %0.2f)' % roc_auc) plt.plot([0, 1], [0, 1], color='navy', linestyle='--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Пример ROC-кривой') plt.legend(loc="lower right") plt.show()Вам нужны следующие входные данные: фактическое значение y и вероятность предсказания. Обратите внимание, что функция roc_curve требует только вероятность для положительного случая, а не для обоих классов. Если вам нужно решить задачу мультиклассовой классификации, вы также можете использовать этот пакет, и в приведенной выше ссылке есть пример того, как построить график.
Plot an ROC Curve in Python
- ROC Curve Definition in Python
- Scikit-Learn Library in Python
- Python Code to Plot the ROC Curve
- Code Explanation
In this guide, we’ll help you get to know more about this Python function and the method you can use to plot a ROC curve as the program output.
ROC Curve Definition in Python
The term ROC curve stands for Receiver Operating Characteristic curve. This curve is basically a graphical representation of the performance of any classification model at all classification thresholds.
There are two parameters of this curve:
- True Positive Rate(TPR) - Stands for real, i.e true sensitivity
- False Positive Rate(FPR) - Stands for pseudo, i.e false sensitivity
Both parameters are known as operating characteristics and are used as factors to define the ROC curve.
In Python, the model’s efficiency is determined by seeing the area under the curve (AUC). Thus, the most efficient model has the AUC equal to 1, and the least efficient model has the AUC equal to 0.5.
Scikit-Learn Library in Python
The Scikit-learn library is one of the most important open-source libraries used to perform machine learning in Python. This library consists of many tools for tasks like classification, clustering, and regression.
In this tutorial, several functions are used from this library that will help in plotting the ROC curve. These functions are:
- make_classification - This function is imported because it helps in generating a random n-class classification problem by creating clusters of points.
- RandomForestClassifier - This function is imported as Random Forest Classifier and is used as a sample model in this tutorial on which the ROC curve is made.
- train_test_split - This function is used to split the whole data into two subsets ( Train and Test ) that are used for training and testing the data.
- roc_curve - This function is used to return the ROC curve of a given model.
Python Code to Plot the ROC Curve
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import make_classification from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import roc_curve def plot_roc_curve(fper, tper): plt.plot(fper, tper, color="red", label="ROC") plt.plot([0, 1], [0, 1], color="green", linestyle="--") plt.xlabel("False Positive Rate") plt.ylabel("True Positive Rate") plt.title("Receiver Operating Characteristic Curve") plt.legend() plt.show() data_X, cls_lab = make_classification( n_samples=2100, n_classes=2, weights=[1, 1], random_state=2 ) train_X, test_X, train_y, test_y = train_test_split( data_X, cls_lab, test_size=0.5, random_state=2 ) model = RandomForestClassifier() model.fit(train_X, train_y) prob = model.predict_proba(test_X) prob = probs[:, 1] fper, tper, thresholds = roc_curve(test_y, prob) plot_roc_curve(fper, tper)

Code Explanation
First, all the libraries and functions that are required to plot a ROC curve are imported. Then a function called plot_roc_curve is defined in which all the critical factors of the curve like the color, labels, and title are mentioned using the Matplotlib library. After that, the make_classification function is used to make random samples, and then they are divided into train and test sets with the help of the train_test_split function. Here, the train-test ratio of the data is 0.50 . Then the RandomForestClassifier algorithm is used to fit the train_X and train_y data. Finally, the roc_curve function is used to plot the ROC Curve.
Lakshay Kapoor is a final year B.Tech Computer Science student at Amity University Noida. He is familiar with programming languages and their real-world applications (Python/R/C++). Deeply interested in the area of Data Sciences and Machine Learning.
Copyright © 2024. All right reserved
