Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через JupyterLite или Binder.
Рабочая характеристика приёмника (ROC) с перекрёстной проверкой
В этом примере показано, как оценить и визуализировать дисперсию метрики рабочей характеристики приёмника (ROC) с помощью перекрёстной проверки.
На кривых ROC обычно отображается доля истинно положительных результатов (TPR) по оси Y и доля ложноположительных результатов (FPR) по оси X. Это означает, что верхний левый угол графика — «идеальная» точка: FPR равна нулю, а TPR равна единице. Это малореалистично, но обычно означает, что большая площадь под кривой (AUC) лучше. «Крутизна» кривых ROC тоже важна, поскольку в идеале нужно максимизировать TPR и минимизировать FPR.
В этом примере показаны ROC-кривые для разных наборов данных, полученных с помощью K-блочной перекрёстной проверки. По всем этим кривым можно вычислить среднее значение AUC и оценить дисперсию кривой при разделении обучающей выборки на разные подмножества. Это приблизительно показывает, как изменения в обучающих данных влияют на результат классификатора и насколько различаются между собой разбиения, полученные при K-блочной перекрёстной проверке.
Примечание
Дополнение к этому примеру, объясняющее стратегии усреднения для обобщения метрик на многоклассовые классификаторы, см. в разделе Многоклассовая рабочая характеристика приёмника (ROC).
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Загрузка и подготовка данных
Мы импортируем набор данных о растениях ириса, содержащий 3 класса, каждый из которых соответствует одному виду ириса. Один класс линейно отделим от двух других; последние не являются линейно разделимыми друг от друга.
Далее мы бинаризуем набор данных, удалив класс «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
Здесь мы применяем cross_validate к классификатору LogisticRegression, а затем используем вычисленные результаты перекрёстной проверки, чтобы построить ROC-кривые для каждого фолда. Обратите внимание: базовый уровень для определения случайного угадывания (пунктирная ROC-кривая) соответствует классификатору, который всегда предсказывает наиболее частый класс.
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import RocCurveDisplay, auc
from sklearn.model_selection import StratifiedKFold, cross_validate
n_splits = 6
cv = StratifiedKFold(n_splits=n_splits)
classifier = LogisticRegression(random_state=random_state).fit(X, y)
cv_results = cross_validate(
classifier, X, y, cv=cv, return_estimator=True, return_indices=True
)
prop_cycle = plt.rcParams["axes.prop_cycle"]
colors = prop_cycle.by_key()["color"]
curve_kwargs_list = [
dict(alpha=0.3, lw=1, color=colors[fold % len(colors)]) for fold in range(n_splits)
]
names = [f"ROC fold {idx}" for idx in range(n_splits)]
mean_fpr = np.linspace(0, 1, 100)
interp_tprs = []
_, ax = plt.subplots(figsize=(6, 6))
viz = RocCurveDisplay.from_cv_results(
cv_results,
X,
y,
ax=ax,
name=names,
curve_kwargs=curve_kwargs_list,
plot_chance_level=True,
)
for idx in range(n_splits):
interp_tpr = np.interp(mean_fpr, viz.fpr[idx], viz.tpr[idx])
interp_tpr[0] = 0.0
interp_tprs.append(interp_tpr)
mean_tpr = np.mean(interp_tprs, axis=0)
mean_tpr[-1] = 1.0
mean_auc = auc(mean_fpr, mean_tpr)
std_auc = np.std(viz.roc_auc)
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(interp_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.194 секунды)
Похожие примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/model_selection/plot_roc_crossval.html