【深度学习】计算分类模型的分类指标,计算accuracy_top-1、accuracy_top-5、precision、recall和f1_score

2023-05-16

在这里插入图片描述

计算accuracy_top-1、accuracy_top-5、precision、recall和f1_score:

(1)accuracy_top-1
np.sum(np.argmax(preds, axis=1) == np.argmax(actual, axis=1)) / actual.shape[0]
accuracy_top-1指标是假设预测数据中,最大值的index就是预测出来的样本类别,从而看一下总共预测正确了多少个样本,再除以总数量即是accuracy_top-1指标。

(2)accuracy_top-5
np.sum(np.argsort(preds, axis=1)[:, -1:-5:-1] == np.argmax(actual, axis=1).reshape(-1, 1)) / actual.shape[0]
和accuracy_top-1类似,也是先将预测出的多个概率值排序,但取最大的五个的index,只要有一个index能对上真实的label,那就是预测准确。预测正确的样本数再除以总数量即是accuracy_top-1指标。
有个风险是,有时候类别数量小于5,这样怎么算accuracy_top-5的数值都会是100%。

(3)precision、recall、f1_score
这都是在引入threshold 数值之后才能计算的。
precision = tp / (tp + fp) # 预测正确数量/所有的预测数量
recall = tp / (tp + fn) # 预测正确数量/所有的实际数量
f1_score = 2 * precision * recall / (precision + recall)

“所有的预测数量” 和 “所有的实际数量” 都不是我们的总样本数量,当一个样本输入模型,模型的结果中,如果几个类别的预测值都小于预测值,那么这个样本就不会纳入到这里“precision、recall或f1_score”的计算。

那么Why? 因为我们是在评估模型的方面的指标,评估模型的指标就是这样计算。而总样本数量不会影响模型的指标,但是会影响模型的泛化性能。

下面的程序中,构建好实际labels和预测preds,即可计算出所有指标:

import numpy as np

n_samples = 10000  # 假设总样本个数
cls_n = 6  # 假设模型类别个数
threshold = 0.5   # 阈值


# n_samples行,6列,每一行只有一个数字是1
actual = np.zeros((n_samples, cls_n))
actual[np.arange(n_samples), np.random.randint(0, cls_n, n_samples)] = 1

# 7个样本是7行, 6个类别是6列
# 高斯分布
preds = np.random.randn(n_samples, cls_n)
sums = preds.sum(axis=1)  # 求每行的和
preds /= sums[:, None]  # 每行除以自己的和

# 计算accuracy_top-1
top1_acc = np.sum(np.argmax(preds, axis=1) == np.argmax(actual, axis=1)) / actual.shape[0]
print("accuracy_top-1", top1_acc)

# 计算accuracy_top-5
top5_acc = np.sum(np.argsort(preds, axis=1)[:, -1:-5:-1] == np.argmax(actual, axis=1).reshape(-1, 1)) / actual.shape[0]
print("accuracy_top-5", top5_acc)

# 计算各个类别precision, recall和f1 score
for i in range(actual.shape[1]):
    tp = np.sum(np.logical_and(preds[:, i] >= threshold, actual[:, i] == 1))
    fp = np.sum(np.logical_and(preds[:, i] >= threshold, actual[:, i] == 0))
    fn = np.sum(np.logical_and(preds[:, i] < threshold, actual[:, i] == 1))
    if tp == 0 or tp + fp == 0:
        precision = 0
    else:
        precision = tp / (tp + fp)  # 预测正确数量/所有的预测数量
    if tp == 0 or tp + fn == 0:
        recall = 0
    else:
        recall = tp / (tp + fn)  # 预测正确数量/所有的实际数量
    if precision + recall == 0:
        f1_score = 0
    else:
        f1_score = 2 * precision * recall / (precision + recall)
    print("class", i, "precision", round(precision, 4), "recall", round(recall, 4), "f1_score", round(f1_score, 4))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【深度学习】计算分类模型的分类指标,计算accuracy_top-1、accuracy_top-5、precision、recall和f1_score 的相关文章

  • 单精度浮点无法表示的最小整数

    所以我知道单精度浮点不能表示的最小正整数是2 23 1 1 16 777 217 我们如何知道我们使用 2 23 1 1 我知道有一个隐含的 1 而 23 是尾数中表示的位数 但为什么会这样呢 我们怎么知道我们使用 2 23 1 1 IEE
  • 使用 .* 宽度说明符调用 sprintf 时出现奇怪警告

    对于以下代码 https godbolt org z WcGf9hEs3 https godbolt org z WcGf9hEs3 include
  • seq 和 == 运算符的神秘行为。精度问题?

    我遇到了该函数的某种奇怪 或只是出乎意料 的行为seq 创建简单序列时 某些值无法与 运算符正确匹配 看这个最小的例子 my seq lt seq 0 0 4 len 5 table my seq ok returns 0 0 1 0 2
  • 在 Mathematica 中写入文件时格式化数字

    这是一个延续this https stackoverflow com q 4943706 181759关于数字格式的问题 与我之前的相关question https stackoverflow com q 1687705 181759关于获
  • iOS 中 UITouch 时间戳的精度是多少?

    iOS 中 UITouch 类的时间戳属性有多精确 毫秒 几十毫秒 我正在将 iPad 的内部测量值与贴在屏幕上的自定义触摸检测电路进行比较 发现两者之间存在相当大的差异 标准偏差约 15 毫秒 我已经看到它建议时间戳根据帧刷新间隔进行离散
  • “可能会损失精度”是 Java 发疯了还是我遗漏了一些东西?

    AFAIK 当我不应该出现 精度损失 错误时 我却收到了 精度损失 错误 这是一个实例变量 byte move 0 这发生在此类的方法中 this move this move lt lt 4 byte Guy moven indexOf
  • Chrome 中的 Math.log2 精度已更改

    我编写了一个 JavaScript 程序 它根据元素的数量计算二叉树的深度 我的程序几个月来一直运行良好 但最近我发现在 Chrome 和 Firefox 中查看网页时存在差异 特别是在 Firefox 上 Math log2 8 3 但现
  • Jooq 将 String 转换为 BigDecimal

    有没有办法在 jooq 查询中将 String 转换为 BigDecimal 而不丢失精度 当我做endResER VALUE cast BigDecimal class where VALUE是数据库中具有字符串值的字段 它返回不带任何小
  • Java 精确计算 - 使用选项

    我试图对 JAVA SQL 中精确计算的选项进行一些简洁的概述 到目前为止 我找到了以下选项 使用双打 接受他们的缺点 不行 use BigDecimals 在复杂的公式中使用它们对我来说是有问题的 use String format De
  • Python“decimal”包给出错误的结果

    我尝试通过设置来计算以下内容getcontext prec 800 gt gt gt from decimal import gt gt gt getcontext prec 800 gt gt gt Decimal 22 0 Decima
  • ValueError:cross_val_predict仅适用于分区

    我有一个包含特征数组 X 和因变量数组 y 的多类分类问题 y 有四个类 1 2 3 和 4 数据严重不平衡 第 4 类只有少数观察结果 我选择的分类器模型为 model RandomForestClassifier n estimator
  • 在matlab中设置图例符号的精度

    我有这个 leg2 strcat Max Degree num2str adet 1 1 ch l leg3 strcat Min Degree num2str adet 1 2 ch l leg4 strcat Max Request n
  • 在java中以一定精度显示双精度数

    我目前正在编写一个计算器应用程序 我知道双精度数并不是良好数学的最佳选择 应用程序中的大多数函数都具有很高的精度 但有些函数不会得到非常难看的结果 我的解决方案是只向用户显示 12 位小数的精度 我选择 12 是因为我的最低精度来自我的数值
  • Keras 服装回调。生成精确召回时,我在 _flow_index 中收到错误

    我正在使用 Keras 训练二元分类器 我想在每个时期后生成 precision score 和 recall score 以便更深入地分析训练 在互联网上我找到了教程 帮助 例如 https medium com thongonary h
  • Java 和 SQL Server 中的精度噩梦

    我一直在与 Java 和 SQL Server 中的精确噩梦作斗争 直到我不再知道了 就我个人而言 我理解这个问题及其根本原因 但向地球另一端的客户解释这一点是不可行的 至少对我来说 情况是这样的 我在 SQL Server 中有两列 Qt
  • scala.math.BigDecimal :1.2 和 1.20 相等

    将 Double 或 String 转换为 scala math BigDecimal 时如何保持精度和尾随零 用例 在 JSON 消息中 属性的类型为 String 值为 1 20 但是在 Scala 中读取这个属性并将其转换为 BigD
  • GLSL 中统一浮点行为和常量浮点行为的不同

    我正在尝试在 GLSL 中实现模拟双精度 并且观察到一种奇怪的行为差异 导致 GLSL 中出现细微的浮点错误 考虑以下片段着色器 写入 4 浮点纹理以打印输出 layout location 0 out vec4 Output unifor
  • 这些双精度值如何精确到小数点后 20 位?

    当精度是一个问题时 我正在测试一些非常简单的等价错误 并希望以扩展双精度执行操作 这样我就知道答案在 19位数字中 然后以双精度执行相同的操作 其中第 16 位会有舍入误差 但不知何故 我的双精度算术保持了 19 位精度 当我在扩展双精度中
  • python中计算最小范数解或从伪逆得到的解最准确的方法是什么?

    我的目标是解决 Kc y 与伪逆 即最小范数解 c K y 这样模型 希望 是高次多项式模型f x sum i c i x i 我对不确定的情况特别感兴趣 在这种情况下 我们拥有比数据更多的多项式特征 方程很少 变量 未知数太多 colum
  • 16 位、32 位和 64 位 IEEE-754 系统可以表示什么范围的数字?

    我对浮点数的表示方式有所了解 但恐怕还不够 一般问题是 对于给定的精度 就我的目的而言 以 10 为基数的精确小数位数 16 位 32 位和 64 位 IEEE 754 系统可以表示什么范围的数字 具体来说 我只对精确到 0 5 个位 或

随机推荐