Как получить ro c au c для двоичной классификации в sklearn - PullRequest
1 голос
/ 25 марта 2020

У меня есть проблема двоичной классификации, где я хочу вычислить roc_au c результатов. Для этого я сделал это двумя разными способами, используя sklearn. Мой код выглядит следующим образом.

Код 1:

from sklearn.metrics import make_scorer
from sklearn.metrics import roc_auc_score

myscore = make_scorer(roc_auc_score, needs_proba=True)

from sklearn.model_selection import cross_validate
my_value = cross_validate(clf, X, y, cv=10, scoring = myscore)
print(np.mean(my_value['test_score'].tolist()))

Я получаю вывод как 0.60.

Код 2:

y_score = cross_val_predict(clf, X, y, cv=k_fold, method="predict_proba")

from sklearn.metrics import roc_curve, auc
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(2):
    fpr[i], tpr[i], _ = roc_curve(y, y_score[:,i])
    roc_auc[i] = auc(fpr[i], tpr[i])
print(roc_auc)

Я получаю вывод как {0: 0.41, 1: 0.59}.

Я в замешательстве, так как я получаю две разные оценки в двух кодах. Пожалуйста, дайте мне знать, почему такое различие происходит и как это правильно сделать.

Я с удовольствием предоставлю более подробную информацию, если это необходимо.

1 Ответ

2 голосов
/ 25 марта 2020

Похоже, что вы использовали часть моего кода из другого ответа, поэтому я тоже хотел ответить на этот вопрос.

Для случая двоичной классификации у вас есть 2 класса, и один является положительным классом.

Например, см. здесь . pos_label является меткой положительного класса. Если pos_label=None, если y_true в {-1, 1} или {0, 1}, pos_label установлено в 1, в противном случае возникнет ошибка.

import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.multiclass import OneVsRestClassifier
from sklearn.model_selection import cross_val_predict
from sklearn.linear_model import LogisticRegression
import numpy as np

iris = datasets.load_iris()
X = iris.data
y = iris.target
mask = (y!=2)
y = y[mask]
X = X[mask,:]
print(y)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]

positive_class = 1

clf = OneVsRestClassifier(LogisticRegression())
y_score = cross_val_predict(clf, X, y, cv=10 , method='predict_proba')

fpr = dict()
tpr = dict()
roc_auc = dict()
fpr[positive_class], tpr[positive_class], _ = roc_curve(y, y_score[:, positive_class])
roc_auc[positive_class] = auc(fpr[positive_class], tpr[positive_class])
print(roc_auc)

{1: 1.0}

и

from sklearn.metrics import make_scorer
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import cross_validate

myscore = make_scorer(roc_auc_score, needs_proba=True)

clf = OneVsRestClassifier(LogisticRegression())
my_value = cross_validate(clf, X, y, cv=10, scoring = myscore)
print(np.mean(my_value['test_score'].tolist()))
1.0
...