Рабочая характеристика приемника (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 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" ) |
Выход: