我正在尝试使用sklearn的roc_auc_score()函数为一个多类问题计算AUC分数。

我有一个形状为[n_samples,n_classes]的预测矩阵和一个形状为[n_samples]的地面真实向量,分别命名为np_prednp_label

我想要达到的是一组AUC分数,每门类(class)我都有一个。

为此,我想使用average参数选项Nonemulti_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仅处理macroweighted的平均值。但是它可以实现,因为它随后可以分别返回每个类(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/

10-12 01:48