склеарн.метрика.roc_curve для многоклассовой классификации

Я хочу использовать sklearn.метрика.roc_curve для получения кривой ROC для задачи классификации мультиклассов. Здесь дается решение о том, как подогнать roc к многоклассовой проблеме. Но я не понимаю, что означает параметр «y_score«, что я должен предусмотреть для этого параметра в задаче многоклассовой классификации.

Предположим такой сценарий. Существует девять элементов, помеченных от 0 до 8. Первые три элемента принадлежат группе 0, последние три принадлежат группе 2, а три элемента между принадлежат группе 1. 0, 3, 6 являются центрами групп. У меня есть матрица попарных расстояний. Тогда что я должен предоставить для параметра «y_score»?

from sklearn.metrics import roc_curve, auc
from sklearn.preprocessing import label_binarize

listTrue=[0,0,0,1,1,1,2,2,2] #value j at index i means element i is in group j
y=label_binarize(y,classes=range(2))
#get distmatrix
#distmatrix[i][j] gives the distance between element i and element j
fpr=dict()
tpr=dict()
roc_auc=dict()

fpr["micro"], tpr["micro"], _=roc_curve(y.ravel(),y_score?)
roc_auc=auc(fpr["micor"], tpr["micro"])

2 ответа

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

  2. Сначала я отвечу на ваш вопрос о y_score. Таким образом, y_scoreв Примере, который вы упомянули, предсказываются (классификатором) вероятности для тестовых образцов. Если у вас есть 2 класса, то y_scoreбудет иметь 2 столбца, и каждый из столбцов будет содержать вероятность того, что образец будет принадлежать этому классу.

    Для построения мульти-класса ROC используйте label_binarizeфункцию и следующий код. Настройте и измените код в зависимости от приложения.


    Пример использования данных Iris:

    import matplotlib.pyplot as plt
    from sklearn import svm, datasets
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import label_binarize
    from sklearn.metrics import roc_curve, auc
    from sklearn.multiclass import OneVsRestClassifier
    
    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]
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=0)
    
    classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True,
                                     random_state=0))
    y_score = classifier.fit(X_train, y_train).decision_function(X_test)
    
    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])
    colors = cycle(['blue', 'red', 'green'])
    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.05, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver operating characteristic for multi-class data')
    plt.legend(loc="lower right")
    plt.show()
    

    В этом примере можно распечатать y_score.

    print(y_score)
    
    array([[-3.58459897, -0.3117717 ,  1.78242707],
           [-2.15411929,  1.11394949, -2.393737  ],
           [ 1.89199335, -3.89592195, -6.29685764],
           .
           .
           .
    

    Введите описание изображения здесь