Разница между sklearn.roc_auc_score() и sklearn.plot_roc_curve()

#python #machine-learning #scikit-learn #roc #auc

#питон #машинное обучение #scikit-учиться #ОКР #auc

Вопрос:

Я хотел бы оценить свою модель машинного обучения. Я вычислил площадь под кривой ROC с roc_auc_score() помощью и построил кривую ROC с plot_roc_curve() помощью функций sklearn. Во второй функции AUC также вычисляется и отображается на графике. Теперь моя проблема в том, что я получаю разные результаты для двух AUC.

Вот воспроизводимый код с образцом набора данных:

 import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import plot_roc_curve
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import MinMaxScaler

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

scaler = MinMaxScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

model = MLPClassifier(random_state=42)
model.fit(X_train, y_train)
yPred = model.predict(X_test)

print(roc_auc_score(y_test, yPred))
plot_roc_curve(model, X_test, y_test)
plt.show()
 

roc_auc_score Функция дает мне 0,979, а график показывает 1,00.
Несмотря на то, что вторая функция принимает модель в качестве аргумента и снова предсказывает yPred, результат не должен отличаться. Это не ошибка округления. Если я уменьшу количество итераций обучения, чтобы получить плохой предсказатель, значения все равно будут отличаться.

С моим реальным набором данных я «добился» разницы в 0,1 между этими двумя методами. Как возникает эта аберрация?

Ответ №1:

Вы должны передавать вероятности прогнозирования roc_auc_score , а не прогнозируемые классы. Вот так:

 yPred_p = model.predict_proba(X_test)[:,1]
print(roc_auc_score(y_test, yPred_p))

# output: 0.9983354140657512
 

Когда вы передаете предсказанные классы, это фактически кривая, для которой вычисляется AUC (что неверно):

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

Код для регенерации:

 from sklearn.metrics import roc_curve, auc
fpr, tpr, _ = roc_curve(y_test, yPred)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, label='AUC = '   str(round(roc_auc, 2)))
plt.legend(loc='lower right')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')