Примечание
Перейти к концу, чтобы загрузить полный код примера. или запустить этот пример в вашем браузере через JupyterLite или Binder
Кривая ROC (Receiver Operating Characteristic) с перекрёстной проверкой
В этом примере показано, как оценить и визуализировать дисперсию метрики ROC (Receiver Operating Characteristic) с использованием перекрёстной проверки.
Кривые ROC обычно отображают истинную положительную скорость (TPR) по оси Y и ложную положительную скорость (FPR) по оси X. Это означает, что верхний левый угол графика является «идеальной» точкой – FPR равен нулю, а TPR равен единице. Это не очень реалистично, но это означает, что большая площадь под кривой (AUC) обычно лучше. «Крутизна» кривых ROC также важна, так как желательно максимизировать TPR, минимизируя FPR.
Этот пример показывает ответ ROC для разных наборов данных, созданных с помощью перекрёстной проверки K-fold. Используя все эти кривые, можно рассчитать среднее значение AUC и увидеть дисперсию кривой, когда обучающий набор делится на разные подмножества. Это примерно показывает, как выход классификатора зависит от изменений в обучающих данных и насколько различны разделения, сгенерированные перекрёстной проверкой K-fold.
Примечание
См. Многоклассовая кривая ROC (Receiver Operating Characteristic) для дополнения данного примера, объясняющего стратегии усреднения для обобщения метрик для многоклассовых классификаторов.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Загрузка и подготовка данных
Мы импортируем набор данных о растениях ириса, который содержит 3 класса, каждый из которых соответствует типу растения ириса. Один класс линейно отделён от других 2; последние не линейно отделены друг от друга.
В дальнейшем мы бинаризуем набор данных, удалив класс «virginica» (class_id=2). Это означает, что класс «versicolor» (class_id=1) рассматривается как положительный класс, а «setosa» как отрицательный класс (class_id=0).
import numpy as np from sklearn.datasets import load_iris iris = load_iris() target_names = iris.target_names X, y = iris.data, iris.target X, y = X[y != 2], y[y != 2] n_samples, n_features = X.shape
Мы также добавляем шумные признаки, чтобы усложнить задачу.
random_state = np.random.RandomState(0) X = np.concatenate([X, random_state.randn(n_samples, 200 * n_features)], axis=1)
Классификация и анализ ROC
Здесь мы запускаем классификатор SVC с перекрёстной проверкой и строим кривые ROC для каждой итерации. Обратите внимание, что базовая линия для определения уровня случайности (пунктирная кривая ROC) – это классификатор, который всегда предсказывает наиболее частый класс.
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.metrics import RocCurveDisplay, auc
from sklearn.model_selection import StratifiedKFold
n_splits = 6
cv = StratifiedKFold(n_splits=n_splits)
classifier = svm.SVC(kernel="linear", probability=True, random_state=random_state)
tprs = []
aucs = []
mean_fpr = np.linspace(0, 1, 100)
fig, ax = plt.subplots(figsize=(6, 6))
for fold, (train, test) in enumerate(cv.split(X, y)):
classifier.fit(X[train], y[train])
viz = RocCurveDisplay.from_estimator(
classifier,
X[test],
y[test],
name=f"ROC fold {fold}",
alpha=0.3,
lw=1,
ax=ax,
plot_chance_level=(fold == n_splits - 1),
)
interp_tpr = np.interp(mean_fpr, viz.fpr, viz.tpr)
interp_tpr[0] = 0.0
tprs.append(interp_tpr)
aucs.append(viz.roc_auc)
mean_tpr = np.mean(tprs, axis=0)
mean_tpr[-1] = 1.0
mean_auc = auc(mean_fpr, mean_tpr)
std_auc = np.std(aucs)
ax.plot(
mean_fpr,
mean_tpr,
color="b",
label=r"Mean ROC (AUC = %0.2f $\pm$ %0.2f)" % (mean_auc, std_auc),
lw=2,
alpha=0.8,
)
std_tpr = np.std(tprs, axis=0)
tprs_upper = np.minimum(mean_tpr + std_tpr, 1)
tprs_lower = np.maximum(mean_tpr - std_tpr, 0)
ax.fill_between(
mean_fpr,
tprs_lower,
tprs_upper,
color="grey",
alpha=0.2,
label=r"$\pm$ 1 std. dev.",
)
ax.set(
xlabel="False Positive Rate",
ylabel="True Positive Rate",
title=f"Mean ROC curve with variability\n(Positive label '{target_names[1]}')",
)
ax.legend(loc="lower right")
plt.show()

Общее время выполнения скрипта: (0 минут 0.193 секунды)
Связанные примеры
© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/model_selection/plot_roc_crossval.html