keras y_test和y_score之间的roc_auc_score不匹配

laawzig2  于 2023-01-26  发布在  其他
关注(0)|答案(3)|浏览(332)

我在试着计算以下公式:

auc = roc_auc_score(gt, pr, multi_class="ovr")

其中gt是包含0到41之间的值的大小为3470208的列表(全部为整数),并且pr是大小为3470208(相同大小)的列表,其中每个列表的大小为42,并且在每个位置中的概率总和为1。
但是,我得到了以下错误:

ValueError: Number of classes in y_true not equal to the number of columns in 'y_score'

我有点迷惑,因为y_true (gt)中的类数是42,因为我有一个从0到41的整数列表。
既然pr是一个大小为42的列表的列表,那么我认为它应该可以工作。
帮助将不胜感激!

p1iqtdky

p1iqtdky1#

确保所有介于0和41之间(包括0和41)的整数都存在于gt中。
举个简单的例子:

import numpy as np
from sklearn.metrics import roc_auc_score

# results in error:
gt1 = np.array([0,1,3])
pr1 = np.array(
    [[0.1, 0.7, 0.1, 0.1], 
     [0.3, 0.3, 0.2, 0.2], 
     [0.5, 0.1, 0.1, 0.3]]
)
#roc_auc_score(gt1, pr1, multi_class='ovr')

# does not result in error:
gt2 = np.array([0,2,1,3])
pr2 = np.array(
    [[0.1, 0.7, 0.1, 0.1], 
     [0.3, 0.3, 0.2, 0.2], 
     [0.5, 0.1, 0.1, 0.3],
     [0.3, 0.3, 0.2, 0.2]] 
)
#roc_auc_score(gt2, pr2, multi_class='ovr')

因为integer/label 2在gt1中不存在,所以它抛出一个错误。换句话说,* gt1中的类数 *(3)是 * 不等于pr1中的列数 *(4)。

whlutmcx

whlutmcx2#

roc_auc_score方法有一个labels参数,可用于指定缺失的标签。

不幸的是,这只适用于multi_class=“ovo”模式,而不适用于“ovr”模式。

# without labels
gt1 = np.array([0,1,3])
pr1 = np.array(
    [[0.1, 0.7, 0.1, 0.1], 
     [0.3, 0.3, 0.2, 0.2], 
     [0.5, 0.1, 0.1, 0.3]]
)
roc_auc_score(gt1, pr1, multi_class='ovo')
> ValueError: Number of classes in y_true not equal to the number of columns in 'y_score'

# with labels and multi-class="ovo":
gt1 = np.array([0,1,3])
pr1 = np.array(
    [[0.1, 0.7, 0.1, 0.1], 
     [0.3, 0.3, 0.2, 0.2], 
     [0.5, 0.1, 0.1, 0.3]]
)
roc_auc_score(gt1, pr1, multi_class='ovo', labels=[0, 1, 2, 3])
> 0.5

# with labels and multi-class="ovr":
gt1 = np.array([0,1,3])
pr1 = np.array(
    [[0.1, 0.7, 0.1, 0.1], 
     [0.3, 0.3, 0.2, 0.2], 
     [0.5, 0.1, 0.1, 0.3]]
)
roc_auc_score(gt1, pr1, multi_class='ovr', labels=[0, 1, 2, 3])
> ValueError: Only one class present in y_true. ROC AUC score is not defined in that case.

在本例中,y_true中只存在一个类,因为roc_auc_score函数迭代每个类(标识为类A),并将它们与其他类(标识为类B)进行比较。对于类2,y_true数组等于[B,B,B],因此只有一个类,无法计算ROC AUC分数。

5rgfhyps

5rgfhyps3#

获取唯一值

唯一值= np.唯一(预测)

获取列表形式的唯一值

类标签=唯一值列表()

查找ROC AUC分数

rocAucScore=roc_auc_score(真实值,预测概率,多类别=卵,标签=类别标签)

相关问题