Spec-Zone.ru › scikit-learn

Примечание

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

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

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 (Receiver Operating Characteristic)

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

Кривая DET (Detection Error Tradeoff)

Визуализация с помощью объектов отображения

© 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

Spec-Zone.ru

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