我正在尝试使用sklearn的roc_auc_score()函数来计算多类别问题的AUC得分。
我有一个形状为[n_samples,n_classes]的预测矩阵和一个形状为[n_samples]的真实标签向量,分别命名为np_pred
和np_label
。
我希望获得每一类的AUC得分集合。
为此,我想使用average
参数选项None
和multi_class
参数设置为"ovr"
,但如果我运行
roc_auc_score(y_score=np_pred, y_true=np_label, multi_class="ovr",average=None)
我得到的反馈是
ValueError: average must be one of ('macro', 'weighted') for multiclass problems
这个错误在sklearn函数处理多类别问题时是预期的;但如果你查看roc_auc_score
函数的源代码,你会发现如果multi_class
参数设置为"ovr"
,并且平均值是接受的其中之一,多类别情况会被视为多标签情况,而内部的多标签函数接受None
作为average
参数。
因此,从代码来看,似乎我应该能够在One vs Rest
的情况下执行多类别并使用None
平均值,但源代码中的if
语句不允许这种组合。
我错了吗?
如果我错了,从理论上讲,我应该伪造一个多标签情况只是为了获得不同类别的不同AUCs,还是应该编写自己的函数来循环不同的类别并输出AUCs?
谢谢
回答:
如你所知,目前sklearn
的多类别ROC AUC只能处理macro
和weighted
平均值。但可以实现它,因为它可以单独返回每个类的得分。
从理论上讲,你可以实现OVR
并计算每个类的roc_auc_score
,如下所示:
roc = {label: [] for label in multi_class_series.unique()}for label in multi_class_series.unique(): selected_classifier.fit(train_set_dataframe, train_class == label) predictions_proba = selected_classifier.predict_proba(test_set_dataframe) roc[label] += roc_auc_score(test_class, predictions_proba[:,1])