多类分类的每个班级 F1 分数



我正在使用python和scikit-learn解决多类分类问题。目前,我正在使用 classification_report 函数来评估分类器的性能,获取如下报告:

>>> print(classification_report(y_true, y_pred, target_names=target_names))
             precision    recall  f1-score   support
    class 0       0.50      1.00      0.67         1
    class 1       0.00      0.00      0.00         1
    class 2       1.00      0.67      0.80         3
avg / total       0.70      0.60      0.61         5

为了进行进一步的分析,我感兴趣的是获得每个可用类的每个类的 f1 分数。也许是这样的:

>>> print(calculate_f1_score(y_true, y_pred, target_class='class 0'))
0.67

scikit-learn上有类似的东西吗?

f1_score文档。

from sklearn.metrics import f1_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
f1_score(y_true, y_pred, average=None)

输出:

array([ 0.8,  0. ,  0. ])

这是每个班级的分数。

我会将f1_scorelabels参数一起使用

from sklearn.metrics import f1_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
labels = [0, 1, 2]
f1_scores = f1_score(y_true, y_pred, average=None, labels=labels)
f1_scores_with_labels = {label:score for label,score in zip(labels, f1_scores)}

输出:

{0: 0.8, 1: 0.0, 2: 0.0}
您只需

要使用pos_label作为参数并分配要打印的类值。

f1_score(ytest, ypred_prob, pos_label=0)# default is pos_label=1

如果您只有混淆矩阵C,其中行对应于预测,列对应于真值,则可以使用以下函数计算 F1 分数:

def f1(C):
    num_classes = np.shape(C)[0]
    f1_score = np.zeros(shape=(num_classes,), dtype='float32')
    weights = np.sum(C, axis=0)/np.sum(C)
    for j in range(num_classes):
        tp = np.sum(C[j, j])
        fp = np.sum(C[j, np.concatenate((np.arange(0, j), np.arange(j+1, num_classes)))])
        fn = np.sum(C[np.concatenate((np.arange(0, j), np.arange(j+1, num_classes))), j])
#         tn = np.sum(C[np.concatenate((np.arange(0, j), np.arange(j+1, num_classes))), np.concatenate((np.arange(0, j), np.arange(j+1, num_classes)))])
        precision = tp/(tp+fp) if (tp+fp) > 0 else 0
        recall = tp/(tp+fn) if (tp+fn) > 0 else 0
        f1_score[j] = 2*precision*recall/(precision + recall)*weights[j] if (precision + recall) > 0 else 0
    f1_score = np.sum(f1_score)
    return f1_score

相关内容

  • 没有找到相关文章

最新更新