roc_curve в sklearn: почему это не работает правильно? - PullRequest
0 голосов
/ 11 июля 2019

Я решаю задачу мультиклассовой классификации и хочу оценить результат, используя кривую roc в sklearn.Как я знаю, это позволяет построить кривую в этом случае, если я установлю положительную метку.Я попытался построить кривую roc с использованием положительной метки и получил странные результаты: чем больше «положительная метка» класса, тем ближе к верхнему левому углу кривая roc стала.Затем я строю кривую roc с предыдущей двоичной маркировкой массивов.Эти 2 участка были разными!Я думаю, что второй был построен правильно, но в случае бинарных классов график имеет только 3 точки, и это не информативно.

Я хочу понять, почему кривая roc для бинарных классов и кривая roc с "положительный ярлык »выглядит иначе и как правильно построить кривую Рока с положительным ярлыком.

Вот код:

from sklearn.metrics import roc_curve, auc
y_pred = [1,2,2,2,3,3,1,1,1,1,1,2,1,2,3,2,2,1,1]
y_test = [1,3,2,2,1,3,2,1,2,2,1,2,2,2,1,1,1,1,1]
fp, tp, _ = roc_curve(y_test, y_pred, pos_label = 2)
from sklearn.preprocessing import label_binarize
y_pred = label_binarize(y_pred, classes=[1, 2, 3])
y_test = label_binarize(y_test, classes=[1, 2, 3])
fpb, tpb, _b = roc_curve(y_test[:,1], y_pred[:,1])
plt.plot(fp, tp, 'ro-', fpb, tpb, 'bo-', alpha = 0.5)
plt.show()
print('AUC with pos_label', auc(fp,tp))
print('AUC binary variant', auc(fpb,tpb))

Это пример графика

Красная кривая представляет roc_curve с pos_label, синяя кривая представляет roc_curve в «двоичном регистре»

1 Ответ

0 голосов
/ 11 июля 2019

Как поясняется в комментариях, ROC-кривые не подходят для оценки пороговых прогнозов (т. Е. Жестких классов) как ваших y_pred; более того, при использовании AUC полезно иметь в виду некоторые ограничения, которые не всегда очевидны для многих практиков - см. последнюю часть собственного ответа в Получение низкого показателя ROC AUC, но высокой точности для получения более подробной информации. подробности.

Не могли бы вы дать мне несколько советов, какие метрики я могу использовать для оценки качества такой мультиклассовой классификации с "жесткими" классами?

Самым простым подходом будет матрица путаницы и отчет о классификации, с готовностью предоставленный scikit-learn:

from sklearn.metrics import confusion_matrix, classification_report

y_pred = [1,2,2,2,3,3,1,1,1,1,1,2,1,2,3,2,2,1,1]
y_test = [1,3,2,2,1,3,2,1,2,2,1,2,2,2,1,1,1,1,1]

print(classification_report(y_test, y_pred)) # caution - order of arguments matters!
# result:
             precision    recall  f1-score   support

          1       0.56      0.56      0.56         9
          2       0.57      0.50      0.53         8
          3       0.33      0.50      0.40         2

avg / total       0.54      0.53      0.53        19

cm = confusion_matrix(y_test, y_pred) # again, order of arguments matters
cm
# result:
array([[5, 2, 2],
       [4, 4, 0],
       [0, 1, 1]], dtype=int64)

Из матрицы путаницы вы можете извлечь другие интересующие вас величины, такие как истинные и ложные срабатывания для каждого класса и т. Д. - подробности см. В собственном ответе в Как получить точность, отзыв и f-меру из матрицы путаницы в Python

...