fastNLP.core.metrics¶
metrics 模块实现了 fastNLP 所需的各种常用衡量指标,一般做为 Trainer
的参数使用。
-
class
fastNLP.core.metrics.
MetricBase
[源代码]¶ 别名
fastNLP.MetricBase
fastNLP.core.metrics.MetricBase
所有metrics的基类,所有的传入到Trainer, Tester的Metric需要继承自该对象,需要覆盖写入evaluate(), get_metric()方法。
evaluate(xxx)中传入的是一个batch的数据。
get_metric(xxx)当所有数据处理完毕,调用该方法得到最终的metric值
以分类问题中,Accuracy计算为例 假设model的forward返回dict中包含 pred 这个key, 并且该key需要用于Accuracy:
class Model(nn.Module): def __init__(xxx): # do something def forward(self, xxx): # do something return {'pred': pred, 'other_keys':xxx} # pred's shape: batch_size x num_classes
假设dataset中 label 这个field是需要预测的值,并且该field被设置为了target 对应的AccMetric可以按如下的定义, version1, 只使用这一次:
class AccMetric(MetricBase): def __init__(self): super().__init__() # 根据你的情况自定义指标 self.corr_num = 0 self.total = 0 def evaluate(self, label, pred): # 这里的名称需要和dataset中target field与model返回的key是一样的,不然找不到对应的value # dev或test时,每个batch结束会调用一次该方法,需要实现如何根据每个batch累加metric self.total += label.size(0) self.corr_num += label.eq(pred).sum().item() def get_metric(self, reset=True): # 在这里定义如何计算metric acc = self.corr_num/self.total if reset: # 是否清零以便重新计算 self.corr_num = 0 self.total = 0 return {'acc': acc} # 需要返回一个dict,key为该metric的名称,该名称会显示到Trainer的progress bar中
version2,如果需要复用Metric,比如下一次使用AccMetric时,dataset中目标field不叫label而叫y,或者model的输出不是pred:
class AccMetric(MetricBase): def __init__(self, label=None, pred=None): # 假设在另一场景使用时,目标field叫y,model给出的key为pred_y。则只需要在初始化AccMetric时, # acc_metric = AccMetric(label='y', pred='pred_y')即可。 # 当初始化为acc_metric = AccMetric(),即label=None, pred=None, fastNLP会直接使用'label', 'pred'作为key去索取对 # 应的的值 super().__init__() self._init_param_map(label=label, pred=pred) # 该方法会注册label和pred. 仅需要注册evaluate()方法会用到的参数名即可 # 如果没有注册该则效果与version1就是一样的 # 根据你的情况自定义指标 self.corr_num = 0 self.total = 0 def evaluate(self, label, pred): # 这里的参数名称需要和self._init_param_map()注册时一致。 # dev或test时,每个batch结束会调用一次该方法,需要实现如何根据每个batch累加metric self.total += label.size(0) self.corr_num += label.eq(pred).sum().item() def get_metric(self, reset=True): # 在这里定义如何计算metric acc = self.corr_num/self.total if reset: # 是否清零以便重新计算 self.corr_num = 0 self.total = 0 return {'acc': acc} # 需要返回一个dict,key为该metric的名称,该名称会显示到Trainer的progress bar中
MetricBase
将会在输入的字典pred_dict
和target_dict
中进行检查.pred_dict
是模型当中forward()
函数或者predict()
函数的返回值.target_dict
是DataSet当中的ground truth, 判定ground truth的条件是field的is_target
被设置为True.MetricBase
会进行以下的类型检测:- self.evaluate当中是否有varargs, 这是不支持的.
- self.evaluate当中所需要的参数是否既不在
pred_dict
也不在target_dict
. - self.evaluate当中所需要的参数是否既在
pred_dict
也在target_dict
.
除此以外,在参数被传入self.evaluate以前,这个函数会检测
pred_dict
和target_dict
当中没有被用到的参数 如果kwargs是self.evaluate的参数,则不会检测self.evaluate将计算一个批次(batch)的评价指标,并累计。 没有返回值 self.get_metric将统计当前的评价指标并返回评价结果, 返回值需要是一个dict, key是指标名称,value是指标的值
-
class
fastNLP.core.metrics.
AccuracyMetric
(pred=None, target=None, seq_len=None)[源代码]¶ -
别名
fastNLP.AccuracyMetric
fastNLP.core.metrics.AccuracyMetric
准确率Metric(其它的Metric参见fastNLP.core.metrics
)-
__init__
(pred=None, target=None, seq_len=None)[源代码]¶ 参数: - pred -- 参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
- target -- 参数映射表中 target 的映射关系,None表示映射关系为 target -> target
- seq_len -- 参数映射表中 seq_len 的映射关系,None表示映射关系为 seq_len -> seq_len
-
evaluate
(pred, target, seq_len=None)[源代码]¶ evaluate函数将针对一个批次的预测结果做评价指标的累计
参数: - pred (torch.Tensor) -- 预测的tensor, tensor的形状可以是torch.Size([B,]), torch.Size([B, n_classes]), torch.Size([B, max_len]), 或者torch.Size([B, max_len, n_classes])
- target (torch.Tensor) -- 真实值的tensor, tensor的形状可以是Element's can be: torch.Size([B,]), torch.Size([B,]), torch.Size([B, max_len]), 或者torch.Size([B, max_len])
- seq_len (torch.Tensor) -- 序列长度标记, 标记的形状可以是None, None, torch.Size([B]), 或者torch.Size([B]). 如果mask也被传进来的话seq_len会被忽略.
-
get_metric
(reset=True)[源代码]¶ get_metric函数将根据evaluate函数累计的评价指标统计量来计算最终的评价结果.
参数: reset (bool) -- 在调用完get_metric后是否清空评价指标统计量. Return dict evaluate_result: {"acc": float}
-
get_metric_name
()¶ 返回metric的名称
返回:
-
set_metric_name
(name: str)¶ 设置metric的名称,默认是Metric的class name.
参数: name (str) -- 返回: self
-
-
class
fastNLP.core.metrics.
SpanFPreRecMetric
(tag_vocab, pred=None, target=None, seq_len=None, encoding_type=None, ignore_labels=None, only_gross=True, f_type='micro', beta=1)[源代码]¶ -
别名
fastNLP.SpanFPreRecMetric
fastNLP.core.metrics.SpanFPreRecMetric
在序列标注问题中,以span的方式计算F, pre, rec. 比如中文Part of speech中,会以character的方式进行标注,句子 中国在亚洲 对应的POS可能为(以BMES为例) ['B-NN', 'E-NN', 'S-DET', 'B-NN', 'E-NN']。该metric就是为类似情况下的F1计算。 最后得到的metric结果为:
{ 'f': xxx, # 这里使用f考虑以后可以计算f_beta值 'pre': xxx, 'rec':xxx }
若only_gross=False, 即还会返回各个label的metric统计值:
{ 'f': xxx, 'pre': xxx, 'rec':xxx, 'f-label': xxx, 'pre-label': xxx, 'rec-label':xxx, ... }
-
__init__
(tag_vocab, pred=None, target=None, seq_len=None, encoding_type=None, ignore_labels=None, only_gross=True, f_type='micro', beta=1)[源代码]¶ 参数: - tag_vocab -- 标签的
Vocabulary
。支持的标签为"B"(没有label);或"B-xxx"(xxx为某种label,比如POS中的NN), 在解码时,会将相同xxx的认为是同一个label,比如['B-NN', 'E-NN']会被合并为一个'NN'. - pred (str) -- 用该key在evaluate()时从传入dict中取出prediction数据。 为None,则使用 pred 取数据
- target (str) -- 用该key在evaluate()时从传入dict中取出target数据。 为None,则使用 target 取数据
- seq_len (str) -- 用该key在evaluate()时从传入dict中取出sequence length数据。为None,则使用 seq_len 取数据。
- encoding_type (str) -- 目前支持bio, bmes, bmeso, bioes。默认为None,通过tag_vocab自动判断.
- ignore_labels (list) -- str 组成的list. 这个list中的class不会被用于计算。例如在POS tagging时传入['NN'],则不会计算'NN'个label
- only_gross (bool) -- 是否只计算总的f1, precision, recall的值;如果为False,不仅返回总的f1, pre, rec, 还会返回每个label的f1, pre, rec
- f_type (str) -- micro 或 macro . micro :通过先计算总体的TP,FN和FP的数量,再计算f, precision, recall; macro : 分布计算每个类别的f, precision, recall,然后做平均(各类别f的权重相同)
- beta (float) -- f_beta分数, \(f_{beta} = \frac{(1 + {beta}^{2})*(pre*rec)}{({beta}^{2}*pre + rec)}\) . 常用为 beta=0.5, 1, 2 若为0.5则精确率的权重高于召回率;若为1,则两者平等;若为2,则召回率权重高于精确率。
- tag_vocab -- 标签的
-
evaluate
(pred, target, seq_len)[源代码]¶ evaluate函数将针对一个批次的预测结果做评价指标的累计
参数: - pred -- [batch, seq_len] 或者 [batch, seq_len, len(tag_vocab)], 预测的结果
- target -- [batch, seq_len], 真实值
- seq_len -- [batch] 文本长度标记
返回:
-
get_metric_name
()¶ 返回metric的名称
返回:
-
set_metric_name
(name: str)¶ 设置metric的名称,默认是Metric的class name.
参数: name (str) -- 返回: self
-
-
class
fastNLP.core.metrics.
CMRC2018Metric
(answers=None, raw_chars=None, context_len=None, pred_start=None, pred_end=None)[源代码]¶ -
别名
fastNLP.CMRC2018Metric
fastNLP.core.metrics.CMRC2018Metric
CRMC2018任务的评价metric-
evaluate
(answers, raw_chars, pred_start, pred_end, context_len=None)[源代码]¶ 参数: - answers (list[str]) -- 如[["答案1", "答案2", "答案3"], [...], ...]
- raw_chars (list[str]) -- [["这", "是", ...], [...]]
- pred_start (tensor) -- batch_size x length 或 batch_size,
- pred_end (tensor) -- batch_size x length 或 batch_size(是闭区间,包含end位置),
- context_len (tensor) -- context长度, batch_size
返回:
-
get_metric_name
()¶ 返回metric的名称
返回:
-
set_metric_name
(name: str)¶ 设置metric的名称,默认是Metric的class name.
参数: name (str) -- 返回: self
-
-
class
fastNLP.core.metrics.
ClassifyFPreRecMetric
(tag_vocab=None, pred=None, target=None, seq_len=None, ignore_labels=None, only_gross=True, f_type='micro', beta=1)[源代码]¶ -
别名
fastNLP.ClassifyFPreRecMetric
fastNLP.core.metrics.ClassifyFPreRecMetric
分类问题计算FPR值的Metric(其它的Metric参见
fastNLP.core.metrics
)最后得到的metric结果为:
{ 'f': xxx, # 这里使用f考虑以后可以计算f_beta值 'pre': xxx, 'rec':xxx }
若only_gross=False, 即还会返回各个label的metric统计值:
{ 'f': xxx, 'pre': xxx, 'rec':xxx, 'f-label': xxx, 'pre-label': xxx, 'rec-label':xxx, ... }
-
__init__
(tag_vocab=None, pred=None, target=None, seq_len=None, ignore_labels=None, only_gross=True, f_type='micro', beta=1)[源代码]¶ 参数: - tag_vocab -- 标签的
Vocabulary
. 默认值为None。若为None则使用数字来作为标签内容,否则使用vocab来作为标签内容。 - pred (str) -- 用该key在evaluate()时从传入dict中取出prediction数据。 为None,则使用 pred 取数据
- target (str) -- 用该key在evaluate()时从传入dict中取出target数据。 为None,则使用 target 取数据
- seq_len (str) -- 用该key在evaluate()时从传入dict中取出sequence length数据。为None,则使用 seq_len 取数据。
- ignore_labels (list) -- str 组成的list. 这个list中的class不会被用于计算。例如在POS tagging时传入['NN'],则不会计算'NN'个label
- only_gross (bool) -- 是否只计算总的f1, precision, recall的值;如果为False,不仅返回总的f1, pre, rec, 还会返回每个label的f1, pre, rec
- f_type (str) -- micro 或 macro . micro :通过先计算总体的TP,FN和FP的数量,再计算f, precision, recall; macro : 分布计算每个类别的f, precision, recall,然后做平均(各类别f的权重相同)
- beta (float) -- f_beta分数, \(f_{beta} = \frac{(1 + {beta}^{2})*(pre*rec)}{({beta}^{2}*pre + rec)}\) . 常用为 beta=0.5, 1, 2 若为0.5则精确率的权重高于召回率;若为1,则两者平等;若为2,则召回率权重高于精确率。
- tag_vocab -- 标签的
-
evaluate
(pred, target, seq_len=None)[源代码]¶ evaluate函数将针对一个批次的预测结果做评价指标的累计
参数: - pred (torch.Tensor) -- 预测的tensor, tensor的形状可以是torch.Size([B,]), torch.Size([B, n_classes]), torch.Size([B, max_len]), 或者torch.Size([B, max_len, n_classes])
- target (torch.Tensor) -- 真实值的tensor, tensor的形状可以是Element's can be: torch.Size([B,]), torch.Size([B,]), torch.Size([B, max_len]), 或者torch.Size([B, max_len])
- seq_len (torch.Tensor) -- 序列长度标记, 标记的形状可以是None, None, torch.Size([B]), 或者torch.Size([B]). 如果mask也被传进来的话seq_len会被忽略.
-
get_metric
(reset=True)[源代码]¶ get_metric函数将根据evaluate函数累计的评价指标统计量来计算最终的评价结果.
参数: reset (bool) -- 在调用完get_metric后是否清空评价指标统计量. Return dict evaluate_result: {"acc": float}
-
get_metric_name
()¶ 返回metric的名称
返回:
-
set_metric_name
(name: str)¶ 设置metric的名称,默认是Metric的class name.
参数: name (str) -- 返回: self
-
-
class
fastNLP.core.metrics.
ConfusionMatrixMetric
(vocab=None, pred=None, target=None, seq_len=None, print_ratio=False)[源代码]¶ -
别名
fastNLP.ConfusionMatrixMetric
fastNLP.core.metrics.ConfusionMatrixMetric
分类问题计算混淆矩阵的Metric(其它的Metric参见
fastNLP.core.metrics
) 最后返回结果为:dict,{'confusion_matrix': ConfusionMatrix实例}
ConfusionMatrix实例的print()函数将输出矩阵字符串。
pred_dict = {"pred": torch.Tensor([2,1,3])} target_dict = {'target': torch.Tensor([2,2,1])} metric = ConfusionMatrixMetric() metric(pred_dict=pred_dict, target_dict=target_dict, ) print(metric.get_metric())
{'confusion_matrix': target 1.0 2.0 3.0 all pred 1.0 0 1 0 1 2.0 0 1 0 1 3.0 1 0 0 1 all 1 2 0 3 }
-
__init__
(vocab=None, pred=None, target=None, seq_len=None, print_ratio=False)[源代码]¶ 参数: - vocab -- vocab词表类,要求有to_word()方法。
- pred -- 参数映射表中 pred 的映射关系,None表示映射关系为 pred -> pred
- target -- 参数映射表中 target 的映射关系,None表示映射关系为 target -> target
- seq_len -- 参数映射表中 seq_len 的映射关系,None表示映射关系为 seq_len -> seq_len
- print_ratio -- 限制print的输出,false only for result, true for result, percent(dim=0), percent(dim = 1)
-
evaluate
(pred, target, seq_len=None)[源代码]¶ evaluate函数将针对一个批次的预测结果做评价指标的累计
参数: - pred (torch.Tensor) -- 预测的tensor, tensor的形状可以是torch.Size([B,]), torch.Size([B, n_classes]), torch.Size([B, max_len]), 或者torch.Size([B, max_len, n_classes])
- target (torch.Tensor) -- 真实值的tensor, tensor的形状可以是Element's can be: torch.Size([B,]), torch.Size([B,]), torch.Size([B, max_len]), 或者torch.Size([B, max_len])
- seq_len (torch.Tensor) -- 序列长度标记, 标记的形状可以是None, torch.Size([B]), 或者torch.Size([B]).
-
get_metric
(reset=True)[源代码]¶ get_metric函数将根据evaluate函数累计的评价指标统计量来计算最终的评价结果. :param bool reset: 在调用完get_metric后是否清空评价指标统计量. :return dict evaluate_result: {"confusion_matrix": ConfusionMatrix}
-
get_metric_name
()¶ 返回metric的名称
返回:
-
set_metric_name
(name: str)¶ 设置metric的名称,默认是Metric的class name.
参数: name (str) -- 返回: self
-