Рабочая характеристика приемника (ROC) с перекрестной проверкой в Scikit Learn

Опубликовано: 21 Февраля, 2023

В этой статье мы реализуем ROC с перекрестной проверкой в Scikit Learn. Прежде чем мы перейдем к коду, давайте сначала поймем, зачем нам нужна кривая ROC и перекрестная проверка в прогнозах модели машинного обучения.

Кривая рабочих характеристик приемника (кривая ROC)

Чтобы понять кривую ROC, нужно быть знакомым с такими терминами, как истинно положительный, ложноположительный, истинно отрицательный и ложноотрицательный. Кривая ROC представляет собой наглядный или графический график, показывающий соотношение ложноположительных и истинноположительных результатов, где ложноположительные значения находятся на оси X, а истинноположительные — на оси Y. В этом контексте частота ложноположительных результатов обозначается как специфичность, а частота истинных положительных результатов обозначается как чувствительность.

Sensitivity = TP/(TP+FN)

Specificity = TN/(TN+FP)

Верхний левый угол кривой ROC обозначает идеальную точку, где вероятность ложных срабатываний равна 0, а доля истинных положительных результатов равна 1. Обычно вы не получаете 1, но оценка, близкая к 1, считается хорошей оценкой.

Кривая ROC может использоваться в качестве оценочной метрики для модели на основе классификации. Это хорошо работает, когда целевая классификация является двоичной.

Перекрестная проверка

В машинном обучении разделение набора данных на обучение и тестирование иногда может быть проблематичным. Перекрестная проверка — это метод, с помощью которого мы выбираем партии различных обучающих наборов и помещаем их в модель. Это, в свою очередь, помогает обобщить модель и менее подвержено переоснащению. Наиболее часто используемыми методами перекрестной проверки являются KFold, StratifiedKFold, RepeatedKFold, LeaveOneGroupOut и GroupKFold.

Теперь мы реализуем метод перекрестной проверки, чтобы понять кривую ROC для разных выборок набора данных.

Рабочая характеристика приемника (ROC) с перекрестной проверкой в Scikit Learn

Прежде чем мы приступим к реализации кода, убедитесь, что вы загрузили модуль sklearn Python.

pip install -U scikit-learn

Импортируйте необходимые библиотеки

Python3




import numpy as np
import matplotlib.pyplot as plt
  
from sklearn import datasets
from sklearn.metrics import roc_curve, auc,roc_auc_score
from sklearn.metrics import RocCurveDisplay
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold

Прочитать данные

Python3




data = datasets.load_breast_cancer()
X = data.data
y = data.target
  
print(X.shape)
print(y.shape)

Выход:

(569, 30)
(569,)

Определите перекрестную проверку и модель

В нашем случае мы будем использовать перекрестную проверку KFold и логистическую регрессию, поскольку конечной целью данных является двоичная классификация.

Python3




cross_val = KFold(n_splits=6, random_state=42, shuffle=True)
model = LogisticRegression()

Инициализировать истинную положительную скорость и площадь под кривой

Поскольку мы используем перекрестную проверку, у нас будут разные образцы обучающих наборов. Таким образом, мы определим среднюю частоту ложноположительных результатов, частоту истинных положительных результатов и площадь под кривой в виде списка или массива.

Python3




tprs, aucs = [], []
mean_fpr = np.linspace(0, 1, 100)

Постройте кривую ROC для каждого разделения перекрестной проверки

Sklearn предоставляет метрики отображения кривой ROC, которые используют модель и данные тестирования в качестве аргумента для расчета кривой ROC для заданного набора данных. Истинно положительная кривая и кривая Area Under обновляется при каждом разделении.

Python3




fig, ax = plt.subplots()
for index, (train, test) in enumerate(cross_val.split(X, y)):
    model.fit(X[train], y[train])
    plot = RocCurveDisplay.from_estimator(
        model, X[test], y[test],
        name="ROC fold {}".format(index),
        ax=ax,
    )
    interp_tpr = np.interp(mean_fpr, plot.fpr, plot.tpr)
    interp_tpr[0] = 0.0
    tprs.append(interp_tpr)
    aucs.append(plot.roc_auc)
  
ax.set(
    xlim=[-0.05, 1.05],
    ylim=[-0.05, 1.05],
    title="Receiver operating characteristic with CV",
)
plt.savefig("roc_cv.jpeg")

Выход: