我正在尝试使用sklearn的roc_auc_score()函数为一个多类问题计算AUC分数。
我有一个形状为[n_samples,n_classes]的预测矩阵和一个形状为[n_samples]的地面真实向量,分别命名为np_pred
和np_label
。
我想要达到的是一组AUC分数,每门类(class)我都有一个。
为此,我想使用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
在multiclass的情况下,从sklearn函数可以预期到此错误;但是,如果您看一下
roc_auc_score
函数的源代码,可以看到,如果multi_class
参数设置为"ovr"
,并且平均值是可接受的值之一,则将MultiClass情况视为multiLabel one和内部multiLabel函数accepts None
作为average
参数。因此,通过查看代码,似乎我应该能够在
None
情况下以One vs Rest
平均执行多类,但是源代码中的if
不允许这种组合。我错了吗?
万一我错了,从理论的角度来看,我应该假冒一个多标签的情况只是为了为不同的类使用不同的AUC,还是应该编写自己的函数来循环不同的类并输出AUC?
谢谢
最佳答案
如您所知,现在sklearn
多类ROC AUC仅处理macro
和weighted
的平均值。但是它可以实现,因为它随后可以分别返回每个类(class)的分数。
从理论上讲,您可以实现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])
关于python - 具有multi_class = ="ovr"的sklearn roc_auc_score应该没有平均可用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59666138/