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_dicttarget_dict 中进行检查. pred_dict 是模型当中 forward() 函数或者 predict() 函数的返回值. target_dict 是DataSet当中的ground truth, 判定ground truth的条件是field的 is_target 被设置为True.

MetricBase 会进行以下的类型检测:

  1. self.evaluate当中是否有varargs, 这是不支持的.

  2. self.evaluate当中所需要的参数是否既不在 pred_dict 也不在 target_dict .

  3. self.evaluate当中所需要的参数是否既在 pred_dict 也在 target_dict .

除此以外,在参数被传入self.evaluate以前,这个函数会检测 pred_dicttarget_dict 当中没有被用到的参数 如果kwargs是self.evaluate的参数,则不会检测

self.evaluate将计算一个批次(batch)的评价指标,并累计。 没有返回值 self.get_metric将统计当前的评价指标并返回评价结果, 返回值需要是一个dict, key是指标名称,value是指标的值

set_metric_name(name: str)[源代码]

设置metric的名称,默认是Metric的class name.

参数

name (str) --

返回

self

get_metric_name()[源代码]

返回metric的名称

返回

class fastNLP.core.metrics.AccuracyMetric(pred=None, target=None, seq_len=None)[源代码]

基类 fastNLP.MetricBase

别名 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.MetricBase

别名 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) -- micromacro . 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,则召回率权重高于精确率。

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(reset=True)[源代码]

get_metric函数将根据evaluate函数累计的评价指标统计量来计算最终的评价结果.

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.MetricBase

别名 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.MetricBase

别名 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) -- micromacro . 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,则召回率权重高于精确率。

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.MetricBase

别名 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