AUC ROC в Sklearn: подробный анализ и применение для метрик
Пройдите тест, узнайте какой профессии подходите
Для кого эта статья:
- Специалисты по машинному обучению и аналитике данных
- Студенты и практикующие, обучающиеся методам оценки моделей
Профессионалы, работающие с несбалансированными данными и метриками оценки моделей
AUC ROC — золотой стандарт в оценке бинарных классификаторов, чья популярность растёт с каждым годом. В 2025 году уже сложно представить специалиста по машинному обучению, который не опирается на эту метрику при валидации моделей. Почему? AUC ROC решает ключевую проблему — она позволяет объективно сравнивать модели вне зависимости от выбранного порога классификации. Готовы разобраться, как правильно применять этот инструмент и избежать распространённых ошибок интерпретации? 📊🔍
Хотите профессионально применять AUC ROC и другие продвинутые метрики в реальных проектах? Курс «Аналитик данных» с нуля от Skypro включает обширный модуль по оценке моделей машинного обучения. Вы не просто научитесь рассчитывать AUC ROC в Sklearn, но и грамотно интерпретировать результаты, обосновывая выбор оптимальной модели. Практические задания курса построены на актуальных бизнес-кейсах с реальными данными.
Что такое AUC ROC: теория метрики в классификации
AUC ROC (Area Under the Receiver Operating Characteristic Curve) — это метрика, которая оценивает качество бинарной classification модели независимо от порогового значения. По сути, это площадь под кривой ROC, которая показывает соотношение между долей истинных положительных результатов (True Positive Rate) и долей ложных положительных результатов (False Positive Rate) при различных пороговых значениях.
В основе ROC-кривой лежит компромисс между чувствительностью и специфичностью модели:
- True Positive Rate (TPR) или чувствительность = TP / (TP + FN)
- False Positive Rate (FPR) = FP / (FP + TN) = 1 – специфичность
AUC ROC варьируется от 0 до 1, где:
- AUC = 0.5 соответствует случайному угадыванию (диагональная линия на графике)
- AUC > 0.5 указывает на модель, работающую лучше случайного предсказания
- AUC = 1.0 означает идеальную классификацию
- AUC < 0.5 свидетельствует о модели, работающей хуже случайного угадывания (можно инвертировать предсказания)
Преимущества AUC ROC:
- Не зависит от выбранного порога классификации
- Устойчива к несбалансированным данным
- Позволяет объективно сравнивать разные model на одном наборе данных
- Учитывает распределение вероятностей, а не только бинарные предсказания
Значение AUC | Интерпретация | Применимость модели |
---|---|---|
0.9 – 1.0 | Отличная | Высоконадежная для критических задач |
0.8 – 0.9 | Хорошая | Подходит для большинства практических задач |
0.7 – 0.8 | Приемлемая | Может использоваться с оговорками |
0.6 – 0.7 | Посредственная | Требует улучшения для практического применения |
0.5 – 0.6 | Плохая | Немногим лучше случайного угадывания |
< 0.5 | Неприемлемая | Худше случайного угадывания, требует инверсии |
В отличие от метрик вроде accuracy, которые зависят от выбранного порога, AUC ROC оценивает ранжирующую способность модели в целом. Это особенно ценно, когда стоимость ошибок классификации различна или неизвестна заранее.

Реализация AUC ROC в библиотеке Sklearn
Библиотека scikit-learn (Sklearn) предоставляет удобные инструменты для работы с AUC ROC. Основные функции находятся в модуле sklearn.metrics
. Рассмотрим, как правильно использовать эти инструменты в реальных проектах.
Для расчета AUC ROC в Sklearn можно использовать несколько функций:
- roc_auc_score — вычисляет значение AUC ROC непосредственно
- roc_curve — возвращает данные для построения ROC-кривой (FPR, TPR и пороги)
- auc — вычисляет площадь под произвольной кривой (может использоваться с результатами roc_curve)
Базовый пример использования:
from sklearn.metrics import roc_auc_score, roc_curve, auc
import numpy as np
# Истинные метки классов
y_true = np.array([0, 0, 1, 1, 1, 0])
# Вероятности принадлежности к положительному классу
y_scores = np.array([0\.1, 0.3, 0.6, 0.7, 0.8, 0.2])
# Вычисление AUC ROC
auc_value = roc_auc_score(y_true, y_scores)
print(f"AUC ROC: {auc_value:.3f}")
# Получение данных для построения ROC-кривой
fpr, tpr, thresholds = roc_curve(y_true, y_scores)
# Альтернативный способ вычисления AUC (результат идентичен roc_auc_score)
auc_value_2 = auc(fpr, tpr)
print(f"AUC (альтернативный метод): {auc_value_2:.3f}")
Важные нюансы при использовании roc_auc_score
:
- Для бинарной классификации функция ожидает вероятности положительного класса (или scores), а не бинарные предсказания
- Для многоклассовой классификации необходимо указать параметр
multi_class
('ovr' или 'ovo') - При несбалансированных классах можно использовать параметр
average
для взвешивания
Андрей Смирнов, Data Scientist Lead
В 2023 году мы работали над проектом по выявлению мошеннических транзакций для крупного банка. Классы были крайне несбалансированы — мошеннические операции составляли меньше 0.1% от общего числа. Мой младший коллега начал оценивать модели по accuracy и был доволен результатом 99.9%.
На очередном демо я попросил его показать ROC-кривую и рассчитать AUC. Оказалось, AUC была всего 0.63, что говорило о посредственном качестве модели. "Но как же так? У нас же accuracy почти 100%!" — недоумевал он.
Я объяснил, что при таком дисбалансе модель просто предсказывала отрицательный класс для всех наблюдений. Внедрив AUC ROC как основную метрику и применив техники работы с несбалансированными данными, мы улучшили модель до AUC 0.92. Это позволило обнаруживать на 40% больше мошеннических операций при том же уровне ложных срабатываний.
Для мультиклассовой классификации в Sklearn доступны два подхода к расчету AUC ROC:
Подход | Параметр multi_class | Описание | Применение |
---|---|---|---|
One-vs-Rest (OvR) | 'ovr' | Для каждого класса рассчитывается AUC против всех остальных классов, затем результаты усредняются | Хорошо работает при большом числе классов |
One-vs-One (OvO) | 'ovo' | AUC рассчитывается для каждой пары классов, затем результаты усредняются | Вычислительно затратно при большом числе классов |
Пример использования для мультиклассовой задачи:
from sklearn.metrics import roc_auc_score
import numpy as np
# Истинные метки для 3 классов
y_true = np.array([0, 1, 2, 2, 0, 1])
# Вероятности для каждого класса (3 класса)
y_scores = np.array([
[0\.7, 0.2, 0.1], # Вероятности для 1-го объекта
[0\.3, 0.6, 0.1], # Вероятности для 2-го объекта
[0\.1, 0.2, 0.7], # и т.д.
[0\.2, 0.3, 0.5],
[0\.6, 0.2, 0.2],
[0\.1, 0.7, 0.2]
])
# Расчет AUC ROC с подходом One-vs-Rest
auc_ovr = roc_auc_score(y_true, y_scores, multi_class='ovr', average='macro')
print(f"AUC ROC (OvR): {auc_ovr:.3f}")
# Расчет AUC ROC с подходом One-vs-One
auc_ovo = roc_auc_score(y_true, y_scores, multi_class='ovo', average='macro')
print(f"AUC ROC (OvO): {auc_ovo:.3f}")
С выходом версии Sklearn 1.3 в 2025 году появились дополнительные возможности и оптимизации для работы с AUC ROC, включая параллельные вычисления и улучшенную поддержку несбалансированных данных. 🚀
Расчет и визуализация AUC ROC для моделей в Sklearn
Визуализация ROC-кривой — важный этап анализа модели, позволяющий не только увидеть значение AUC, но и понять характер ошибок классификатора при различных порогах. Рассмотрим, как правильно рассчитать и визуализировать AUC ROC для различных моделей в Sklearn.
Полный пример расчета и визуализации ROC-кривой:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc, roc_auc_score
# Генерируем синтетические данные
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2,
random_state=42)
# Разделяем на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=42)
# Обучаем две разные модели
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
lr_model = LogisticRegression(random_state=42)
rf_model.fit(X_train, y_train)
lr_model.fit(X_train, y_train)
# Получаем вероятности для положительного класса
rf_probs = rf_model.predict_proba(X_test)[:, 1]
lr_probs = lr_model.predict_proba(X_test)[:, 1]
# Рассчитываем AUC ROC
rf_auc = roc_auc_score(y_test, rf_probs)
lr_auc = roc_auc_score(y_test, lr_probs)
# Получаем данные для построения ROC-кривых
rf_fpr, rf_tpr, _ = roc_curve(y_test, rf_probs)
lr_fpr, lr_tpr, _ = roc_curve(y_test, lr_probs)
# Визуализируем результаты
plt.figure(figsize=(10, 8))
plt.plot(rf_fpr, rf_tpr, label=f'Random Forest (AUC = {rf_auc:.3f})',
linewidth=2)
plt.plot(lr_fpr, lr_tpr, label=f'Logistic Regression (AUC = {lr_auc:.3f})',
linewidth=2)
plt.plot([0, 1], [0, 1], 'k--', label='Random (AUC = 0.500)')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curves Comparison')
plt.legend()
plt.grid(alpha=0.3)
plt.savefig('roc_comparison.png', dpi=300, bbox_inches='tight')
plt.show()
При работе с ROC-кривой и AUC необходимо учитывать несколько практических аспектов:
- Плавность кривой — на графике кривая должна быть достаточно гладкой. Зазубренная кривая обычно свидетельствует о недостаточном количестве тестовых данных
- Отношение площадей — визуальное сравнение ROC-кривых позволяет оценить, на каких участках одна модель превосходит другую
- Анализ выбросов — резкие изменения наклона кривой могут говорить об особенностях распределения вероятностей в модели
- Выбор рабочего порога — визуализация помогает определить оптимальный порог, при котором достигается лучший баланс между TPR и FPR
Для оценки статистической значимости различий между моделями по метрике AUC ROC можно использовать бутстрэп или кросс-валидацию:
from sklearn.model_selection import cross_val_score
# Оценка AUC ROC через 5-кратную кросс-валидацию
rf_cv_auc = cross_val_score(rf_model, X, y, cv=5,
scoring='roc_auc')
lr_cv_auc = cross_val_score(lr_model, X, y, cv=5,
scoring='roc_auc')
print(f"Random Forest CV AUC: {rf_cv_auc.mean():.3f} ± {rf_cv_auc.std():.3f}")
print(f"Logistic Regression CV AUC: {lr_cv_auc.mean():.3f} ± {lr_cv_auc.std():.3f}")
Для более сложных сценариев, например, при работе с многоклассовыми задачами или несбалансированными данными, можно использовать специализированные функции из пакета sklearn.metrics
и дополнительные библиотеки визуализации, такие как yellowbrick
или SHAP
. 📈
Интерпретация значений AUC ROC для оценки моделей
Максим Петров, Lead Data Scientist
Долгое время в нашей компании разработчики чрезмерно полагались на accuracy при оценке моделей кредитного скоринга. Я решил провести эксперимент и попросил трёх аналитиков независимо оценить одну и ту же модель на общем тестовом наборе данных.
Первый использовал accuracy и получил 90%, что выглядело отлично. Второй рассчитал precision и recall — 85% и 78% соответственно, что указывало на проблемы с полнотой. Третий построил ROC-кривую и получил AUC = 0.82.
Когда мы внедрили модель в production, оказалось, что при смещении баланса классов в реальных данных accuracy упал до 70%, в то время как AUC практически не изменился. Это наглядно продемонстрировало команде, почему AUC ROC — более надёжная метрика для сравнения моделей в условиях меняющегося распределения данных.
Правильная интерпретация значений AUC ROC — ключевой навык для специалиста по машинному обучению. Недостаточно знать, что "больше — значит лучше", важно понимать, что конкретно означают различные значения и как они соотносятся с бизнес-задачами.
Общепринятая шкала интерпретации AUC ROC:
- 0.5 — модель не имеет предсказательной способности (равносильна случайному угадыванию)
- 0.5-0.6 — модель с минимальной предсказательной способностью
- 0.6-0.7 — слабая модель, требующая существенных улучшений
- 0.7-0.8 — приемлемая модель для многих практических задач
- 0.8-0.9 — хорошая модель, применимая в большинстве случаев
- 0.9-1.0 — отличная модель, приближающаяся к идеальной классификации
Однако эта шкала не универсальна и должна адаптироваться под конкретную область применения:
Область применения | Минимально приемлемый AUC | Целевой AUC | Комментарий |
---|---|---|---|
Медицинская диагностика | 0.80 | ≥0.95 | Высокие требования из-за высокой цены ошибки |
Кредитный скоринг | 0.75 | ≥0.85 | Баланс между риском и доходностью |
Маркетинговые кампании | 0.65 | ≥0.75 | Часто приемлемы более низкие значения |
Обнаружение аномалий | 0.85 | ≥0.95 | Критично для систем безопасности |
Распознавание спама | 0.90 | ≥0.98 | Высокие требования к точности |
При интерпретации AUC ROC необходимо учитывать следующие факторы:
- Доверительные интервалы — особенно важны при сравнении моделей с близкими значениями AUC
- Форма ROC-кривой — две модели могут иметь одинаковый AUC, но различный характер ошибок
- Частичный AUC — в некоторых задачах важна только часть ROC-кривой (например, при низком FPR)
- Асимметричная стоимость ошибок — AUC не учитывает, что FP и FN могут иметь разную "цену" в бизнес-контексте
Для статистически обоснованного сравнения моделей по AUC ROC в Sklearn можно использовать метод DeLong
(реализован в библиотеке scikit-learn-extra
) или использовать бутстрап:
from sklearn.utils import resample
import numpy as np
def bootstrap_auc(y_true, y_pred, n_bootstraps=1000, rng_seed=42):
"""
Рассчитывает AUC ROC с доверительным интервалом по бутстрапу
"""
np.random.seed(rng_seed)
bootstrapped_scores = []
for i in range(n_bootstraps):
# Бутстрап-выборка с возвращением
indices = resample(range(len(y_true)), replace=True)
if len(np.unique(y_true[indices])) < 2:
# Пропускаем выборки с одним классом
continue
score = roc_auc_score(y_true[indices], y_pred[indices])
bootstrapped_scores.append(score)
# Вычисляем доверительный интервал
sorted_scores = np.array(bootstrapped_scores)
sorted_scores.sort()
confidence_lower = sorted_scores[int(0.025 * len(sorted_scores))]
confidence_upper = sorted_scores[int(0.975 * len(sorted_scores))]
return {
"AUC": roc_auc_score(y_true, y_pred),
"95% CI lower": confidence_lower,
"95% CI upper": confidence_upper
}
Знание тонкостей интерпретации AUC ROC позволяет избежать распространенных ошибок, таких как избыточная оптимизация метрики без учета бизнес-контекста или некорректное сравнение моделей на несбалансированных данных. 🎯
Проверьте, подходит ли вам карьера в анализе данных и машинном обучении! Тест на профориентацию от Skypro поможет определить, насколько ваши навыки и склонности соответствуют требованиям к аналитикам данных. Пройдите короткий тест и узнайте, готовы ли вы работать с продвинутыми метриками вроде AUC ROC. Результаты сразу покажут, в каких областях у вас есть потенциал и какие компетенции стоит развивать.
Практические кейсы применения AUC ROC в Sklearn
Рассмотрим конкретные примеры использования AUC ROC в различных сценариях машинного обучения с применением Sklearn.
Кейс 1: Сравнение различных алгоритмов классификации
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
import pandas as pd
# Загружаем датасет для бинарной классификации
data = load_breast_cancer()
X, y = data.data, data.target
# Разделяем на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=42)
# Определяем модели для сравнения
models = {
'Logistic Regression': LogisticRegression(max_iter=1000, random_state=42),
'Random Forest': RandomForestClassifier(n_estimators=100, random_state=42),
'Gradient Boosting': GradientBoostingClassifier(random_state=42),
'SVM': SVC(probability=True, random_state=42)
}
# Обучаем модели и оцениваем их по AUC ROC
results = []
for name, model in models.items():
model.fit(X_train, y_train)
y_pred_proba = model.predict_proba(X_test)[:, 1]
auc = roc_auc_score(y_test, y_pred_proba)
results.append({'Model': name, 'AUC ROC': auc})
# Выводим результаты
results_df = pd.DataFrame(results)
print(results_df.sort_values('AUC ROC', ascending=False))
Кейс 2: Применение AUC ROC для выбора признаков
from sklearn.feature_selection import RFECV
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import StratifiedKFold
# Создаем объект для отбора признаков
estimator = RandomForestClassifier(n_estimators=100, random_state=42)
# Используем AUC ROC как метрику для оценки качества набора признаков
selector = RFECV(estimator=estimator,
step=1,
cv=StratifiedKFold(5),
scoring='roc_auc',
min_features_to_select=5)
selector.fit(X_train, y_train)
# Применяем выбранные признаки
X_train_selected = selector.transform(X_train)
X_test_selected = selector.transform(X_test)
# Обучаем модель на отобранных признаках
final_model = RandomForestClassifier(n_estimators=100, random_state=42)
final_model.fit(X_train_selected, y_train)
y_pred_selected = final_model.predict_proba(X_test_selected)[:, 1]
# Сравниваем с моделью на всех признаках
full_model = RandomForestClassifier(n_estimators=100, random_state=42)
full_model.fit(X_train, y_train)
y_pred_full = full_model.predict_proba(X_test)[:, 1]
print(f"AUC на всех признаках: {roc_auc_score(y_test, y_pred_full):.4f}")
print(f"AUC на отобранных признаках: {roc_auc_score(y_test, y_pred_selected):.4f}")
print(f"Количество отобранных признаков: {selector.n_features_}")
Кейс 3: Оценка стабильности модели с помощью AUC ROC через кросс-валидацию
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import GradientBoostingClassifier
import numpy as np
# Создаем пайплайн с предобработкой и моделью
pipeline = Pipeline([
('scaler', StandardScaler()),
('classifier', GradientBoostingClassifier(random_state=42))
])
# Определяем схему кросс-валидации с сохранением пропорции классов
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
# Оцениваем модель по AUC ROC через кросс-валидацию
auc_scores = cross_val_score(pipeline, X, y, cv=cv, scoring='roc_auc')
print(f"AUC ROC (среднее): {np.mean(auc_scores):.4f}")
print(f"AUC ROC (стандартное отклонение): {np.std(auc_scores):.4f}")
print(f"AUC ROC (разброс): {np.min(auc_scores):.4f} – {np.max(auc_scores):.4f}")
Кейс 4: Оптимизация гиперпараметров модели с использованием AUC ROC
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifier
# Определяем пространство поиска гиперпараметров
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [3, 5, 7],
'learning_rate': [0\.01, 0.1, 0.2]
}
# Создаем объект гридсерча с оптимизацией по AUC ROC
grid_search = GridSearchCV(
estimator=GradientBoostingClassifier(random_state=42),
param_grid=param_grid,
cv=5,
scoring='roc_auc',
n_jobs=-1
)
grid_search.fit(X_train, y_train)
# Получаем оптимальные параметры и оцениваем на тестовой выборке
best_model = grid_search.best_estimator_
y_pred_proba = best_model.predict_proba(X_test)[:, 1]
test_auc = roc_auc_score(y_test, y_pred_proba)
print(f"Лучшие параметры: {grid_search.best_params_}")
print(f"AUC ROC с лучшими параметрами (CV): {grid_search.best_score_:.4f}")
print(f"AUC ROC на тестовой выборке: {test_auc:.4f}")
Эти практические примеры показывают, как метрика AUC ROC становится основой для принятия решений на разных этапах построения моделей: от выбора алгоритма до тонкой настройки модели и работы с признаками. Использование AUC ROC в Sklearn позволяет автоматизировать многие этапы работы с классификационными моделями и принимать обоснованные решения в процессе разработки. 💡
AUC ROC — это не просто цифра в отчете, а стратегический инструмент для принятия решений. Освоение этой метрики меняет подход к разработке моделей машинного обучения, смещая фокус с поверхностных показателей на реальную прогностическую способность алгоритмов. В условиях меняющихся данных и бизнес-требований, AUC ROC обеспечивает стабильность оценки, позволяя выбирать действительно надежные модели вместо тех, что просто хорошо запоминают обучающую выборку. Внедрите AUC ROC как стандарт в своей работе — и качество ваших моделей будет говорить само за себя.