如何计算 keras 序列模型的准确率、准确率和召回率以及 F1 分数?

数据挖掘 机器学习 Python 深度学习 喀拉斯 多类分类
2022-02-25 19:29:38

我想计算多类分类问题的准确率、准确率和召回率以及 F1 分数。我正在使用下面提到的这些代码行。

from keras import backend as K
def precision(y_true, y_pred, average='None'):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

def recall(y_true, y_pred, average='micro'):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
    recall = true_positives / (possible_positives + K.epsilon())
    return recall

def f1(y_true, y_pred, average='weighted'):
    def recall(y_true, y_pred):
        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
        possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
        recall = true_positives / (possible_positives + K.epsilon())
        return recall

    def precision(y_true, y_pred):
        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
        predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
        precision = true_positives / (predicted_positives + K.epsilon())
        return precision

    precision = precision(y_true, y_pred)
    recall = recall(y_true, y_pred)
    return 2 * ((precision * recall) / (precision + recall + K.epsilon()))

不知道为什么测试和训练的召回值都是 1。请帮我计算使用 Keras 模型进行多类分类的准确率、准确率和召回率以及 F1 分数。

1个回答

如果你想为每个班级计算这个,那么:

def recall(y_true, y_pred,class_to_analyse):
     pred = K.argmax(y_pred)
     true = K.argmax(y_true)
     p = K.cast(K.equal(pred,class_to_analyse),'int32')
     t = K.cast(K.equal(true,class_to_analyse),'int32')
     # Compute the true positive
     common = K.sum(K.dot(K.reshape(t,(1,-1)),K.reshape(p,(-1,1))))
     # divide by all positives in t
     recall = common/ (K.sum(t) + K.epsilon)
     return recall

def precision(y_true, y_pred,class_to_analyse):
     pred = K.argmax(y_pred)
     true = K.argmax(y_true)
     p = K.cast(K.equal(pred,class_to_analyse),'int32')
     t = K.cast(K.equal(true,class_to_analyse),'int32')
     # Compute the true positive
     common = K.sum(K.dot(K.reshape(t,(1,-1)),K.reshape(p,(-1,1))))
     # divide by all positives in t
     precision = common/ (K.sum(p) + K.epsilon)
     return precision

def fbeta(y_true, y_pred,class_to_analyse):
    beta = 1 # for f1 score 
    precision = precision(y_true, y_pred,class_to_analyse)
    recall = recall(y_true, y_pred,class_to_analyse)

    beta_squared = beta ** 2
    return (beta_squared + 1) * (precision * recall) / (beta_squared * precision + recall)

要使其工作,您需要创建一个具有固定类的函数列表(例如:recall_1(y_true, y_pred) = recall(y_true, y_pred,class_to_analyse = 1)