sklearn多类roc auc分数

Pou*_*del 3 python roc scikit-learn auc

如何获得sklearn中多类分类的roc auc分数?

二进制

# this works
roc_auc_score([0,1,1], [1,1,1])

Run Code Online (Sandbox Code Playgroud)

多类

# this fails
from sklearn.metrics import roc_auc_score

ytest  = [0,1,2,3,2,2,1,0,1]
ypreds = [1,2,1,3,2,2,0,1,1]

roc_auc_score(ytest, ypreds,average='macro',multi_class='ovo')

# AxisError: axis 1 is out of bounds for array of dimension 1
Run Code Online (Sandbox Code Playgroud)

我查看了官方文档,但没有解决问题。

Mel*_*aur 6

在多标签情况下,roc_auc_score 需要具有形状 (n_samples, n_classes) 的二进制标签指示符,这是回到一对一方式的方法。

要轻松做到这一点,您可以使用 label_binarize ( https://scikit-learn.org/stable/modules/ generated/sklearn.preprocessing.label_binarize.html#sklearn.preprocessing.label_binarize )。

对于您的代码,它将是:

from sklearn.metrics import roc_auc_score
from sklearn.preprocessing import label_binarize

# You need the labels to binarize
labels = [0, 1, 2, 3]

ytest  = [0,1,2,3,2,2,1,0,1]

# Binarize ytest with shape (n_samples, n_classes)
ytest = label_binarize(ytest, classes=labels)

ypreds = [1,2,1,3,2,2,0,1,1]

# Binarize ypreds with shape (n_samples, n_classes)
ypreds = label_binarize(ypreds, classes=labels)


roc_auc_score(ytest, ypreds,average='macro',multi_class='ovo')
Run Code Online (Sandbox Code Playgroud)

通常,这里 ypreds 和 yest 变为:

ytest
array([[1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1],
       [0, 0, 1, 0],
       [0, 0, 1, 0],
       [0, 1, 0, 0],
       [1, 0, 0, 0],
       [0, 1, 0, 0]])

ypreds
array([[0, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 1, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 1, 0],
       [0, 0, 1, 0],
       [1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 1, 0, 0]])
Run Code Online (Sandbox Code Playgroud)