【问题标题】:sklearn roc_auc_score with multi_class=="ovr" should have None average available带有 multi_class=="ovr" 的 sklearn roc_auc_score 应该没有可用的平均值
【发布时间】:2020-04-27 04:28:32
【问题描述】:

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

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

我想要实现的是一组 AUC 分数,我拥有的每个班级都有一个分数。

为此我想使用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情况被视为@ 987654323@ 和内部多标签函数accepts None 作为average 参数。

因此,通过查看代码,似乎我应该能够在 One vs Rest 的情况下执行具有 None 平均值的多类,但源代码中的 ifs 不允许这种组合。

我错了吗?

如果我错了,从理论的角度来看,我应该伪造一个多标签案例,只是为了让不同的类具有不同的 AUC,还是应该编写自己的函数来循环不同的类并输出 AUC?

谢谢

【问题讨论】:

    标签: python machine-learning scikit-learn auc


    【解决方案1】:

    如您所知,现在 sklearn 多类 ROC AUC 仅处理 macroweighted 平均值。但它可以实现,因为它可以单独返回每个班级的分数。

    从理论上讲,您可以实现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])
    

    【讨论】:

    • 现在这与我决定使用的解决方案相同。我希望来自sklearn 的多类 ROC AUC 实现了这个功能,因为它似乎就在拐角处,但却遥不可及。
    【解决方案2】:

    根据sklearn documentation,multi_class的默认参数是'raised',在文档中提到,默认参数会抛出异常,所以你必须明确提到ovrovo@987654326 @。

    参考附件截图

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多