Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через 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()
Mean ROC curve with variability (Positive label 'versicolor')

Общее время выполнения скрипта: (0 минут 0.194 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_roc_crossval.ipynb

Download Python source code: plot_roc_crossval.py

Download zipped: plot_roc_crossval.zip

Похожие примеры

Многоклассовая рабочая характеристика приёмника (ROC)

Кривая компромисса между обнаружением и ошибками (DET)

ROC-кривая с API визуализации

Многоклассовый SGD на наборе данных ирисов

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API