tensorflow 2.x 多分类混淆矩阵及评价指标计算方法(精确率、召回率、f1分数)

import tensorflow as tf


class MultiLabelConfusionMatrix(object):
    """
    Attention Please:
        y_true and y_pred are must to be two-dimensional matrix,
        and their shape are [batch_size, time_steps].
    """
    def __init__(self, classes_num, pad_type='pre'):
        self.classes_num = classes_num
        self.pad_type = pad_type
        self.select_matrix = tf.expand_dims(
            tf.expand_dims(
                tf.one_hot([i for i in range(self.classes_num)], self.classes_num)
                , 1)
            , 1)
        #
        self.true_positives = tf.zeros(shape=self.classes_num)
        self.false_positives = tf.zeros(shape=self.classes_num)
        self.true_negatives = tf.zeros(shape=self.classes_num)
        self.false_negatives = tf.zeros(shape=self.classes_num)
    
    #
    def update_state(self, y_true, y_pred):
        y_true = tf.reduce_sum(
            tf.expand_dims(tf.one_hot(y_true, 3), 0) * self.select_matrix
            , -1
        )
        y_pred = tf.reduce_sum(
            tf.expand_dims(tf.one_hot(y_pred, 3), 0) * self.select_matrix
            , -1
        )
        self.true_positives += tf.reduce_sum(
            tf.where(tf.logical_and(y_pred == 1, y_true == 1), 1., 0.), [1, 2]
        )
        self.false_positives += tf.reduce_sum(
            tf.where(tf.logical_and(y_pred == 1, y_true == 0), 1., 0.), [1, 2]
        )
        self.true_negatives += tf.reduce_sum(
            tf.where(tf.logical_and(y_pred == 0, y_true == 0), 1., 0.), [1, 2]
        )
        self.false_negatives += tf.reduce_sum(
            tf.where(tf.logical_and(y_pred == 0, y_true == 1), 1., 0.), [1, 2]
        )
    
    #
    def result(self, reduction='mean', class_weights=None):
        """
        reduction = 'none', 'mean' or 'weighting'
        """
        true_positives = self.true_positives[1:] if self.pad_type == 'pre' else self.true_positives[:-1]
        false_positives = self.false_positives[1:] if self.pad_type == 'pre' else self.false_positives[:-1]
        false_negatives = self.false_negatives[1:] if self.pad_type == 'pre' else self.false_negatives[:-1]
        precision = true_positives / (true_positives + false_positives)
        recall = true_positives / (true_positives + false_negatives)
        f1score = 2 * precision * recall / (precision + recall)
        if reduction == 'none':
            pass
        elif reduction == 'weighting':
            class_weights = tf.ones_like(precision) if class_weights is None else class_weights
            precision = tf.reduce_sum(precision * class_weights).numpy() / (self.classes_num - 1)
            recall = tf.reduce_sum(recall * class_weights).numpy() / (self.classes_num - 1)
            f1score = tf.reduce_sum(f1score * class_weights).numpy() / (self.classes_num - 1)
        else:
            precision = tf.reduce_sum(precision).numpy() / (self.classes_num - 1)
            recall = tf.reduce_sum(recall).numpy() / (self.classes_num - 1)
            f1score = tf.reduce_sum(f1score).numpy() / (self.classes_num - 1)
        return precision, recall, f1score
    
    #
    def reset_states(self):
        self.true_positives = tf.zeros(shape=self.classes_num)
        self.false_positives = tf.zeros(shape=self.classes_num)
        self.true_negatives = tf.zeros(shape=self.classes_num)
        self.false_negatives = tf.zeros(shape=self.classes_num)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值