Примеры Программного Кода для ROC-кривой
Сборник примеров программного кода на Python для построения и анализа ROC-кривой в задачах машинного обучения и анализа данных.
Ключевые слова: ROC-кривая, анализ данных, машинное обучение, классификация, чувствительность, специфичность, ROC-кривая, нейронные сети, искусственный интеллект, классификация, анализ данных, Python модули, библиотеки, анализ данных, ROC-кривая, программирование, примеры кода, анализ данных
Определение и описание
ROC-кривая (Receiver Operating Characteristic curve) - это графическое представление зависимости чувствительности от (1 - специфичности) для различных пороговых значений классификатора.
На оси X откладывается значение (1 - специфичность), а на оси Y - чувствительность классификатора. Чувствительность показывает долю положительных примеров, правильно классифицированных моделью, а специфичность - долю отрицательных примеров, верно не классифицированных.
Цели использования ROC-кривой
- Оценка качества модели классификации;
- Сравнение нескольких моделей между собой;
- Выбор оптимального порога классификации при заданном балансе между чувствительностью и специфичностью.
Важность и назначение ROC-кривой
Использование ROC-кривой позволяет:
- Определить оптимальные настройки модели, обеспечивающие наилучший баланс между ошибками первого и второго рода;
- Выявить модель, которая лучше всего справляется с задачей классификации, даже если точность этих моделей различается;
- Построить интуитивно понятную визуализацию результатов классификации, позволяющую быстро оценить качество модели.
Пример построения ROC-кривой
# Импортируем необходимые библиотеки
import matplotlib.
pyplot as plt
from sklearn.metrics import roc_curve
# Предположим, у нас есть предсказания модели и истинные классы
y_true = [0, 1,
1, 0, 1]
y_pred = [0.
1,
0. 6, 0.35, 0.4, 0. 8]
# Вычисляем кривую ROC и значения FPR и TPR
fpr, tpr,
thresholds = roc_curve(y_true, y_pred)
# Строим график
plt.figure(figsize=(8, 6))
plt.plot(fpr,
tpr, color='darkorange',
label='ROC curve')
plt.plot([0, 1], [0, 1], color='navy', linestyle='--', label='Random guess')
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 Curve')
plt.legend(loc="lower right")
plt.show()
Таким образом, ROC-кривая является важным инструментом анализа и оценки качества классификационных моделей.
Что такое ROC-кривая?
ROC-кривая представляет собой графическое изображение зависимости чувствительности от (1 - специфичности) классификатора при разных пороговых значениях. Она широко используется для оценки качества бинарной классификации в задачах искусственного интеллекта и нейронных сетей.
Задачи, решаемые с помощью ROC-кривой
- Оценка производительности классификаторов в условиях различной степени ошибок первого и второго рода;
- Сравнение эффективности различных моделей классификации;
- Оптимизация порогов принятия решений для достижения требуемого баланса между чувствительностью и специфичностью;
- Анализ качества прогнозов и выявление областей улучшения моделей.
Рекомендации по применению ROC-кривой
- Используйте ROC-кривую на этапе разработки и тестирования моделей для выбора оптимальной точки компромисса между чувствительностью и специфичностью;
- При наличии большого количества классов используйте многомерный аналог ROC-кривой - ROC-AUC (площадь под кривой);
- Для многоклассовой классификации рекомендуется применять метод One-vs-All или One-vs-One для каждого класса отдельно и затем агрегировать результаты.
Технологии, применяемые в ROC-кривой
| Технология | Назначение |
|---|---|
| Библиотека scikit-learn | Реализация функций вычисления ROC-кривых и AUC |
| TensorFlow/Keras | Поддержка создания и обучения глубоких нейронных сетей |
| PyTorch | Инструментальная платформа для глубокого обучения |
| Matplotlib/Python | Визуализация и построение графиков ROC-кривых |
Пример реализации ROC-кривой в Python
# Пример использования библиотеки scikit-learn для построения ROC-кривой
from sklearn. metrics import roc_curve, auc
import matplotlib.pyplot as plt
# Предсказанные вероятности и истинные классы
y_true = [0, 1, 1, 0,
1]
y_score = [0. 1,
0.6,
0.
35,
0.
4, 0.8]
# Вычисление кривой ROC и площади под кривой
fpr,
tpr, thresholds = roc_curve(y_true,
y_score)
roc_auc = auc(fpr, tpr)
# Построение графика
plt. figure()
plt.plot(fpr, tpr, label=f'ROC curve (area = {roc_auc : .2f})')
plt.plot([0, 1], [0,
1], 'k--')
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 Curve')
plt.legend(loc="lower right")
plt. show()
Основные Модули и Библиотеки
- scikit-learn : популярная библиотека машинного обучения, включающая функции для построения и анализа ROC-кривых.
- matplotlib: инструмент для визуализации данных, включая построение графиков ROC-кривых.
- seaborn : расширение matplotlib, упрощающее создание эстетически привлекательных графиков, таких как ROC-кривые.
- plotly : интерактивная библиотека для создания динамических и интерактивных графиков, включая ROC-кривые.
Задачи, решаемые с использованием ROC-кривой
- Оценка качества бинарной классификации моделей;
- Сравнение моделей друг с другом по качеству классификации;
- Поиск оптимального порога классификации для минимизации ошибок первого и второго рода;
- Изучение характеристик модели, таких как чувствительность и специфичность.
Примеры использования библиотек Python
Пример использования scikit-learn
# Импорт необходимых библиотек
from sklearn.
metrics import roc_curve, auc
import matplotlib. pyplot as plt
# Данные для примера
y_true = [0, 1, 1,
0,
1]
y_score = [0.1,
0.6, 0.
35, 0. 4,
0.
8]
# Вычисление кривой ROC и площади под кривой
fpr, tpr, thresholds = roc_curve(y_true,
y_score)
roc_auc = auc(fpr, tpr)
# Построение графика
plt.figure()
plt. plot(fpr, tpr, label=f'ROC curve (AUC = {roc_auc:
.2f})')
plt.
plot([0,
1],
[0, 1],
'k--') # Диагональная линия случайного классификатора
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 Curve')
plt.legend(loc="lower right")
plt.
show()
Пример использования plotly
# Импорт необходимых библиотек
import plotly.
graph_objects as go
# Данные для примера
y_true = [0, 1, 1,
0,
1]
y_score = [0.1, 0.6, 0.
35,
0. 4, 0.8]
# Вычисление кривой ROC
fpr, tpr, thresholds = roc_curve(y_true, y_score)
# Создание графика
fig = go.
Figure(data=[go.Scatter(x=fpr, y=tpr, mode='lines+markers',
name='ROC Curve', line=dict(width=3))])
fig.
add_trace(go.Scatter(x=[0, 1],
y=[0, 1],
mode='lines', line=dict(dash='dash'),
name='Chance Level'))
fig.update_xaxes(range=[0, 1])
fig.update_yaxes(range=[0,
1])
fig.
update_layout(title='ROC Curve', xaxis_title='False Positive Rate',
yaxis_title='True Positive Rate')
fig.
show()
Рекомендации по применению модулей и библиотек
- Используйте scikit-learn для базовых операций анализа ROC-кривой, таких как вычисление кривой и площади под кривой (AUC);
- Для более сложной визуализации и интерактивности используйте библиотеки matplotlib и plotly;
- Если требуется красивая и простая визуализация, рассмотрите использование seaborn, которое интегрируется с pandas и предоставляет удобные инструменты для создания графиков.
Пример 1: Использование scikit-learn для построения ROC-кривой
# Импортируем необходимые библиотеки
from sklearn.datasets import load_breast_cancer
from sklearn. model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc
# Загружаем данные и разделяем их на обучающую и тестовую выборки
data = load_breast_cancer()
X_train, X_test,
y_train,
y_test = train_test_split(data. data, data. target,
test_size=0.3, random_state=42)
# Обучаем логистическую регрессию
model = LogisticRegression()
model. fit(X_train,
y_train)
# Получаем предсказания вероятностей для тестового набора
y_score = model. predict_proba(X_test)[ :
, 1]
# Вычисляем кривую ROC и площадь под кривой
fpr, tpr, thresholds = roc_curve(y_test,
y_score)
roc_auc = auc(fpr,
tpr)
print("Площадь под кривой :
", roc_auc)
Этот пример демонстрирует базовое использование scikit-learn для построения ROC-кривой и вычисления площади под кривой (AUC).
Пример 2: Построение ROC-кривой с использованием TensorFlow
# Импортируем необходимые библиотеки
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow. keras.
layers import Dense
from sklearn. metrics import roc_curve
# Создаем простую нейронную сеть
model = Sequential([
Dense(10, activation='relu', input_shape=(features.shape[1], )),
Dense(1,
activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy')
# Обучаем модель
history = model.
fit(X_train,
y_train, epochs=100, validation_data=(X_test, y_test))
# Получаем предсказания вероятностей
y_score = model. predict(X_test)
# Вычисляем кривую ROC
fpr, tpr, _ = roc_curve(y_test,
y_score)
Здесь демонстрируется построение ROC-кривой после обучения простой нейронной сети в TensorFlow.
Пример 3: Использование Plotly для интерактивной визуализации ROC-кривой
# Импортируем необходимые библиотеки
import plotly.express as px
import numpy as np
# Генерируем синтетические данные
np.
random.seed(42)
x = np.random. rand(100)
y = np.random.randint(0,
2, size=100)
# Вычисляем кривую ROC
fpr,
tpr,
thresholds = roc_curve(y, x)
# Создаем интерактивный график с помощью Plotly
fig = px.line(x=fpr, y=tpr,
title='ROC Curve', labels={'x' :
'False Positive Rate', 'y':
'True Positive Rate'})
fig.show()
Данный пример иллюстрирует использование Plotly для создания интерактивного графика ROC-кривой.
Пример 4 : Применение ROC-кривой для сравнения моделей
# Импортируем необходимые библиотеки
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
# Обучаем несколько моделей
models = [
('SVM', SVC()),
('Decision Tree', DecisionTreeClassifier())
]
for name,
model in models:
model.
fit(X_train, y_train)
y_score = model.predict_proba(X_test)[ : , 1]
fpr, tpr, thresholds = roc_curve(y_test, y_score)
print(name,
' : ', auc(fpr,
tpr))
Этот пример показывает сравнение нескольких моделей классификации на основе их площадей под ROC-кривыми.
Пример 5: Использование ROC-кривой для оптимизации порога классификации
# Импортируем необходимые библиотеки
from sklearn.metrics import precision_recall_curve
# Получаем кривую PR и соответствующие пороги
precision, recall, thresholds = precision_recall_curve(y_test, y_score)
# Находим оптимальный порог, максимизирующий F1 меру
best_threshold = thresholds[np.argmax(precision * recall)]
print("Оптимальный порог :
",
best_threshold)
В этом примере рассматривается использование ROC-кривой совместно с кривой Precision-Recall для поиска оптимального порога классификации.
Пример 6 : Многоклассовая классификация с применением ROC-кривой
# Импортируем необходимые библиотеки
from sklearn.
multiclass import OneVsRestClassifier
from sklearn.svm import LinearSVC
# Применяем OneVsRestClassifier для каждой пары класс-против-всех остальных
classifier = OneVsRestClassifier(LinearSVC())
classifier. fit(X_train, y_train)
# Получаем предсказания вероятностей
y_score = classifier.decision_function(X_test)
# Вычисляем кривую ROC и площадь под кривой для каждого класса
for i in range(len(classifier.estimators_)) :
fpr, tpr,
thresholds = roc_curve(y_test == i, y_score[ : ,
i])
print("Класс", i, " : Площадь под кривой =", auc(fpr, tpr))
Демонстрируется подход к решению многоклассовой задачи классификации с использованием ROC-кривой.
Пример 7: Использование ROC-кривой для анализа качества модели
# Импортируем необходимые библиотеки
from sklearn.metrics import confusion_matrix
# Рассчитываем матрицу путаницы
confusion = confusion_matrix(y_test, (y_score > 0.
5).astype(int))
# Расчет показателей качества модели
sensitivity = confusion[1, 1] / (confusion[1, 1] + confusion[1, 0])
specificity = confusion[0,
0] / (confusion[0, 0] + confusion[0,
1])
print("Чувствительность :
", sensitivity)
print("Специфичность:
", specificity)
Этот пример показывает, как можно использовать ROC-кривую для анализа качественных характеристик модели через показатели чувствительности и специфичности.
Пример 8 : Использование ROC-кривой для оценки риска ошибки второго рода
# Импортируем необходимые библиотеки
from sklearn.metrics import classification_report
# Получаем отчет классификации
report = classification_report(y_test,
(y_score > 0.5).
astype(int),
output_dict=True)
# Извлечение показателя риска ошибки второго рода
risk_of_type_two_error = report['macro avg']['recall'] - report['weighted avg']['recall']
print("Риск ошибки второго рода :
",
risk_of_type_two_error)
Показывается расчет риска ошибки второго рода, который помогает понять влияние выбранной модели на вероятность пропуска положительных случаев.
Пример 9 : Использование ROC-кривой для выявления аномалий
# Импортируем необходимые библиотеки
from sklearn. neighbors import LocalOutlierFactor
# Обучаем локальный алгоритм обнаружения выбросов
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.
1)
y_pred = lof. fit_predict(X_test)
# Вычисляем кривую ROC
fpr, tpr,
thresholds = roc_curve(y_pred == -1, y_score)
print("Площадь под кривой: ",
auc(fpr, tpr))
В данном примере ROC-кривая применяется для оценки эффективности алгоритма обнаружения аномалий.
Пример 10 : Использование ROC-кривой для сравнения методов ансамблевого обучения
# Импортируем необходимые библиотеки
from sklearn.
ensemble import RandomForestClassifier, AdaBoostClassifier
# Обучаем два ансамбля моделей
rf = RandomForestClassifier()
ada = AdaBoostClassifier()
rf.
fit(X_train,
y_train)
ada. fit(X_train, y_train)
# Получаем предсказания вероятностей
y_score_rf = rf.predict_proba(X_test)[ :
,
1]
y_score_ada = ada.predict_proba(X_test)[: ,
1]
# Вычисляем площади под кривыми ROC
rf_auc = auc(roc_curve(y_test,
y_score_rf)[0], roc_curve(y_test, y_score_rf)[1])
ada_auc = auc(roc_curve(y_test, y_score_ada)[0], roc_curve(y_test, y_score_ada)[1])
print("RF AUC :
",
rf_auc)
print("ADA AUC :
", ada_auc)
Последний пример демонстрирует сравнительный анализ двух ансамблевых подходов с использованием ROC-кривой.