[sklearn] 分类指标解惑

  • 首先查看metrics官方文档:https://scikit-learn.org/stable/api/sklearn.metrics.html

weighted/macro/micro/samples的区别

weighted 和 samples

weighted 这个参数在 roc_auc_score 函数中,其实就是考虑了 true instance 的情况(也就是需要传一个sample_weights的参数?)。

  • 官方文档的原文:when average=weighted, calculate metrics for each label, and find their average, weighted by support (the number of true instances for each label).

  • 我做了几次实验,average=samples的时候,auc比macro/micro/weighted都要高几个点,这是正常的吗?

def case_multilabels():
    print("case_multilabels")
    output = []
    target = []

    weights = []
    for i in range(100):
        weights.append(np.random.randint(10, 100))
        prob = np.random.rand(3)
        prob_norm = prob / np.sum(prob)
        output.append(prob_norm)
        label = [0, 0, np.random.randint(0, 2)]
        label[i%3] = 1
        # if i == 0:
            # label = [1, 1, 1]  # average=samples不能有全1的样本?
        target.append(label)
        
    target = np.array(target)
    output = np.array(output)

    auc_weights = roc_auc_score(target, output, average='weighted', sample_weight=weights, multi_class='ovo')
    auc_binary = roc_auc_score(target, output, average='weighted', multi_class='ovo')
    auc_macro = roc_auc_score(target, output, average='macro')
    auc_micro = roc_auc_score(target, output, average='micro')
    auc_sample = roc_auc_score(target, output, average='samples')
    print("auc_weights: ", auc_weights)
    print("auc_binary: ", auc_binary)
    print("auc_macro: ", auc_macro)
    print("auc_micro: ", auc_micro)
    print("auc_sample: ", auc_sample)

macro 和 micro 的区别

样本1:实际标签为 A,预测为 [0.6, 0.2, 0.2]
样本2:实际标签为 B,预测为 [0.1, 0.7, 0.2]
样本3:实际标签为 C,预测为 [0.2, 0.1, 0.7]
构建的标签指示矩阵可能如下所示:
在这里插入图片描述

macro是单独计算每个类别的auc/f1/recall/precision/混淆矩阵,然后最后平均。

  • 混淆矩阵是求和,不是平均!

micro是求出了上面的全局0-1矩阵之后,全局地计算auc/f1/recall/porecision。

  • 即变成了下面的情况再计算auc/f1/混淆矩阵。
    • 概率矩阵为 [0.6, 0.2, 0.2, … , 0.2, 0.1, 0.7]
    • 标签矩阵为 [1, 0, 0, …, 0, 0, 1]

F1/Recall/Precision

  • 二分类使用 binarymacro 计算得到的结果是一样的,默认是 binary
  • 多分类的时候使用 macro 就可以了
  • 多标签任务的时候,也可以使用 macro
  • average参数可以设置为 None,这个时候就会返回各个类的指标。
  • 默认是 multi_class='ovr',不需要改动

AUC

  • 二分类的时候,使用 weighted 或者 macro 计算出来的结果都是一样的,不过默认选择 macro 就好了
  • roc_auc_score 默认使用 macro
  • 不管是多分类还是多标签,macro就没错了。
  • average参数可以设置为 None,这个时候就会返回各个类的指标。
  • 默认是 multi_class='ovr',不需要改动

ovo (one vs. one) 和 ovr (one vs. rest) 的区别

ovo和ovr都是把多分类转成二分类问题的方法。

在计算指标的过程中,选取第 i i i 类为正类,其它类则为负类的时候,则属于 ovr

在这里插入图片描述

而 ovo 则是投票的计算方法:

  • 我也不知道auc/f1计算的时候选上 multiclass='ovo' 有什么用

在这里插入图片描述

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值