【Python】多分类模型中每一个类别的F1/Precision/Recall计算模板代码

多分类模型中计算每一个类别的 F1/Precision/Recall 模板代码

构建自定义字典

class _MD(object):
    mapper = {
        str: '',
        int: 0,
        list: list,
        dict: dict,
        set: set,
        bool: False,
        float: .0
    }

    def __init__(self, obj, default=None):
        self.dict = {}
        assert obj in self.mapper, \
            'got a error type'
        self.t = obj
        if default is None:
            return
        assert isinstance(default, obj), \
            f'default ({default}) must be {obj}'
        self.v = default

    def __setitem__(self, key, value):
        self.dict[key] = value


    def __getitem__(self, item):
        if item not in self.dict and hasattr(self, 'v'):
            self.dict[item] = self.v
            return self.v
        elif item not in self.dict:
            if callable(self.mapper[self.t]):
                self.dict[item] = self.mapper[self.t]()
            else:
                self.dict[item] = self.mapper[self.t]
            return self.dict[item]
        return self.dict[item]

def defaultdict(obj, default=None):
    return _MD(obj, default)

计算 precision/recall/total

def cal_precision_and_recall(true_labels, pre_labels):
    # 计算f1值
    precision = defaultdict(int, 1)
    recall = defaultdict(int, 1)
    total = defaultdict(int, 1)
    for t_lab, p_lab in zip(true_labels, pre_labels):
        total[t_lab] += 1
        recall[p_lab] += 1
        if t_lab == p_lab:
            precision[t_lab] += 1
    
    for sub in precision.dict:
        pre = precision[sub] / recall[sub]
        rec =  precision[sub] / total[sub]
        F1 = (2 * pre * rec) / (pre + rec)
        print(f"{str(sub)}  precision: {str(pre)}  recall: {str(rec)}  F1: {str(F1)}")

举例来说,假设是三个类别的分类模型: 

y_true=[1,2,3]
y_pred=[1,1,3]

结果():

1  precision: 1.0  recall: 0.6666666666666666  F1: 0.8
3  precision: 1.0  recall: 1.0  F1: 1.0

 

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值