Scikit-learn: 支持多类 roc_auc 分数

创建于 2014-06-19  ·  47评论  ·  资料来源: scikit-learn/scikit-learn

低优先级功能请求:支持在sklearn.metrics使用针对所有方法的多类 roc_auc 分数计算将非常有用。

New Feature

最有用的评论

在微平均中,您的真阳性率 (TPR) 的计算方法是将所有类别的所有 TP 的总和除以所有类别的所有 TP 和 FN 的总和,即对于 3 类问题:
TPR = (TP1+TP2+TP3)/(TP1+TP2+TP3+FN1+FN2+FN3)

示例混淆矩阵:
[[1,2,3],
[4,5,6],
[7,8,9]]
TPR = (1+5+9)/(1+5+9+(2+3)+(4+6)+(7+8))
对误报率执行相同的操作,您可以计算 AUC。

宏平均只是分别计算每个类的 TPR 并将它们平均(由该类中的示例数量加权):
TPR = (1/3)* (TP1/(TP1+FN1) + TP2/(TP2+FN2) + TP2/(TP2+FN2))

同样的例子:
TPR = (1/3)* (1/(1+(2+3)) + 5/(5+(4+6)) + 9/(9+(7+8)))

也许这有帮助(这使用精度,但想法是一样的):
http://stats.stackexchange.com/questions/156923/should-i-make-decisions-based-on-micro-averaged-or-macro-averaged-evaluation-mea

我个人永远不会使用未加权的宏观平均值,但我会看看我是否能找到研究这个的论文。

所有47条评论

我不确定这意味着什么。 你有参考吗?

2014 年 6 月 19 日 09:51,Madison May通知@ github.com 写道:

低优先级功能请求:支持多类roc_auc score
在 sklearn.metrics 中使用一种对所有方法进行计算
会非常有用。


直接回复此邮件或在 GitHub 上查看
https://github.com/scikit-learn/scikit-learn/issues/3298。

这是一个相当不错的解释,以及参考资料: https :

嗯,在没有实现多类 auc 的情况下,推荐的得分手是什么?

在 sklearn.metrics 中使用一种反对所有方法支持多类 roc_auc 分数计算将非常有用

你是在谈论那些幻灯片认为的表面下体积的近似值,其中采用每个类别的 AUC 的频率加权平均值? 这似乎与使用带有二值化表示的当前roc_auc_scoreaverage='weighted' 。 ( @arjoly ,为什么这些基于曲线的分数不允许多类?)

否则,这些幻灯片以及我能找到的大多数关于“多类 ROC”的参考资料都侧重于 OvR 的多类校准,而不是评估指标。 这是你感兴趣的吗? 我不知道这种技术有多普遍,是否值得在 scikit-learn 中提供这种技术,以及是否应该改进贪婪优化。

@arjoly ,为什么这些基于曲线的分数不允许多类?)

每当 y_true 中缺少一个类时,就无法计算分数。 我不想为类推理添加魔法而让用户陷入困境。

在 y_pred 的情况下,我们可能没有适当地处理
有一个 y_true 没有的标签。 那个标签可能不应该
参与任何类似宏观平均的事情(根据 Weka,
太),或 ROC 分数。

自2014年8月1日17:08,阿尔诺乔利[email protected]写道:

@arjoly https://github.com/arjoly,为什么这些基于曲线的分数
禁止多类?)

每当 y_true 中缺少一个类时,就无法计算
分数。 我不想为类推理添加魔法并得到
用户遇到问题。


直接回复此邮件或在 GitHub 上查看
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -50855460
.

@jnothman @arjoly在平均方面取得了很大进展。 现在实施这件事有多难?

它可能类似于 pROC 包中的 R 函数
http://www.inside-r.org/packages/cran/pROC/docs/multiclass.roc

嗨,我实施了宏观平均 ROC/AUC 分数的草稿,但我不确定它是否适合 sklearn。

这是代码:

from sklearn.metrics import roc_auc_score
from sklearn.preprocessing import LabelBinarizer

def multiclass_roc_auc_score(truth, pred, average="macro"):

    lb = LabelBinarizer()
    lb.fit(truth)

    truth = lb.transform(truth)
    pred = lb.transform(pred)

    return roc_auc_score(truth, pred, average=average)

能这么简单吗?

@fbrundu如果这是标准含义。 这当然是一种可能的解释。

这里有一个很好的总结:
http://people.inf.elte.hu/kiss/13dwhdm/roc.pdf

pROC 包实现了 Hand 和 Till:
http://download.springer.com/static/pdf/398/art%253A10.1023%252FA%253A1010920819831.pdf?originUrl=http%3A%2F%2Flink.springer.com%2Farticle%2F10.1023%2FA% 3A1010920819831&token2 = EXP = 1469743016 〜ACL =%2Fstatic%2Fpdf%2F398%2Fart%25253A10.1023%25252FA%25253A1010920819831.pdf%3ForiginUrl%3Dhttp%253A%252F%252Flink.springer.com%252Farticle%252F10.1023%252FA%253A1010920819831 *~hmac=bc68686d3782ac6af3c3cda13c1b36aad6de5d01d16a25870cace5fe9699fb8a

Hand 和 Till 的版本似乎被普遍接受,我投票我们实施它。
还有一个版本的 Provost 和 Domingos,鉴于 Provost 目前是我的导演,我可能应该支持它,但这还没有流行起来。
教务长-多明戈斯就是@fbrundu所说的,只用average='weighted'

TLDR:Hand 和Till 欢迎的公关。 可选择 Provost 和 Domingos,可选择更改平均值。

您好,请问在实施方面有任何进展吗?
我在大多数其他库(例如 WEKA)中看到的是它们使用加权平均值。 我认为这是@fbrundu使用 average='micro' 提出的建议?

@joaquinvanschoren R 使用 Hand 和 Till。 我也更喜欢那个。 我有一个学生很快就会做这件事。

@amueller我可以解决这个问题:)

@kchen17谢谢!

我们在 OpenML 上讨论了很多。 对于多类 AUC,不能保证一种方法(宏平均、微平均、加权平均等)比另一种更好。 在 R 中,您至少可以找到 5 种不同的方法(现在都可以在 MLR 中使用)。
在 scikit-learn 中实现这一点时,如果至少有可能选择对您的应用程序最有意义的一个,即使您使用 Hand-Till 作为默认值,那也是很好的。 顺便说一下,Hand-Till 是一种非加权方法,它没有考虑标签不平衡。

我很高兴有多个版本。 非加权和“不考虑标签不平衡”是两件不同的事情;) 你有清单和参考资料吗?

在这种情况下,什么是微平均?

请注意,我们已经对本示例中实现的多类问题进行了微观和宏观平均 ROC AUC:

http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#multiclass -settings

实际上,我认为文档不正确,应该说
多标签...

2016 年 9 月 26 日 23:16,Olivier Grisel通知@ github.com
写道:

并不是说我们已经对多类进行了微观和宏观平均 ROC AUC
本例中实现的问题:

http://scikit-learn.org/stable/auto_examples/model_
选择/plot_roc.html#multiclass-settings


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -249566346,
或静音线程
https://github.com/notifications/unsubscribe-auth/AAEz65IeU7k2CFwyHxTTAjk-5orIxWe6ks5qt8WsgaJpZM4CFzud
.

在微平均中,您的真阳性率 (TPR) 的计算方法是将所有类别的所有 TP 的总和除以所有类别的所有 TP 和 FN 的总和,即对于 3 类问题:
TPR = (TP1+TP2+TP3)/(TP1+TP2+TP3+FN1+FN2+FN3)

示例混淆矩阵:
[[1,2,3],
[4,5,6],
[7,8,9]]
TPR = (1+5+9)/(1+5+9+(2+3)+(4+6)+(7+8))
对误报率执行相同的操作,您可以计算 AUC。

宏平均只是分别计算每个类的 TPR 并将它们平均(由该类中的示例数量加权):
TPR = (1/3)* (TP1/(TP1+FN1) + TP2/(TP2+FN2) + TP2/(TP2+FN2))

同样的例子:
TPR = (1/3)* (1/(1+(2+3)) + 5/(5+(4+6)) + 9/(9+(7+8)))

也许这有帮助(这使用精度,但想法是一样的):
http://stats.stackexchange.com/questions/156923/should-i-make-decisions-based-on-micro-averaged-or-macro-averaged-evaluation-mea

我个人永远不会使用未加权的宏观平均值,但我会看看我是否能找到研究这个的论文。

你好! 上周我开始研究这个问题,我想发布一个快速更新/一些问题,只是为了确保我在正确的轨道上。

  • 到目前为止:我开始执行multiclass_roc_auc_score函数,默认情况下,该函数会将一些average参数设置为 None。 此默认值将使用 Hand-Till 算法(如前所述,这不考虑标签不平衡)。
  • 该方法是否接受与roc_auc_score参数相同的参数?
  • 然后,不同之处在于y_true可以有 2 类以上的标签。 Hand-Till 将涉及找到所有可能的标签对,为这些对中的每一对计算roc_auc_score ,然后取这些的平均值。

让我知道您可能有哪些更正/建议!

通常,如果重用roc_auc_score是合理可行的,我们将避免创建另一个函数。 我认为将默认值保留为“宏”是可以接受的。

您应该考虑的一件关键事情是如何测试这些更改,包括更改 metrics/tests/test_common.py 中roc_auc_score特征

是的,我们应该更新文档。

@joaquinvanschoren有趣的是,

所以目前我们只有多标签,所以我们想用 1vs1 和 1vsRest 添加多类,它们每个都有加权和未加权的变体。
我真的不明白 AUC 的samplemicro平均是如何工作的:(

所以...我建议我们向 AUC 添加一个参数multi-class ,它可以是ovoovr ,并将考虑加权参数。 我不确定我们是否希望允许samplemicro因为这对我来说没有意义。

@arjoly所以microsample对矩阵的行而不是列进行操作? 有没有相关的论文? 我在中华民国文献中没有找到。

问题在于,要使手动耕作测量成为默认值,我们必须进行加权平均 OvO,而且我们无法真正更改加权选项。 所以也许我们默认做 OVR 并在叙述中解释带权重的 OvO 也是一个不错的选择并添加参考?

@joaquinvanschoren引用的论文

@amueller :有机会再次阅读您的评论,我对这部分有点困惑:

问题在于,要使手动耕作测量成为默认值,我们必须进行加权平均 OvO,而且我们无法真正更改加权选项。 所以也许我们默认做 OVR 并在叙述中解释带权重的 OvO 也是一个不错的选择并添加参考?

我打算根据您的回复修改roc_auc_score以合并一个multiclass=['ovo', 'ovr']参数。 如果 OvR 是默认值 ( roc_auc_score(y_true, y_score, multiclass="ovo" ... ) ),但 Hand & Till 是 OvO,我该如何解决实现的 OvR 部分? (即,如果我检测到 y_true 是多类的,如果“ovr”未实现并指示用户传入“ovo”,则仅引发错误?)

抱歉,我希望你同时实现ovoovr ;) 我认为这应该是相当直接的。

@amueller :注意到了,这也将被纳入! 还想问:有没有什么关于如何检测multiclass和multilabel之间的差异的建议? 起初,我只是检查y_score的尺寸,但很快意识到这还不够。 (即只是检查标签是否只有 0 和 1?)

多标签意味着一次预测多个标签:你得到一个
每个实例的预测向量。 多班意味着你得到一个
预测但该预测可以有两个以上的值(它不是
二进制)。

有时,人们通过对输出进行二值化来解决多类情况,因此
每个实例你会得到多个二进制值(因此是多标签),这个
经常引起混乱。
在周六,2016年10月8日在16:33,凯西陈[email protected]写道:

@amueller https://github.com/amueller :注意到了,这将是
也加入了! 还想问:有没有什么建议
检测多类和多标签之间的区别? 起初,我是
只是检查 y_score 的尺寸,但很快就意识到了这一点
是不够的。


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -252427642,
或静音线程
https://github.com/notifications/unsubscribe-auth/ABpQV7Mv0rHGEfrkYi5Xezz3PItyrLZ6ks5qx6mdgaJpZM4CFzud
.

嗨,我希望type_of_target可以解决区分multi-labelmulti-class输出的目的。 HTH

使用type_of_target是个好主意。 虽然在 scikit-learn 中y的维度实际上是我们要做多标签还是多目标的指标。 如果您按照@joaquinvanschoren建议的方式将输出二值化,则 scikit-learn 将始终假设为多标签。

type_of_target 可以很好地区分 y_trues,@amueller

2016 年 10 月 9 日 05:18,Andreas Mueller通知@github.com
写道:

使用 type_of_target 是个好主意。 虽然在 scikit-learn 中
y 的维度实际上是我们是否想做的指标
多标签或多目标。 如果将输出二值化为
@joaquinvanschoren https://github.com/joaquinvanschoren建议
scikit-learn 将始终假设多标签。


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -252439908,
或静音线程
https://github.com/notifications/unsubscribe-auth/AAEz6wa5fnE_LX3LLXbCoc0Z4hBbSAQ0ks5qx95rgaJpZM4CFzud
.

大家好,我只是想让你知道我提交了一个“初步”的 PR。 我有兴趣听到一些关于实施的反馈(例如,我确信有办法以比我现在更好的方式利用 numpy/等),以及添加新测试、文档措辞等的最佳实践。

感谢您到目前为止的所有帮助!

为 AUC 添加多类支持的任何进展?

@joaquinvanschoren :在@jnothman在#7663 中进行代码审查后进行修订。 当我完成期中考试后,下周可能会提交另一个更新

@kathyxchen@jnothman

PR 有更新吗?

只是检查一下,看看在添加对 AUC 的多类支持方面是否有任何进展?

我们很难确定什么是公认的和有原则的
多类的 ROC AUC 公式。 看
https://github.com/scikit-learn/scikit-learn/pull/7663#issuecomment -307566895
和下面。

所以各位。 多类 auc 分数有任何进展吗? 我发现 iris 数据集的官方文档代码非常混乱。 因为这种方法表明我的模型可以很好地预测随机数。

到这里就差不多完成了,我们需要在合并之前决定一个API细节: https :

@trendsearcher你能提供一个例子吗? 现在已合并,但我想看看您遇到的问题。

乐意效劳。 我怎么能举个例子(它有很多代码,可能不是
直觉的)? 也许我可以用纯文本来写?

чт, 18 июл。 2019 年 в 00:35,Andreas Mueller通知@ github.com:

@trendsearcher https://github.com/trendsearcher你能提供一个
请举例? 它现在已合并,但我想看看你的问题
有经验的。


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/scikit-learn/scikit-learn/issues/3298?email_source=notifications&email_token=AKS7QOFYRQY7RZJBWUVVJSTP76GDFA5CNFSM4AQXHOO2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD2GU7EI#issuecomment-512577425
或静音线程
https://github.com/notifications/unsubscribe-auth/AKS7QOFQ5LAIZ2ZBR4M4EATP76GDFANCNFSM4AQXHOOQ
.

嗨,我实施了宏观平均 ROC/AUC 分数的草稿,但我不确定它是否适合 sklearn。

这是代码:

from sklearn.metrics import roc_auc_score
from sklearn.preprocessing import LabelBinarizer

def multiclass_roc_auc_score(truth, pred, average="macro"):

    lb = LabelBinarizer()
    lb.fit(truth)

    truth = lb.transform(truth)
    pred = lb.transform(pred)

    return roc_auc_score(truth, pred, average=average)

能这么简单吗?

@fbrundu谢谢分享! 我试过你的代码。 但是当我调用这个函数时,我遇到了一个问题,说“标签二值化不支持多输出目标数据”。 然后我删除函数中的代码“pred=lb.transform(pred)”。 但是,我遇到了另一个问题“发现样本数量不一致的输入变量:[198, 4284]”。

请问你能不能帮我解决这个问题? 谢谢!

@Junting-Wang

 I meet a problem saying "Multioutput target data is not supported with label binarization". 

你必须使用 predict 而不是 predict_proba

@fbrundu你的实现正确吗? 我使用它并且工作。

此页面是否有帮助?
0 / 5 - 0 等级