【Pytorch学习笔记】9.分类器的分类结果如何评估——使用混淆矩阵、F1-score、ROC曲线、PR曲线等(以Softmax二分类为例)

我们训练完一个分类模型后,会在测试(验证)集检验模型的性能,涉及到一些模型的评估指标。如:准确率(Accuracy)、混淆矩阵(confusion matrix)、F1-score、ROC曲线、PR曲线等。

我以Softmax回归二分类模型为例,展示一下如何展示模型性能的评估指标,并稍作解读。
需要使用到pandas、scikit-learn、matplotlib库。

分类器的输出结果长什么样子(Softmax为例)

一般我们用测试集的特征数据传给训练好的模型net:
pred_y = net(valid_features_X).detach()
pred_y会长这个样子:
在这里插入图片描述
这是个二分类数据,输出的二维向量分别对应了线性层的输出值,代表了两个类别的输出,注意这个输出值 o 1 、 o 2 o_1、o_2 o1o2并没有对其求softmax。

因为softmax函数的单调性不变,这个时候对输出 o o o 比较大小就可以判断出应分为哪一类。

softmax忘了怎么回事的可以复习一下下面这张图:
在这里插入图片描述

上图中,输出的 y y y便是对 o o o求softmax后得到的预测概率。
但是如果我们仅作分类预测,比较 o 1 、 o 2 、 o 3 o_1、o_2、o_3 o1o2o3三个值的大小就行了,不用特地求softmax,因为softmax不改变单调性。

1 混淆矩阵

混淆矩阵包含了模型对一个数据集预测结果的综合信息,包含了 真阳TP、假阳FP、假阴FN、真阴TN 4个值,4个值可组合成各种常见的评估指标。
混淆矩阵与常见指标 例图:
在这里插入图片描述

准备数据

要画混淆矩阵,需要的数据为 正确的结果 和 预测的结果。

预测的结果:
我们先对pred_y求argmax即可获得y的类别(设0为负类,1为正类)
pred_y = pred_y.argmax(dim=1)
在这里插入图片描述正确的结果:valid_features_y
在这里插入图片描述

绘制

使用pandas的crosstab方法即可绘制,直接把两个tensor传进去:
在这里插入图片描述


我们可以将pandas的DataFrame的列传进去,这样分类就比较清晰:
在这里插入图片描述

2 F1-score

F1-scores是precision(查准率)和recall(查全率、敏感性)的调和平均数,可反映小类(少数类)的预测性能,常用于类别不平衡样本的模型预测性能的评估。
在这里插入图片描述
代码:

from sklearn.metrics import f1_score

# 计算 F1 score
report = f1_score(valid_features_y, pred_y)
print(report)

>>> 0.5319148936170213

3 统计综合分类指标(precision、recall等)

我们还可以统计一下分类器的综合指标。
统计的时候,classification_report函数还需要指定一下标签的0、1代表阴性和阳性。

from sklearn.metrics import classification_report

# 统计该模型各个指标
report = classification_report(valid_features_y, pred_y, labels=[0, 1], target_names=['阴性', '阳性'])
print(report)

>>>
              precision    recall  f1-score   support

          阴性       0.99      0.91      0.95       460
          阳性       0.38      0.89      0.53        28

    accuracy                           0.91       488
   macro avg       0.69      0.90      0.74       488
weighted avg       0.96      0.91      0.93       488

解读一下:
因为precision(查准率)和recall(查全率)是对于一个指定类别来说的,所以严格来讲阴性和阳性都会有一个precision、recall和对应的f1-score。但由于这是一个类别不平衡数据,阴性占比很大,所以阴性的数据没有多大研究意义。
我们一般研究小类的分类性能,所以就看阳性这一行的precision、recall、f1-score就行了。

maro avg和weighted avg是上面两个类别的数据对应求平均值。
macro avg是算术平均值,weighted avg是权重平均值(两个值各自乘以自身类别数量的占比,再相加)。

4 ROC曲线

ROC曲线表示了模型的综合分类性能,包括正类和负类。
我们也常用曲线下面积(AUC-ROC)来衡量ROC曲线的质量。

准备数据

但是绘制ROC曲线就需要传入输出类别的预测概率了。
获得0、1两类的预测概率就需要对输出求softmax,得到的就是两个类别各自的概率。
我们只需要正类的概率。代码就是pred_y_softmax = torch.softmax(pred_y_output, dim=1).numpy()[:,1]

绘制

from sklearn.metrics import roc_curve
from sklearn.metrics import auc

# 给出正类的概率
pred_y_output = net(valid_features_X).detach()
pred_y_softmax = torch.softmax(pred_y_output, dim=1).numpy()[:,1]

# 绘制ROC曲线,计算AUC
fpr, tpr, thresholds_roc = roc_curve(valid_features_y, pred_y_softmax, pos_label=1)
plt.plot(fpr,tpr,marker = '.')
plt.show()

AUC = auc(fpr, tpr)
print(AUC)

>>>

在这里插入图片描述

5 PR曲线

PR曲线和 F1-score 一样,是对类别不平衡数据的少数类的分类性能的评估指标。
和ROC曲线一样,需要传入预测概率。

from sklearn.metrics import precision_recall_curve

precision, recall, thresholds_pr = precision_recall_curve(valid_features_y, pred_y_softmax)

plt.plot(precision, recall, marker = '.')
plt.show()

在这里插入图片描述

本节代码

可参考我的Github

  • 4
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 以下是使用PyTorch计算F1-score的代码示例: ```python import torch def f1_score(y_true, y_pred): """ 计算F1-score :param y_true: 真实标签 :param y_pred: 预测标签 :return: F1-score """ y_true = torch.Tensor(y_true) y_pred = torch.Tensor(y_pred) tp = torch.sum(y_true * y_pred) fp = torch.sum((1 - y_true) * y_pred) fn = torch.sum(y_true * (1 - y_pred)) precision = tp / (tp + fp + 1e-10) recall = tp / (tp + fn + 1e-10) f1 = 2 * precision * recall / (precision + recall + 1e-10) return f1.item() ``` 其中,y_true和y_pred分别是真实标签和预测标签,可以是任意形状的张量。在函数中,我们首先将它们转换为PyTorch张量。然后,我们计算真正例(tp)、假正例(fp)和假负例(fn)的数量,以便计算精度(precision)、召回率(recall)和F1-score。最后,我们使用.item()方法将F1-score从张量中提取出来并返回。 ### 回答2: F1-score评估分类模型效果的指标之一,它综合了模型的精确度和召回率。在PyTorch中,计算F1-score需要从以下两个方面进行考虑:模型的预测和真实标签的比对,以及对预测结果的阈值的调整。 首先,模型的预测和真实标签的比对是F1-score计算的基础。这可以通过使用PyTorch的torch.argmax函数来实现。假设模型的输出是一个张量,包含每个样本的概率分布。可以使用torch.argmax函数获取每个样本的预测类别,然后和真实标签进行比较,得到分类的预测结果,在此基础上进一步计算模型的精确度和召回率。 接下来,对预测结果的阈值的调整是提高F1-score的关键,因为不同的阈值会对模型的表现产生不同的影响。一般来说,当模型对某个类别的预测概率大于某个阈值时,就会将该样本归为该类别。这个阈值可以通过调整模型的决策边界或者设置一个额外的参数来实现。在PyTorch中,可以通过自定义一个损失函数来实现F1-score的计算,该损失函数可以设置一个阈值参数,并根据该参数进行阈值的调整,使得F1-score最大化。 总之,计算F1-score需要从模型的预测和真实标签的比对以及对预测结果的阈值的调整两个方面进行考虑。在PyTorch中,可以通过使用torch.argmax函数获取每个样本的预测类别,并自定义一个损失函数以实现对预测结果的阈值的调整,从而计算出模型的F1-score指标。 ### 回答3: F1 分数是评估二分类模型性能的一种常用指标。它同时考虑了模型的查准率 (Precision) 和查全率 (Recall),具有很好的平衡性,因此可以更全面地反映模型的性能。在 PyTorch 中,我们可以通过以下代码计算 F1 分数: ```python from sklearn.metrics import f1_score # 预测值和真实值分别存储在 y_pred 和 y_true 中 y_pred = model(x_test) y_pred = (y_pred > 0.5).float() # 将概率值转换成二分类标签 y_pred = y_pred.cpu().numpy().squeeze() y_true = y_test.cpu().numpy().squeeze() # 计算 F1 分数 f1 = f1_score(y_true, y_pred) ``` 在上述代码中,首先需要导入 `sklearn.metrics` 库中的 f1_score 函数。接下来,我们需要将模型的预测值和真实值分别存储在 y_pred 和 y_true 中。在二分类任务中,我们通常需要将模型的输出概率值转换成二分类标签。因此,我们使用 `(y_pred > 0.5).float()` 将概率值大于 0.5 的标记为 1,否则标记为 0。最后,我们将 y_pred 和 y_true 转换成 numpy 数组,并使用 f1_score 函数计算 F1 分数。 需要注意的是,不同的 F1 分数实现方式可能会存在一些差异,因此在使用时需要根据具体应用场景进行选择。在实际应用中,我们还需要注意评估指标的合理性和模型的泛化能力,避免模型过拟合或欠拟合等问题,提高模型的稳定性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值