sklearn:多类问题和报告敏感性和特异性

Posted

技术标签:

【中文标题】sklearn:多类问题和报告敏感性和特异性【英文标题】:sklearn: multi-class problem and reporting sensitivity and specificity 【发布时间】:2021-10-05 17:44:29 【问题描述】:

我有一个三类问题,我可以使用以下代码报告每个类的精度和召回率:

from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

这为我提供了表格格式中 3 个类中每一个的精确度和召回率。

我的问题是,我现在如何才能获得 3 个类别中的每一个的敏感性和特异性?我查看了 sklearn.metrics,但没有找到任何报告敏感性和特异性的内容。

【问题讨论】:

敏感性和敏感性如何定义?您可以使用 sklearn 已经提供的哪些指标来自行计算它们? 【参考方案1】:

如果我们检查help page for classification report:

注意,在二元分类中,正类的召回率是 也称为“敏感度”;负类的召回是 “特异性”。

所以我们可以将每个类的 pred 转换为二进制,然后使用来自precision_recall_fscore_support 的召回结果。

举个例子:

from sklearn.metrics import classification_report
y_true = [0, 1, 2, 2, 2]
y_pred = [0, 0, 2, 2, 1]
target_names = ['class 0', 'class 1', 'class 2']
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

    accuracy                           0.60         5
   macro avg       0.50      0.56      0.49         5
weighted avg       0.70      0.60      0.61         5

使用 sklearn:

from sklearn.metrics import precision_recall_fscore_support
res = []
for l in [0,1,2]:
    prec,recall,_,_ = precision_recall_fscore_support(np.array(y_true)==l,
                                                      np.array(y_pred)==l,
                                                      pos_label=True,average=None)
    res.append([l,recall[0],recall[1]])

将结果放入数据框:

pd.DataFrame(res,columns = ['class','sensitivity','specificity'])

    class   sensitivity specificity
0   0   0.75    1.000000
1   1   0.75    0.000000
2   2   1.00    0.666667

【讨论】:

太好了。只有我认为您需要切换灵敏度和特异性值,因为“召回阳性类也称为敏感性”。阳性类的索引为1。我也确认,手动计算,上面的灵敏度和特异性应该翻转。但如果我错了,请纠正我。 抱歉让我检查一下 @miniMint 我认为它是正确的。所以从我上面的例子中,对于标签 1,灵敏度是 Tn / (tn + fp) ,所以 tn = 3 , tn+fp = 3 + 1, 0.75 是正确的 特异性相同,预测没有正确的标签 1,所以特异性 = 0

以上是关于sklearn:多类问题和报告敏感性和特异性的主要内容,如果未能解决你的问题,请参考以下文章

如何从 sklearn gridsearchcv 获取敏感性和特异性(真阳性率和真阴性率)?

从混淆矩阵计算真正值以进行多类分类

sklearn.metrics.roc_curve用法

混淆矩阵敏感性和特异性长度匹配,但数据的级别不能多于参考

用于敏感性和特异性的二进制分类器 Keras 回调?

在 R 中计算具有不同阈值的敏感性、特异性、NPV 和 PPV