Рабочая характеристика приемника (ROC) с перекрестной проверкой в Scikit Learn
В этой статье мы реализуем 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 npimport matplotlib.pyplot as plt from sklearn import datasetsfrom sklearn.metrics import roc_curve, auc,roc_auc_scorefrom sklearn.metrics import RocCurveDisplayfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import KFold |
Прочитать данные
Python3
data = datasets.load_breast_cancer()X = data.datay = 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") |
Выход: