【深度学习】计算分类模型的分类指标,计算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 的相关文章

  • 两种不同编译器配置之间可能会损失精度

    我目前在工作中遇到一个问题 当编译器配置从调试更改为发布时 可能会导致精度损失 而编译器配置具有不同的优化级别 由于某种原因 在我们代码的其他地方 协方差矩阵 以及类似的东西 使用了非常大的值 类似于 1e90 的值 我遇到的问题是 每当计
  • R中which.max函数的容差是多少?

    基于我在这里讨论的一个问题 https stackoverflow com a 57364028 2725773 https stackoverflow com a 57364028 2725773我想知道的公差 精度是多少which ma
  • 单/多线程(OpenMP)模式下计算精度的差异

    有人可以解释 理解单 多线程模式下计算结果的不同吗 这是一个大约的例子 圆周率的计算 include
  • GMP mpf_add 失去精度。我的数字去哪儿了?

    我对两个负浮点数求和 char lhs 2234 6016114467412141 char rhs 4939600281397002 2812 根据 Perl 的说法 使用 bignum 和 Math BigFloat 答案是 49396
  • 了解从整数到浮点数的转换

    有人能解释一下 32 位机器上这个奇怪的输出吗 include
  • 为什么不使用基于二进制补码的浮点?

    float64 32 和 16 的 IEEE 754 标准使用有符号尾数和有偏差指数 作为一名设计硬件架构的学生 对我来说 对有效数和指数部分使用二进制补码更有意义 例如 定义 32 位 半精度 浮点数 第一位表示符号 接下来的 8 位 指
  • seq 和 == 运算符的神秘行为。精度问题?

    我遇到了该函数的某种奇怪 或只是出乎意料 的行为seq 创建简单序列时 某些值无法与 运算符正确匹配 看这个最小的例子 my seq lt seq 0 0 4 len 5 table my seq ok returns 0 0 1 0 2
  • 如何在 PHP 中模拟单精度浮点运算?

    我需要将一个简单的 C 程序移植到 PHP 目前我们必须启动该过程并解析其输出 程序很琐碎 但是对于算法的使用很重要float因为错误会累积起来 结果会大相径庭 C 示例 include
  • 在 C++ 中设置默认浮点打印精度

    我想在比较过程中控制双精度数的精度 然后使用 C 恢复到默认精度 我打算使用setPrecision 设置精度 那么将精度设置回默认值的语法 如果有 是什么 我正在做这样的事情 std setPrecision math log10 m F
  • 如何修复错误代码 C4146“一元减运算符应用于无符号类型。结果仍然无符号”?

    数据类型int的最小值为 2 147 483 648 所以 我输入了 int val 2147483648 但是 它有一个错误 unary minus operator applied to unsigned type result sti
  • 输出到精确的流浮点数

    我的浮点数精度有问题 int main void double b 106 829599 float a b std cerr lt lt std setprecision 6 lt lt a lt lt a lt lt b lt lt b
  • BBP 算法所需的工作精度?

    我希望在低内存环境中计算 Pi 的第 n 位数字 由于我没有可用的小数 这Python 中的纯整数 BBP 算法 http en literateprograms org Pi with the BBP formula 28Python 2
  • Python 中的舍入是如何工作的?

    我对 Python 中舍入的工作原理有点困惑 有人能解释一下为什么Python会这样吗 Example gt gt gt round 0 05 1 this makes sense 0 1 gt gt gt round 0 15 1 thi
  • 如何获得最大可能的精度? (Python - 十进制)

    我正在使用Decimal https docs python org 2 library decimal html用于需要精度的操作的类 我想使用 最大可能 的精度 我的意思是 程序运行的系统可以处理的精确度 要设置一定的精度很简单 imp
  • 如何使用“%f”将双精度值填充到具有正确精度的字符串中

    我正在尝试使用 a 来填充带有双精度值的字符串sprintf像这样 sprintf S f val 但精度被截断至小数点后六位 我需要大约 10 位小数来保证精度 如何才能做到这一点 宽度 精度 宽度应包括小数点 8 2表示8个字符宽 点前
  • C/C++ 中 pow() 函数的实现是否因平台或编译器而异?

    花了一天时间调试内置的pow 函数的输出 我的编译器和在线编译器的输出不同 那是一个很长的故事 我写了以下内容最小 完整且可验证的示例 https stackoverflow com help mcve重现情况 Code include
  • ValueError:cross_val_predict仅适用于分区

    我有一个包含特征数组 X 和因变量数组 y 的多类分类问题 y 有四个类 1 2 3 和 4 数据严重不平衡 第 4 类只有少数观察结果 我选择的分类器模型为 model RandomForestClassifier n estimator
  • IOB 准确度和精密度之间的差异

    我正在使用命名实体识别和分块器对 NLTK 进行一些工作 我使用重新训练了分类器nltk chunk named entity py为此 我采取了以下措施 ChunkParse score IOB Accuracy 96 5 Precisi
  • Math.random 生成多少熵?

    我想生成一个非常大的随机数 我不需要这个号码来保证加密安全 因此 我没有使用crypto getRandomValues https developer mozilla org en US docs Web API RandomSource
  • 在java中以一定精度显示双精度数

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

随机推荐