Wednesday, June 29, 2022

Receiver Operating Characteristic (ROC)

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

«Крутизна» ROC-кривых также важна, поскольку она идеальна для максимизации истинно положительного уровня при минимизации ложноположительного уровня.Кривые ROC обычно используются в двоичной классификации для изучения выходных данных классификатора. Чтобы расширить кривую ROC и область ROC до классификации с несколькими метками, необходимо бинаризировать выходные данные. Для каждой метки можно построить одну ROC-кривую, но можно также построить ROC-кривую, рассматривая каждый элемент матрицы индикатора метки как бинарное предсказание (микроусреднение).Другой мерой оценки для классификации с несколькими метками является макроусреднение, придающее равный вес классификации каждой метки.


(.env) boris@boris-All-Series:~/VOTING/ROCURVE$ cat plottingROC.py

"""

=======================================

Receiver Operating Characteristic (ROC)

=======================================

Кривые OC обычно показывают истинную положительную скорость по оси Y и ложную

положительная скорость по оси X. Это означает, что верхний левый угол графика

"идеальная" точка - ложноположительный показатель нуля и истинно положительный 

показатель один. Это не очень реалистично, но это означает, что большая площадь под

кривой (AUC) обычно лучше.«Крутизна» ROC-кривых также важна, так как она идеальна 

для максимизации истинная положительная скорость при минимизации ложноположительной скорости.

Кривые ROC обычно используются в двоичной классификации для изучения выходных данных

классификатор. Чтобы расширить кривую ROC и область ROC до нескольких меток

классификации необходимо бинаризировать вывод. Один ОКР

кривую можно нарисовать для каждой метки, но можно также нарисовать кривую ROC, учитывая

каждый элемент матрицы индикатора метки как бинарное предсказание (микроусреднение).

Еще одна оценочная мера для классификации с несколькими метками макроусреднение, 

придающее равный вес классификации каждой  этикетки.

"""


import numpy as np

import matplotlib.pyplot as plt

from itertools import cycle


from sklearn import svm, datasets

from sklearn.metrics import roc_curve, auc

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import label_binarize

from sklearn.multiclass import OneVsRestClassifier

from sklearn.metrics import roc_auc_score


# Import some data to play with

iris = datasets.load_iris()

X = iris.data

y = iris.target


# Binarize the output

y = label_binarize(y, classes=[0, 1, 2])

n_classes = y.shape[1]


# Add noisy features to make the problem harder

random_state = np.random.RandomState(0)

n_samples, n_features = X.shape

X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]


# shuffle and split training and test sets

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)


# Learn to predict each class against the other

classifier = OneVsRestClassifier(

    svm.SVC(kernel="linear", probability=True, random_state=random_state)

)

y_score = classifier.fit(X_train, y_train).decision_function(X_test)

# Compute ROC curve and ROC area for each class

fpr = dict()

tpr = dict()

roc_auc = dict()

for i in range(n_classes):

    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])

    roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area

fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())

roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

# Plot of a ROC curve for a specific class

plt.figure()

lw = 2

plt.plot(

    fpr[2],

    tpr[2],

    color="darkorange",

    lw=lw,

    label="ROC curve (area = %0.2f)" % roc_auc[2],

)

plt.plot([0, 1], [0, 1], color="navy", lw=lw, linestyle="--")

plt.xlim([0.0, 1.0])

plt.ylim([0.0, 1.05])

plt.xlabel("False Positive Rate")

plt.ylabel("True Positive Rate")

plt.title("Receiver operating characteristic example")

plt.legend(loc="lower right")

plt.show()



# Plot ROC curves for the multiclass problem

# Compute macro-average ROC curve and ROC area

# First aggregate all false positive rates

all_fpr = np.unique(np.concatenate([fpr[i] for i in range(n_classes)]))

# Then interpolate all ROC curves at this points

mean_tpr = np.zeros_like(all_fpr)

for i in range(n_classes):

    mean_tpr += np.interp(all_fpr, fpr[i], tpr[i])

# Finally average it and compute AUC

mean_tpr /= n_classes

fpr["macro"] = all_fpr

tpr["macro"] = mean_tpr

roc_auc["macro"] = auc(fpr["macro"], tpr["macro"])

# Plot all ROC curves

plt.figure()

plt.plot(

    fpr["micro"],

    tpr["micro"],

    label="micro-average ROC curve (area = {0:0.2f})".format(roc_auc["micro"]),

    color="deeppink",

    linestyle=":",

    linewidth=4,

)

plt.plot(

    fpr["macro"],

    tpr["macro"],

    label="macro-average ROC curve (area = {0:0.2f})".format(roc_auc["macro"]),

    color="navy",

    linestyle=":",

    linewidth=4,

)

colors = cycle(["aqua", "darkorange", "cornflowerblue"])

for i, color in zip(range(n_classes), colors):

    plt.plot(

        fpr[i],

        tpr[i],

        color=color,

        lw=lw,

        label="ROC curve of class {0} (area = {1:0.2f})".format(i, roc_auc[i]),

    )

plt.plot([0, 1], [0, 1], "k--", lw=lw)

plt.xlim([0.0, 1.0])

plt.ylim([0.0, 1.05])

plt.xlabel("False Positive Rate")

plt.ylabel("True Positive Rate")

plt.title("Some extension of Receiver operating characteristic to multiclass")

plt.legend(loc="lower right")

plt.show()

# Area under ROC for the multiclass problem

# The :func:`sklearn.metrics.roc_auc_score` function can be used for

# multi-class classification. The multi-class One-vs-One scheme compares every

# unique pairwise combination of classes. In this section, we calculate the AUC

# using the OvR and OvO schemes. We report a macro average, and a prevalence-weighted average.

y_prob = classifier.predict_proba(X_test)

macro_roc_auc_ovo = roc_auc_score(y_test, y_prob, multi_class="ovo", average="macro")

weighted_roc_auc_ovo = roc_auc_score( y_test, y_prob, multi_class="ovo", average="weighted")

macro_roc_auc_ovr = roc_auc_score(y_test, y_prob, multi_class="ovr", average="macro")

weighted_roc_auc_ovr = roc_auc_score( y_test, y_prob, multi_class="ovr", average="weighted")

print( "One-vs-One ROC AUC scores:\n{:.6f} (macro),\n{:.6f} "  "(weighted by prevalence)".format(macro_roc_auc_ovo, weighted_roc_auc_ovo))

print( "One-vs-Rest ROC AUC scores:\n{:.6f} (macro),\n{:.6f} "  "(weighted by prevalence)".format(macro_roc_auc_ovr, weighted_roc_auc_ovr))




































No comments:

Post a Comment