Кривая ROC (Receiver Operating Characteristic) для оценки бинарных классификаторов
Кривая ROC (Receiver Operating Characteristic) является одним из наиболее популярных инструментов для визуальной оценки производительности бинарных классификаторов. Она показывает соотношение между долей правильно классифицированных положительных примеров (sensitivity, или true positive rate) и долей ошибочно классифицированных отрицательных примеров (false positive rate) при различных порогах классификации.
Основные понятия
Для построения кривой ROC используются следующие метрики:
True Positive Rate (TPR) или Sensitivity - доля правильно классифицированных положительных примеров:
TPR = TP / (TP + FN)
False Positive Rate (FPR) - доля отрицательных примеров, ошибочно классифицированных как положительные:
FPR = FP / (FP + TN)
Кривая ROC строится путем вычисления TPR и FPR для различных порогов классификации и нанесения этих точек на координатную плоскость с TPR по оси Y и FPR по оси X.
Интерпретация кривой ROC
Форма кривой ROC и ее положение относительно диагонали (линии случайного угадывания) дают важную информацию о производительности классификатора:
Идеальный классификатор имеет кривую ROC, проходящую через верхний левый угол координатной плоскости, где TPR = 1, а FPR = 0.
Случайный классификатор имеет кривую ROC, совпадающую с диагональю (линией случайного угадывания), где TPR = FPR.
Чем ближе кривая к верхнему левому углу, тем лучше производительность классификатора.
Площадь под кривой ROC (AUC-ROC)
Еще одной важной метрикой, основанной на кривой ROC, является площадь под кривой ROC (AUC-ROC, Area Under the ROC Curve). Чем больше площадь под кривой, тем лучше способность классификатора различать положительные и отрицательные примеры.
Значение AUC-ROC варьируется от 0 до 1:
1.0 соответствует идеальному классификатору
0.5 соответствует случайному угадыванию
0.0 соответствует классификатору, который всегда ошибается
Примеры построения кривой ROC в Python
Рассмотрим пример построения кривой ROC и вычисления AUC-ROC для логистической регрессии на задаче классификации электронных писем как спам или не спам:
Рассмотрим пример построения кривой ROC и вычисления AUC-ROC для логистической регрессии на задаче классификации электронных писем как спам или не спам:
Мы генерируем тестовые данные с помощью make_blobs из sklearn.datasets.
Обучаем модель логистической регрессии на этих данных.
Вычисляем вероятности предсказаний для каждого примера с помощью model.predict_proba.
Используем функцию roc_curve из sklearn.metrics для вычисления TPR, FPR и порогов классификации.
Вычисляем площадь под кривой ROC (AUC-ROC) с помощью roc_auc_score.
Визуализируем кривую ROC и линию случайного угадывания с помощью matplotlib.
Результат выполнения кода - график кривой ROC с указанием значения AUC-ROC. Чем ближе кривая к верхнему левому углу и чем больше значение AUC-ROC, тем лучше производительность классификатора.
Пример построения кривой ROC и вычисления AUC-ROC для задачи классификации направления движения цены акций, используя данные, полученные из библиотеки yfinance:
import yfinance as yfimport numpy as npfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import roc_curve, roc_auc_scoreimport matplotlib.pyplot as plt# Получение исторических данных котировок акций Appleticker ="AAPL"data = yf.download(ticker, start="2020-01-01", end="2021-01-01")# Вычисление дневных изменений цены закрытияdata["Returns"]= data["Adj Close"].pct_change()data = data.dropna()# Создание меток классов (1 для положительного изменения, 0 для отрицательного)y = np.where(data["Returns"] >0, 1, 0)X = data["Returns"].values.reshape(-1, 1)# Разделение данных на обучающую и тестовую выборкиtrain_size =int(0.8*len(X))X_train, X_test = X[:train_size], X[train_size:]y_train, y_test = y[:train_size], y[train_size:]# Обучение логистической регрессииmodel =LogisticRegression()model.fit(X_train, y_train)# Вычисление вероятностей предсказаний на тестовых данныхy_pred_proba = model.predict_proba(X_test)[:,1]# Построение кривой ROCfpr, tpr, thresholds =roc_curve(y_test, y_pred_proba)auc_score =roc_auc_score(y_test, y_pred_proba)# Визуализация кривой ROCplt.figure(figsize=(8, 6))plt.plot(fpr, tpr, label=f'AUC-ROC = {auc_score:.2f}')plt.plot([0, 1], [0, 1], 'r--', label='Случайный классификатор')plt.xlabel('False Positive Rate')plt.ylabel('True Positive Rate')plt.title(f'Кривая ROC для классификации движения цены акций {ticker}')plt.legend()plt.show()
Конечно, вот пример построения кривой ROC и вычисления AUC-ROC для задачи классификации направления движения цены акций, используя данные, полученные из библиотеки yfinance:
В этом примере:
Мы загружаем исторические данные котировок акций Apple с помощью yfinance.
Вычисляем дневные изменения цены закрытия и создаем метки классов (1 для положительного изменения, 0 для отрицательного).
Разделяем данные на обучающую и тестовую выборки.
Обучаем модель логистической регрессии на обучающей выборке.
Вычисляем вероятности предсказаний для тестовой выборки с помощью model.predict_proba.
Используем функции roc_curve и roc_auc_score для построения кривой ROC и вычисления AUC-ROC.
Визуализируем кривую ROC и линию случайного угадывания с помощью matplotlib.
В результате мы получаем график кривой ROC и значение AUC-ROC для задачи классификации направления движения цены акций Apple. Чем ближе кривая к верхнему левому углу и чем больше значение AUC-ROC, тем лучше модель способна предсказывать положительное или отрицательное изменение цены.
Как пример, можно использовать библиотеку scikit-learn в Python для построения кривой ROC.
from sklearn.metrics import roc_curveimport matplotlib.pyplot as plt# Получаем вероятности принадлежности к положительному классуy_true = [0,1,1,0,1,0,0,1,0]y_pred = [0.1,0.8,0.4,0.3,0.9,0.8,0.2,0.5,0.3]# Строим кривую ROCfpr, tpr, thresholds =roc_curve(y_true, y_pred)# Визуализируем кривую ROCplt.figure()plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve')plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')plt.xlabel('Ложноположительный показатель')plt.ylabel('Истинно положительный рейтинг')plt.title('Кривая рабочей характеристики приемника (ROC)')plt.legend(loc="lower right")plt.show()
Интерпретация кривой ROC на графике позволяет наглядно оценить производительность бинарного классификатора. Вот основные моменты, на которые следует обратить внимание:
Положение кривой относительно диагонали (линии случайного угадывания):
Кривая, расположенная выше диагонали, указывает на то, что классификатор работает лучше, чем случайное угадывание.
Чем дальше кривая отстоит от диагонали к верхнему левому углу, тем лучше способность классификатора различать положительные и отрицательные примеры.
Форма кривой:
Идеальный классификатор имеет кривую, проходящую через верхний левый угол графика (TPR = 1, FPR = 0).
Чем ближе кривая к верхнему левому углу, тем лучше производительность классификатора.
Кривая, близкая к диагонали, указывает на низкую способность классификатора различать классы.
Площадь под кривой ROC (AUC-ROC):
AUC-ROC - это обобщенная мера производительности классификатора. Чем больше площадь под кривой, тем лучше способность классификатора различать классы.
Значение AUC-ROC варьируется от 0 до 1.
Значение AUC-ROC = 1 соответствует идеальному классификатору.
Значение AUC-ROC = 0.5 соответствует случайному угадыванию (линия диагонали).
Чем ближе значение AUC-ROC к 1, тем лучше производительность классификатора.
Сравнение нескольких моделей:
На одном графике можно отобразить кривые ROC для нескольких классификаторов, что позволяет сравнить их производительность.
Модель с кривой ROC, ближе расположенной к верхнему левому углу, и большим значением AUC-ROC считается лучшей.
При интерпретации кривой ROC важно учитывать специфику задачи и требования к классификатору. Например, в задачах с высокой стоимостью ошибок определенного типа может быть важнее оптимизировать конкретное значение TPR или FPR, нежели максимизировать общую площадь под кривой.
В целом, кривая ROC и AUC-ROC являются полезными инструментами для визуальной и количественной оценки производительности бинарных классификаторов, позволяя сравнивать различные модели и выбирать наиболее подходящую для конкретной задачи.