如何根据 predict_proba 矩阵计算 Accuracy、Precision、Recall 和 F1 分数?

数据挖掘 分类 scikit-学习 nlp 朴素贝叶斯分类器
2022-02-23 01:12:22

我找到了定义,as 的链接AccuracyPrecisionRecallF1 score

准确度:使用正确标签预测的文本百分比。

精度:分类器在它为给定标签预测的示例总数中正确获得的示例百分比。

召回:分类器为给定标签预测的示例在它应该为该给定标签预测的示例总数中的百分比。

F1 Score:准确率和召回率的调和平均值。

按照我的这个问题,我的MultinomialNB分类器计算predict_proba了测试集(有 14 个样本)的矩阵,如下所示:

0.192995    0.0996929   0.173688    0.136715    0.126616    0.133012    0.137282
0.174185    0.109345    0.169467    0.144389    0.115021    0.132762    0.154831
0.14172     0.190075    0.125429    0.155343    0.122939    0.149733    0.114763
0.130958    0.2304      0.108793    0.174371    0.115698    0.122529    0.117251
0.139486    0.0938475   0.236573    0.133689    0.118372    0.165151    0.112881
0.135901    0.0845106   0.262501    0.127767    0.119785    0.166609    0.102926
0.136622    0.13782     0.119651    0.320522    0.0854596   0.0996346   0.100292
0.139607    0.181654    0.112189    0.259983    0.0920986   0.106649    0.107819
0.151441    0.0929748   0.155358    0.130407    0.208591    0.151803    0.109425
0.132648    0.122881    0.130545    0.126466    0.196319    0.142594    0.148548
0.135545    0.101456    0.177762    0.118609    0.120773    0.253616    0.0922385
0.132612    0.112645    0.111808    0.102153    0.113548    0.327516    0.0997178
0.111618    0.0859541   0.106807    0.116613    0.085918    0.0873931   0.405696
0.107745    0.0936872   0.0877116   0.122336    0.0902212   0.0909265   0.407373

1.上一个问题的回答者说,虽然predict_proba矩阵元素都小于0.5,但是在文本标注上可能有用。但是根据上述定义,我得出结论,预测的为零,因为所有预测值都小于 0.5。我对么?AccuracyPrecision

2.我不确定Recall和F1分数以及如何计算它们。

3.如何解释矩阵和模型的有用性?


编辑1:

使用这个答案,我将上面形状为 (14,7) 的矩阵(predict_proba在代码中命名为pred_prob )更改为形状为 (7,1) 的矩阵(命名为y_pred),然后使用 one_hot_encoder 函数对其进行转换到混淆矩阵(名为y_pred_one_hot)如下:

y_pred = np.argmax(pred_prob, axis=1)

def one_hot_encode(actual, n_classes):

    if len(actual.shape) == 1:
        actual2 = np.zeros((actual.shape[0], n_classes))
        for i, val in enumerate(actual):
            actual2[i, val] = 1
        actual = actual2

    return actual

y_pred_one_hot = one_hot_encode(y_pred, n_classes=7)

现在 y_pred_one_hot 是:

1   0   0   0   0   0   0
1   0   0   0   0   0   0
0   1   0   0   0   0   0
0   1   0   0   0   0   0
0   0   1   0   0   0   0
0   0   1   0   0   0   0
0   0   0   1   0   0   0
0   0   0   1   0   0   0
0   0   0   0   1   0   0
0   0   0   0   1   0   0
0   0   0   0   0   1   0
0   0   0   0   0   1   0
0   0   0   0   0   0   1
0   0   0   0   0   0   1

现在是这个y_pred_one_hot矩阵,混淆矩阵吗?

1个回答

要计算精度、召回率和 F1 分数等性能指标,您需要将两件事相互比较:

  • 你的模型对你的评估集的预测(在下文中,我称之为y_pred
  • 您的评估集的真实类别(如下所示y_true)。

从您所写的内容中,您仅获得了模型的预测,这就是您所拥有的y_pred您已经构建y_pred,使其每个组件都等于模型分配的最大概率的类。这里一切都好!

您缺少的关键要素是与评估示例相关联的真实类数组(在您的问题中,您称它们为“标签”)。您完全需要这些信息来了解您的模型的预测是否正确(或不正确)。您应该能够构造一个y_true包含示例的真实类/标签的数组...了解实际的类。例如,如果您的第一个文本属于第 3 类,您的第 2 个文本属于第 1 类,您的第三个文本属于第 2 类,那么您y_true将是一个类似的数组

y_true = np.array([3, 1, 2, # ... the rest of components ])

现在,要计算准确率、精确度和召回率,您需要比较y_truey_pred如果它们一致,恭喜:这意味着您的算法在您的评估集上完美运行!一般来说,虽然不是所有的组件y_pred都会与y_true. 要量化一致性/差异,您可以使用准确度、精度等指标。您可以自己编写代码,但 scikit-learn 库为此目的提供了函数。

例如,您可以轻松计算准确率精确度、召回率和 F1 分数,甚至是代码问题 的混淆矩阵

from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# print accuracy
print("Accuracy: ", accuracy_score(y_true, y_pred))

# print precision, recall, F1-score per each class/tag
print(classification_report(y_true, y_pred))

# print confusion matrix, check documentation for sorting rows/columns
print(confusion_matrix(y_true, y_pred))

PS请注意,在我所做的事情中,我没有使用您的y_pred_one_hot(这不是混淆矩阵!),并且精度为零(可能是,但您必须使用 来计算它y_true)!

PS 当心使用predict_proba朴素贝叶斯作为输出概率可能无法校准