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