【Python】多分类模型中每一个类别的F1PrecisionRecall计算模板代码

tech2026-03-03  1

多分类模型中计算每一个类别的 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

 

 

最新回复(0)