理解准确率(accuracy)、精度(precision)、查全率(recall)、F1

本文详细解释了在二分类问题中,Precision(查准率)、Recall(查全率)及F1值的概念及其计算方式,并通过实例帮助读者理解这些指标在评估机器学习模型性能时的重要作用。

Precision又叫查准率,Recall又叫查全率。这两个指标共同衡量才能评价模型输出结果。

TP, TN, FP, FN的定义

在二分类问题中。

Real=1Real=0
Predict=1TP
Predict=0FN
  • TP: 预测为1(Positive),实际也为1(Truth-预测对了)
  • TN: 预测为0(Negative),实际也为0(Truth-预测对了)
  • FP: 预测为1(Positive),实际为0(False-预测错了)
  • FN: 预测为0(Negative),实际为1(False-预测错了)

总的样本个数为:TP+TN+FP+FN。

Accuracy/Precision/Recall的定义

Accuracy = (预测正确的样本数)/(总样本数)=(TP+TN)/(TP+TN+FP+FN)

Precision = (预测为1且正确预测的样本数)/(所有预测为1的样本数) = TP/(TP+FP)

Recall = (预测为1且正确预测的样本数)/(所有真实情况为1的样本数) = TP/(TP+FN)

如何理解Precision/Recall

假设100癌症训练集中,只有1例为癌症。如果模型永远预测y=0,则模型的Precision=99/100,很高。但Recall=0/1=0,非常低。
所以单纯用Precision来评价模型是不完整的,评价模型时必须用Precision/Recall两个值。

如何理解F1

假设我们得到了模型的Precision/Recall如下

PrecisionRecall
Algorithm10.5
Algorithm20.7
Algorithm30.02

但由于Precision/Recall是两个值,无法根据两个值来对比模型的好坏。有没有一个值能综合Precision/Recall呢?有,它就是F1。

F1 = 2*(Precision*Recall)/(Precision+Recall)

AlgorithmF1
Algorithm10.444
Algorithm20.175
Algorithm30.039

只有一个值,就好做模型对比了,这里我们根据F1可以发现Algorithm1是三者中最优的。

分类阈值对Precision/Recall的影响

做二值分类时,我们认为,若h(x)>=0.5,则predict=1;若h(x)<0.5,则predict=0。这里0.5就是分类阈值。

增加阈值,我们会对预测值更有信心,即增加了查准率。但这样会降低查全率。(High Precision, Low Recall)
减小阈值,则模型放过的真例就变少,查全率就增加。(Low Precision, High Recall)

        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>

转载:https://blog.youkuaiyun.com/ybdesire/article/details/53613628

<think> 我们正在使用PyTorch的扩展库torchmetrics来计算分类模型的评估指标。torchmetrics提供了许多预定义的指标,包括准确率(Accuracy)、查准率(Precision)、查全率(Recall)和F1分数(F1 Score)。 根据用户需求,我们需要计算二分类或多分类模型的这些指标。torchmetrics中的指标可以处理这两种情况。 使用步骤: 1. 安装torchmetrics(如果尚未安装):`pip install torchmetrics` 2. 导入所需的指标类:`Accuracy`, `Precision`, `Recall`, `F1Score` 3. 根据任务类型(二分类、多分类或多标签)初始化指标。注意,torchmetrics中的指标需要指定任务类型(如'binary', 'multiclass', 'multilabel')以及相应的参数(如分类的类别数`num_classes`)。 对于二分类问题,通常将正类视为类别1,负类视为类别0。我们可以设置`task='binary'`。 对于多分类问题,设置`task='multiclass'`并指定`num_classes`。 此外,还需要注意指标的参数,例如`average`方法(如'micro', 'macro', 'weighted'等)。 示例代码(以二分类为例): - 假设我们有一个二分类任务。 - 模型输出的是logits或预测概率,我们通常先通过sigmoid(二分类)或softmax(多分类)得到概率,然后取阈值(如0.5)得到预测标签。 注意:torchmetrics的指标会累积多个批次的状态,然后在需要时计算最终结果(使用`.compute()`方法)。也可以在每次计算后使用`.reset()`重置状态。 下面我们分别展示二分类和多分类的例子。 二分类示例: """ import torch from torchmetrics import Accuracy, Precision, Recall, F1Score # 初始化指标,二分类任务 accuracy = Accuracy(task='binary') precision = Precision(task='binary') recall = Recall(task='binary') f1 = F1Score(task='binary') # 模拟数据:假设我们有10个样本的二分类问题 logits = torch.randn(10, 2) # 模型输出的logits,10个样本,2个类别 preds = torch.argmax(logits, dim=1) # 预测类别(0或1) target = torch.randint(0, 2, (10,)) # 真实标签 # 更新指标状态 accuracy.update(preds, target) precision.update(preds, target) recall.update(preds, target) f1.update(preds, target) # 计算最终结果 acc = accuracy.compute() prec = precision.compute() rec = recall.compute() f1_score = f1.compute() print(f"Accuracy: {acc:.4f}, Precision: {prec:.4f}, Recall: {rec:.4f}, F1: {f1_score:.4f}") # 重置指标状态,以便下次使用 accuracy.reset() precision.reset() recall.reset() f1.reset() """ 多分类示例(假设有5个类别):""" # 初始化指标,多分类任务,5个类别 num_classes = 5 accuracy = Accuracy(task='multiclass', num_classes=num_classes) precision = Precision(task='multiclass', num_classes=num_classes, average='macro') recall = Recall(task='multiclass', num_classes=num_classes, average='macro') f1 = F1Score(task='multiclass', num_classes=num_classes, average='macro') # 模拟数据:10个样本,5个类别 logits = torch.randn(10, num_classes) preds = torch.argmax(logits, dim=1) target = torch.randint(0, num_classes, (10,)) # 更新指标状态 accuracy.update(preds, target) precision.update(preds, target) recall.update(preds, target) f1.update(preds, target) # 计算最终结果 acc = accuracy.compute() prec = precision.compute() rec = recall.compute() f1_score = f1.compute() print(f"Accuracy: {acc:.4f}, Precision: {prec:.4f}, Recall: {rec:.4f}, F1: {f1_score:.4f}") # 重置 accuracy.reset() precision.reset() recall.reset() f1.reset() """ 注意: - 在多分类任务中,我们通常需要指定`average`参数(如'macro'、'micro'、'weighted'等)来计算PrecisionRecallF1。这里我们使用了'macro'平均。 - 对于多分类的Accuracy,不需要指定average参数。 另外,torchmetrics还提供了一个便捷的方式,使用`Classification`任务模块,可以一次性计算多个指标。但这里我们分别实例化了各个指标。 对于多标签分类,任务类型应设置为`'multilabel'`,并且需要指定`num_labels`,同时注意输入需要是经过sigmoid激活后的概率,然后通过阈值(如0.5)转换为0/1的预测。 多标签示例(假设有3个标签): """ # 初始化多标签指标 num_labels = 3 accuracy = Accuracy(task='multilabel', num_labels=num_labels) precision = Precision(task='multilabel', num_labels=num_labels, average='macro') recall = Recall(task='multilabel', num_labels=num_labels, average='macro') f1 = F1Score(task='multilabel', num_labels=num_labels, average='macro') # 模拟数据:10个样本,3个标签(每个标签是二分类) logits = torch.randn(10, num_labels) # 多标签通常用sigmoid,然后取阈值0.5得到0/1 preds = (logits > 0).float() # 这里简化,实际应该用sigmoid然后与0.5比较 target = torch.randint(0, 2, (10, num_labels)).float() # 真实标签也是0/1 # 更新指标状态 accuracy.update(preds, target) precision.update(preds, target) recall.update(preds, target) f1.update(preds, target) # 计算 acc = accuracy.compute() prec = precision.compute() rec = recall.compute() f1_score = f1.compute() print(f"Accuracy: {acc:.4f}, Precision: {prec:.4f}, Recall: {rec:.4f}, F1: {f1_score:.4f}") # 重置 accuracy.reset() precision.reset() recall.reset() f1.reset() """ 总结: 使用torchmetrics计算这些指标非常方便,只需要注意根据任务类型正确初始化指标,并在训练过程中更新状态,最后在需要时计算即可。 注意:以上代码示例需要安装torchmetrics和PyTorch。 引用说明: 在模型评估中,准确率、查准率、查全率F1分数是常用指标。torchmetrics提供了这些指标的高效实现,能够自动处理GPU上的计算并支持分布式训练[^2]。 如果用户需要更详细的参数说明,可以参考torchmetrics的官方文档。 相关问题: 1. 在torchmetrics中如何为多分类任务设置不同的平均方法(如宏平均、微平均)? 2. 在训练过程中如何集成这些指标以监控模型表现? 3. torchmetrics中的指标计算在分布式训练环境下需要注意什么? </think>### 使用 TorchMetrics 计算分类指标的方法 在 PyTorch 中使用 TorchMetrics 计算查准率、查全率准确率F1 分数的步骤如下: #### 1. **安装 TorchMetrics** ```bash pip install torchmetrics ``` #### 2. **核心指标计算** ```python import torch from torchmetrics import Accuracy, Precision, Recall, F1Score # 初始化指标(二分类示例) num_classes = 2 # 类别数 accuracy = Accuracy(task="binary") # 准确率 precision = Precision(task="binary") # 查准率 recall = Recall(task="binary") # 查全率 f1 = F1Score(task="binary") # F1分数 # 模拟数据(batch_size=8) preds = torch.tensor([0.6, 0.2, 0.8, 0.4, 0.9, 0.1, 0.7, 0.3]) # 模型输出的概率值 target = torch.tensor([1, 0, 1, 0, 1, 0, 1, 0]) # 真实标签 # 计算指标 acc = accuracy(preds, target) prec = precision(preds, target) rec = recall(preds, target) f1_score = f1(preds, target) print(f"准确率: {acc:.4f}") print(f"查准率: {prec:.4f}") print(f"查全率: {rec:.4f}") print(f"F1分数: {f1_score:.4f}") ``` #### 3. **多分类任务配置** ```python # 多分类示例(5个类别) num_classes = 5 accuracy = Accuracy(task="multiclass", num_classes=num_classes) precision = Precision(task="multiclass", num_classes=num_classes, average="macro") recall = Recall(task="multiclass", num_classes=num_classes, average="macro") f1 = F1Score(task="multiclass", num_classes=num_classes, average="macro") ``` #### 4. **关键参数说明** - `task`: 任务类型 (`binary`/`multiclass`/`multilabel`) - `num_classes`: 类别数量(多分类必需) - `average`: 聚合方式(`micro`/`macro`/`weighted`) - `macro`:各类别平等加权 - `micro`:全局统计量加权 - `threshold`: 二分类阈值(默认0.5) #### 5. **指标解释** - **查准率 (Precision)**:预测为正例的样本中实际为正例的比例 $ \text{Precision} = \frac{TP}{TP+FP} $ - **查全率 (Recall)**:实际为正例的样本中被正确预测的比例 $ \text{Recall} = \frac{TP}{TP+FN} $ - **F1 分数**: 查准率和查全率的调和平均 $ F1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} $ - **准确率 (Accuracy)**:所有样本中预测正确的比例 $ \text{Accuracy} = \frac{TP+TN}{TP+TN+FP+FN} $ > **注意**:在商品推荐等场景中通常优先查准率(减少误推荐),而在医疗诊断等场景中优先查全率(减少漏诊)[^1]。 ### 最佳实践建议 1. **指标选择**:根据任务需求权衡查准率/查全率 2. **阈值调整**:通过`.threshold`参数优化二分类表现 3. **分布式训练**:使用`torchmetrics.DistributedCollection`同步多GPU结果 4. **结果持久化**:用`.compute()`获取最终结果,`.reset()`重置状态 > TorchMetrics 的指标计算已针对 GPU 加速优化,可直接集成到 PyTorch Lightning 训练流程中[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值