精华内容
下载资源
问答
  • 今天小编就为大家分享一篇Pytorch 实现计算分类器准确率(总分类及子分类),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Matlab分类准确率代码

    2018-01-12 14:43:50
    matlab实现的计算但标签分类聚类准确率的计算代码。函数包含两个参数groundtruth以及分类/聚类模型给出的预测标签向量
  • 测试svm分类器准确率

    2018-05-10 17:42:09
    加载训练好的svm分类器,以及有测试图片路径的txt文件,测试分类器准确率。注意需要自己准备训练样本,然后样本的路径参考源代码或者代码下载以后自己修改代码为自己本地样本的路径。
  • 计算硬件测试结果正确率、漏警率、虚警率和分类器准确率,需要原始图片,人工标记图片和硬件检测输出文件。 分为三个文件夹放图片,文件夹original放原始图片,文件夹manual放人工标记图片,文件夹out放硬件检测的...
  • 【深度学习】Cifar-10-探究不同的改进策略对分类准确率提高【深度学习】Cifar-10-探究不同的改进策略对分类准确率提高
  • 将要给大家介绍的评估指标有:准确率、精准率、召回率、F1、ROC曲线、AUC曲线。 机器学习评估指标大全 所有事情都需要评估好坏,尤其是量化的评估指标。 高考成绩用来评估学生的学习能力 杠铃的重量用来评估...

    2019-11-21 21:59:23

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    机器学习模型需要有量化的评估指标来评估哪些模型的效果更好。

    本文将用通俗易懂的方式讲解分类问题的混淆矩阵和各种评估指标的计算公式。将要给大家介绍的评估指标有:准确率、精准率、召回率、F1、ROC曲线、AUC曲线。

    机器学习评估指标大全

    所有事情都需要评估好坏,尤其是量化的评估指标。

    • 高考成绩用来评估学生的学习能力
    • 杠铃的重量用来评估肌肉的力量
    • 跑分用来评估手机的综合性能

    机器学习有很多评估的指标。有了这些指标我们就横向的比较哪些模型的表现更好。我们先从整体上来看看主流的评估指标都有哪些:

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    分类问题评估指标:

    1. 准确率 – Accuracy
    2. 精确率(差准率)- Precision
    3. 召回率(查全率)- Recall
    4. F1分数
    5. ROC曲线
    6. AUC曲线

    回归问题评估指标:

    1. MAE
    2. MSE

    分类问题图解

    为了方便大家理解各项指标的计算方式,我们用具体的例子将分类问题进行图解,帮助大家快速理解分类中出现的各种情况。

    举个例子:

    我们有10张照片,5张男性、5张女性。如下图:

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    有一个判断性别的机器学习模型,当我们使用它来判断「是否为男性」时,会出现4种情况。如下图:

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    1. 实际为男性,且判断为男性(正确)
    2. 实际为男性,但判断为女性(错误)
    3. 实际为女性,且判断为女性(正确)
    4. 实际为女性,但判断为男性(错误)

    这4种情况构成了经典的混淆矩阵,如下图:

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    TP – True Positive:实际为男性,且判断为男性(正确)

    FN – False Negative:实际为男性,但判断为女性(错误)

    TN – True Negative:实际为女性,且判断为女性(正确)

    FP – False Positive:实际为女性,但判断为男性(错误)

    这4个名词初看起来比较晕(尤其是缩写),但是当我们把英文拆分时就很容易理解了,如下图:

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    所有的评估指标都是围绕上面4种情况来计算的,所以理解上面4种情况是基础!

    分类评估指标详解

    下面详细介绍一下分类分为种的各种评估指标详情和计算公式:

    准确率 – Accuracy

    预测正确的结果占总样本的百分比,公式如下:

    准确率 =(TP+TN)/(TP+TN+FP+FN)

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    虽然准确率可以判断总的正确率,但是在样本不平衡 的情况下,并不能作为很好的指标来衡量结果。举个简单的例子,比如在一个总样本中,正样本占 90%,负样本占 10%,样本是严重不平衡的。对于这种情况,我们只需要将全部样本预测为正样本即可得到 90% 的高准确率,但实际上我们并没有很用心的分类,只是随便无脑一分而已。这就说明了:由于样本不平衡的问题,导致了得到的高准确率结果含有很大的水分。即如果样本不平衡,准确率就会失效。

    精确率(差准率)- Precision

    所有被预测为正的样本中实际为正的样本的概率,公式如下:

    精准率 =TP/(TP+FP)

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    精准率和准确率看上去有些类似,但是完全不同的两个概念。精准率代表对正样本结果中的预测准确程度,而准确率则代表整体的预测准确程度,既包括正样本,也包括负样本。

    召回率(查全率)- Recall

    实际为正的样本中被预测为正样本的概率,其公式如下:

    召回率=TP/(TP+FN)

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    召回率的应用场景: 比如拿网贷违约率为例,相对好用户,我们更关心坏用户,不能错放过任何一个坏用户。因为如果我们过多的将坏用户当成好用户,这样后续可能发生的违约金额会远超过好用户偿还的借贷利息金额,造成严重偿失。召回率越高,代表实际坏用户被预测出来的概率越高,它的含义类似:宁可错杀一千,绝不放过一个。

    F1分数

    如果我们把精确率(Precision)和召回率(Recall)之间的关系用图来表达,就是下面的PR曲线:

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    可以发现他们俩的关系是「两难全」的关系。为了综合两者的表现,在两者之间找一个平衡点,就出现了一个 F1分数。

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

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    ROC曲线、AUC曲线

    ROC 和 AUC 是2个更加复杂的评估指标,下面这篇文章已经很详细的解释了,这里直接引用这篇文章的部分内容。

    上面的指标说明也是出自这篇文章:《一文让你彻底理解准确率,精准率,召回率,真正率,假正率,ROC/AUC》

    1. 灵敏度,特异度,真正率,假正率

    在正式介绍 ROC/AUC 之前,我们还要再介绍两个指标,这两个指标的选择也正是 ROC 和 AUC 可以无视样本不平衡的原因。 这两个指标分别是:灵敏度和(1- 特异度),也叫做真正率(TPR)和假正率(FPR)。

    灵敏度(Sensitivity) = TP/(TP+FN)

    特异度(Specificity) = TN/(FP+TN)

    • 其实我们可以发现灵敏度和召回率是一模一样的,只是名字换了而已。
    • 由于我们比较关心正样本,所以需要查看有多少负样本被错误地预测为正样本,所以使用(1- 特异度),而不是特异度。

    真正率(TPR) = 灵敏度 = TP/(TP+FN)

    假正率(FPR) = 1- 特异度 = FP/(FP+TN)

    下面是真正率和假正率的示意,我们发现TPR 和 FPR 分别是基于实际表现 1 和 0 出发的,也就是说它们分别在实际的正样本和负样本中来观察相关概率问题。 正因为如此,所以无论样本是否平衡,都不会被影响。还是拿之前的例子,总样本中,90% 是正样本,10% 是负样本。我们知道用准确率是有水分的,但是用 TPR 和 FPR 不一样。这里,TPR 只关注 90% 正样本中有多少是被真正覆盖的,而与那 10% 毫无关系,同理,FPR 只关注 10% 负样本中有多少是被错误覆盖的,也与那 90% 毫无关系,所以可以看出:如果我们从实际表现的各个结果角度出发,就可以避免样本不平衡的问题了,这也是为什么选用 TPR 和 FPR 作为 ROC/AUC 的指标的原因。

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    或者我们也可以从另一个角度考虑:条件概率。 我们假设X为预测值,Y为真实值。那么就可以将这些指标按条件概率表示:

    精准率 = P(Y=1 | X=1)

    召回率 = 灵敏度 = P(X=1 | Y=1)

    特异度 = P(X=0 | Y=0)

    从上面三个公式看到:如果我们先以实际结果为条件(召回率,特异度),那么就只需考虑一种样本,而先以预测值为条件(精准率),那么我们需要同时考虑正样本和负样本。所以先以实际结果为条件的指标都不受样本不平衡的影响,相反以预测结果为条件的就会受到影响。

    2. ROC(接受者操作特征曲线)

    ROC(Receiver Operating Characteristic)曲线,又称接受者操作特征曲线。该曲线最早应用于雷达信号检测领域,用于区分信号与噪声。后来人们将其用于评价模型的预测能力,ROC 曲线是基于混淆矩阵得出的。

    ROC 曲线中的主要两个指标就是真正率假正率, 上面也解释了这么选择的好处所在。其中横坐标为假正率(FPR),纵坐标为真正率(TPR),下面就是一个标准的 ROC 曲线图。

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    ROC 曲线的阈值问题

    与前面的 P-R 曲线类似,ROC 曲线也是通过遍历所有阈值 来绘制整条曲线的。如果我们不断的遍历所有阈值,预测的正样本和负样本是在不断变化的,相应的在 ROC 曲线图中也会沿着曲线滑动。

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    如何判断 ROC 曲线的好坏?

    改变阈值只是不断地改变预测的正负样本数,即 TPR 和 FPR,但是曲线本身是不会变的。那么如何判断一个模型的 ROC 曲线是好的呢?这个还是要回归到我们的目的:FPR 表示模型虚报的响应程度,而 TPR 表示模型预测响应的覆盖程度。我们所希望的当然是:虚报的越少越好,覆盖的越多越好。所以总结一下就是TPR 越高,同时 FPR 越低(即 ROC 曲线越陡),那么模型的性能就越好。 参考如下:

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    ROC 曲线无视样本不平衡

    前面已经对 ROC 曲线为什么可以无视样本不平衡做了解释,下面我们用动态图的形式再次展示一下它是如何工作的。我们发现:无论红蓝色样本比例如何改变,ROC 曲线都没有影响。

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

     

    3. AUC(曲线下的面积)

    为了计算 ROC 曲线上的点,我们可以使用不同的分类阈值多次评估逻辑回归模型,但这样做效率非常低。幸运的是,有一种基于排序的高效算法可以为我们提供此类信息,这种算法称为曲线下面积(Area Under Curve)

    比较有意思的是,如果我们连接对角线,它的面积正好是 0.5。对角线的实际含义是:随机判断响应与不响应,正负样本覆盖率应该都是 50%,表示随机效果。 ROC 曲线越陡越好,所以理想值就是 1,一个正方形,而最差的随机判断都有 0.5,所以一般 AUC 的值是介于 0.5 到 1 之间的。

    AUC 的一般判断标准

    0.5 – 0.7: 效果较低,但用于预测股票已经很不错了

    0.7 – 0.85: 效果一般

    0.85 – 0.95: 效果很好

    0.95 – 1: 效果非常好,但一般不太可能

    AUC 的物理意义

    曲线下面积对所有可能的分类阈值的效果进行综合衡量。曲线下面积的一种解读方式是看作模型将某个随机正类别样本排列在某个随机负类别样本之上的概率。以下面的样本为例,逻辑回归预测从左到右以升序排列:

    一文看懂分类模型的评估指标:准确率、精准率、召回率、F1等

    展开全文
  • 求聚类准确率的程序,

    热门讨论 2011-04-05 09:57:53
    求聚类准确率的程序,在数据挖掘中常用的一个程序。
  • 准确率与召回率

    万次阅读 2018-10-03 11:53:21
    1、两个最常见的衡量指标是“准确率(precision)”(你给出的结果有多少是正确的)和“召回率(recall)”(正确的结果有多少被你给出了) 这两个通常是此消彼长的(trade off),很难兼得。很多时候用参数来控制...

    1、两个最常见的衡量指标是“准确率(precision)”(你给出的结果有多少是正确的)和“召回率(recall)”(正确的结果有多少被你给出了)

           这两个通常是此消彼长的(trade off),很难兼得。很多时候用参数来控制,通过修改参数则能得出一个准确率和召回率的曲线(ROC),这条曲线与x和y轴围成的面积就是AUC(ROC  Area)。AUC可以综合衡量一个预测模型的好坏,这一个指标综合了precision和recall两个指标。

    但AUC计算很麻烦,有人用简单的F-score来代替。F-score计算方法很简单:

    F-score = (2*precision*recall) / (precision+recall)

    即使不是算数平均,也不是几何平均。可以理解为几何平均的平方除以算术平均。

    不妨举这样一个例子:某池塘有1400条鲤鱼,300只虾,300只鳖。现在以捕鲤鱼为目的。撒一大网,逮着了700条鲤鱼,200只虾,100只鳖。那么,这些指标分别如下:

    准确率 = 700 / (700 + 200 + 100) = 70%

    召回率 = 700 / 1400 = 50%

    F值 = 70% * 50% * 2 / (70% + 50%) = 58.3%

    不妨看看如果把池子里的所有的鲤鱼、虾和鳖都一网打尽,这些指标又有何变化:

    准确率 = 1400 / (1400 + 300 + 300) = 70%

    召回率 = 1400 / 1400 = 100%

    F值 = 70% * 100% * 2 / (70% + 100%) = 82.35%        

    由此可见,准确率是评估捕获的成果中目标成果所占得比例;召回率,顾名思义,就是从关注领域中,召回目标类别的比例;而F值,则是综合这二者指标的评估指标,用于综合反映整体的指标。

           当然希望检索结果Precision越高越好,同时Recall也越高越好,但事实上这两者在某些情况下有矛盾的。比如极端情况下,我们只搜索出了一个结果,且是准确的,那么Precision就是100%,但是Recall就很低;而如果我们把所有结果都返回,那么比如Recall是100%,但是Precision就会很低。因此在不同的场合中需要自己判断希望Precision比较高或是Recall比较高。如果是做实验研究,可以绘制Precision-Recall曲线来帮助分析。

    2、综合评价指标(F-Measure)

    P和R指标有时候会出现的矛盾的情况,这样就需要综合考虑他们,最常见的方法就是F-Measure(又称为F-Score)。

    F-Measure是Precision和Recall加权调和平均

    当参数α=1时,就是最常见的F1,也即

    可知F1综合了P和R的结果,当F1较高时则能说明试验方法比较有效。

    3、E值

    E值表示查准率P和查全率R的加权平均值,当其中一个为0时,E值为1,其计算公式:

    b越大,表示查准率的权重越大。

    展开全文
  • 目录混淆矩阵准确率精确率召回率P-R曲线F1 score参考资料 分类是机器学习中比较常见的任务,对于分类任务常见的评价指标有准确率(Accuracy)、精确率(...

    原文


    分类是机器学习中比较常见的任务,对于分类任务常见的评价指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1 score、ROC曲线(Receiver Operating Characteristic Curve)等。
    这篇文章将结合sklearn对准确率、精确率、召回率、F1 score进行讲解,ROC曲线可以参考我的这篇文章: sklearn ROC曲线使用

    混淆矩阵

    pic_1
    如上图所示,要了解各个评价指标,首先需要知道混淆矩阵,混淆矩阵中的P表示Positive,即正例或者阳性,N表示Negative,即负例或者阴性。
    表中FP表示实际为负但被预测为正的样本数量,TN表示实际为负被预测为负的样本的数量,TP表示实际为正被预测为正的样本数量,FN表示实际为正但被预测为负的样本的数量。
    另外,TP+FP=P’表示所有被预测为正的样本数量,同理FN+TN为所有被预测为负的样本数量,TP+FN为实际为正的样本数量,FP+TN为实际为负的样本数量。

    准确率

    准确率是分类正确的样本占总样本个数的比例,即
    A c c u r a c y = n c o r r e c t n t o t a l A c c u r a c y = n c o r r e c t n t o t a l A c c u r a c y = n c o r r e c t n t o t a l Accuracy=ncorrectntotalAccuracy=ncorrectntotal Accuracy = \frac{n_{correct}}{n_{total}} Accuracy=ncorrectntotalAccuracy=ncorrectntotalAccuracy=ntotalncorrectAccuracy=TP+TN+FP+FNTP+TN
    准确率是分类问题中最简单直观的评价指标,但存在明显的缺陷。比如如果样本中有99%的样本为正样本,那么分类器只需要一直预测为正,就可以得到99%的准确率,但其实际性能是非常低下的。也就是说,当不同类别样本的比例非常不均衡时,占比大的类别往往成为影响准确率的最主要因素。
    下面我们看一下sklearn中计算准确率的示例:

    import numpy as np
    from sklearn.metrics import accuracy_score
    

    y_pred = [0, 2, 1, 3]
    y_true = [0, 1, 2, 3]
    print(accuracy_score(y_true, y_pred)) # 0.5
    print(accuracy_score(y_true, y_pred, normalize=False)) # 2

    # 在具有二元标签指示符的多标签分类案例中
    print(accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2)))) # 0.5


    • 函数接口的描述是这样的:

    准确度分类得分
     
    在多标签分类中,此函数计算子集精度:为样本预测的标签集必须完全匹配y_true(实际标签)中相应的标签集。
     
    参数
    y_true : 一维数组,或标签指示符 / 稀疏矩阵,实际(正确的)标签.
    y_pred : 一维数组,或标签指示符 / 稀疏矩阵,分类器返回的预测标签.
    normalize : 布尔值, 可选的(默认为True). 如果为False,返回分类正确的样本数量,否则,返回正 确分类的得分.
    sample_weight : 形状为[样本数量]的数组,可选. 样本权重.
     
    返回值
    score : 浮点型
    如果normalize为True,返回正确分类的得分(浮点型),否则返回分类正确的样本数量(整型).
    当normalize为True时,最好的表现是score为1,当normalize为False时,最好的表现是score未样本数量.

    代码的输出我已经写在注释中了,需要注意的是最后一行代码中,y_true为 [ 0111 ] [ 0111 ] [ 0 a m p ; 1 1 a m p ; 1 ] [0111][0111] \begin{bmatrix}0 & 1 \\ 1 & 1 \\\end{bmatrix} [0111][0111][01amp;1amp;1]Precision=TP+FPTP
    sklearn中的函数接口precision_score的描述如下:

    计算精确率
     
    精确率是 tp / (tp + fp)的比例,其中tp是真正性的数量,fp是假正性的数量. 精确率直观地可以说是分类器不将负样本标记为正样本的能力.
     
    精确率最好的值是1,最差的值是0.
     
    参数
    y_true : 一维数组,或标签指示符 / 稀疏矩阵,实际(正确的)标签.
    y_pred : 一维数组,或标签指示符 / 稀疏矩阵,分类器返回的预测标签.
    labels : 列表,可选值. 当average != binary时被包含的标签集合,如果average是None的话还包含它们的顺序. 在数据中存在的标签可以被排除,比如计算一个忽略多数负类的多类平均值时,数据中没有出现的标签会导致宏平均值(marco average)含有0个组件. 对于多标签的目标,标签是列索引. 默认情况下,y_true和y_pred中的所有标签按照排序后的顺序使用.
    pos_label : 字符串或整型,默认为1. 如果average = binary并且数据是二进制时需要被报告的类. 若果数据是多类的或者多标签的,这将被忽略;设置labels=[pos_label]和average != binary就只会报告设置的特定标签的分数.
    average : 字符串,可选值为[None, ‘binary’ (默认), ‘micro’, ‘macro’, ‘samples’, ‘weighted’]. 多类或 者多标签目标需要这个参数. 如果为None,每个类别的分数将会返回. 否则,它决定了数据的平均值类型.
    ‘binary’: 仅报告由pos_label指定的类的结果. 这仅适用于目标(y_{true, pred})是二进制的情况.
    ‘micro’: 通过计算总的真正性、假负性和假正性来全局计算指标.
    ‘macro’: 为每个标签计算指标,找到它们未加权的均值. 它不考虑标签数量不平衡的情况.
    ‘weighted’: 为每个标签计算指标,并通过各类占比找到它们的加权均值(每个标签的正例数).它解决了’macro’的标签不平衡问题;它可以产生不在精确率和召回率之间的F-score.
    ‘samples’: 为每个实例计算指标,找到它们的均值(只在多标签分类的时候有意义,并且和函数accuracy_score不同).
    sample_weight : 形状为[样本数量]的数组,可选参数. 样本权重.
     
    返回值
    precision : 浮点数(如果average不是None) 或浮点数数组, shape =[唯一标签的数量]
    二分类中正类的精确率或者在多分类任务中每个类的精确率的加权平均.

    官方示例代码为:

    from sklearn.metrics import precision_score
    

    y_true = [0, 1, 2, 0, 1, 2]
    y_pred = [0, 2, 1, 0, 0, 1]
    print(precision_score(y_true, y_pred, average=‘macro’)) # 0.2222222222222222
    print(precision_score(y_true, y_pred, average=‘micro’)) # 0.3333333333333333
    print(precision_score(y_true, y_pred, average=‘weighted’)) # 0.2222222222222222
    print(precision_score(y_true, y_pred, average=None)) # [0.66666667 0. 0. ]


    • 直接看函数接口和示例代码还是让人有点云里雾里的,我们这里先介绍两个与多分类相关的概念,再说说上面的代码是如何计算的。

    • Macro Average
      宏平均是指在计算均值时使每个类别具有相同的权重,最后结果是每个类别的指标的算术平均值。
    • Micro Average
      微平均是指计算多分类指标时赋予所有类别的每个样本相同的权重,将所有样本合在一起计算各个指标。

    根据precision_score接口的解释,我们可以知道,当average参数为None时,得到的结果是每个类别的precision。上面的y_true有3个类别,分别为类0、类1、类2。我们将每个类别的TP、FP、FN列在下表中。

    类别TPFPFN
    类0210
    类1022
    类2011

    那么每个类别的precision也就得到了,如下所示:
    P 0 = 21 + 2 = 23 ≈ 0.667 P 0 = 21 + 2 = 23 ≈ 0.667 P 0 = 2 1 + 2 = 2 3 ≈ 0.667 P0=21+2=23≈0.667P0=21+2=23≈0.667 P_0=\frac{2}{1+2} = \frac{2}{3}\approx0.667 P0=21+2=230.667P0=21+2=230.667P0=1+22=320.667Pw=31P0+31P1+31P20.222
    虽然,我们是主要讲精确率的,但是宏平均和微平均的概念也很重要,这里顺便对比一下。

    • 如果每个类别的样本数量差不多,那么宏平均和微平均没有太大差异
    • 如果每个类别的样本数量差异很大,那么注重样本量多的类时使用微平均,注重样本量少的类时使用宏平均
    • 如果微平均大大低于宏平均,那么检查样本量多的类来确定指标表现差的原因
    • 如果宏平均大大低于微平均,那么检查样本量少的类来确定指标表现差的原因

    召回率

    召回率指实际为正的样本中被预测为正的样本所占实际为正的样本的比例。
    sklearn中recall_score方法和precision_score方法的参数说明都是一样的,所以这里不再重复,只是把函数和返回值说明贴在下面:

    计算召回率
     
    召回率是比率tp / (tp + fn),其中tp是真正性的数量,fn是假负性的数量. 召回率直观地说是分类器找到所有正样本的能力.
    召回率最好的值是1,最差的值是0.
     
    返回值
    recall : 浮点数(如果average不是None) 或者浮点数数组,shape = [唯一标签的数量]
    二分类中正类的召回率或者多分类任务中每个类别召回率的加权平均值.

    官方示例代码为:

    from sklearn.metrics import recall_score
    

    y_true = [0, 1, 2, 0, 1, 2]
    y_pred = [0, 2, 1, 0, 0, 1]
    print(recall_score(y_true, y_pred, average=‘macro’)) # 0.3333333333333333
    print(recall_score(y_true, y_pred, average=‘micro’)) # 0.3333333333333333
    print(recall_score(y_true, y_pred, average=‘weighted’)) # 0.3333333333333333
    print(recall_score(y_true, y_pred, average=None)) # [1. 0. 0.]


    • Recall和Precision只有计算公式不同,它们average参数为’macro’,‘micro’,'weighted’和None时的计算方式都是相同的,具体计算可以使用上节列出来的TP、FP、FN表,这里不再赘述。

    P-R曲线

    评价一个模型的好坏,不能仅靠精确率或者召回率,最好构建多组精确率和召回率,绘制出模型的P-R曲线。
    下面说一下P-R曲线的绘制方法。P-R曲线的横轴是召回率,纵轴是精确率。P-R曲线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率。整条P-R曲线是通过将阈值从高到低移动而生成的。原点附近代表当阈值最大时模型的精确率和召回率。
    关于P-R曲线,因为我自己使用的比较少,所以这里就不深入给大家说了。
    sklearn里P-R曲线的使用可以参考:precision_recall_cure
    P-R曲线的理解可以参考这篇博客:P-R曲线深入理解

    F1 score

    F1 score是精确率和召回率的调和平均值,计算公式为:
    F 1 = 2 ∗ p r e c i s i o n ∗ r e c a l l p r e c i s i o n + r e c a l l F 1 = 2 ∗ p r e c i s i o n ∗ r e c a l l p r e c i s i o n + r e c a l l F 1 = 2 ∗ p r e c i s i o n ∗ r e c a l l p r e c i s i o n + r e c a l l F1=2∗precision∗recallprecision+recallF1=2∗precision∗recallprecision+recall F1 = \frac{2 * precision * recall}{precision + recall} F1=2precisionrecallprecision+recallF1=2precisionrecallprecision+recallF1=precision+recall2precisionrecallF1=precision+recall2precisionrecall
    Precision体现了模型对负样本的区分能力,Precision越高,模型对负样本的区分能力越强;Recall体现了模型对正样本的识别能力,Recall越高,模型对正样本的识别能力越强。F1 score是两者的综合,F1 score越高,说明模型越稳健。
    sklearn中f1_score方法和precision_score方法、recall_score方法的参数说明都是一样的,所以这里不再重复,只是把函数和返回值说明贴在下面:

    计算F1 score,它也被叫做F-score或F-measure.
     
    F1 score可以解释为精确率和召回率的加权平均值. F1 score的最好值为1,最差值为0. 精确率和召回率对F1 score的相对贡献是相等的. F1 score的计算公式为:
    F1 = 2 * (precision * recall) / (precision + recall)
     
    在多类别或者多标签的情况下,这是权重取决于average参数的对于每个类别的F1 score的加权平均值.
    返回值
    f1_score : 浮点数或者是浮点数数组,shape=[唯一标签的数量]
    二分类中的正类的F1 score或者是多分类任务中每个类别F1 score的加权平均.

    官方示例代码为:

    from sklearn.metrics import f1_score
    

    y_true = [0, 1, 2, 0, 1, 2]
    y_pred = [0, 2, 1, 0, 0, 1]
    print(f1_score(y_true, y_pred, average=‘macro’)) # 0.26666666666666666
    print(f1_score(y_true, y_pred, average=‘micro’)) # 0.3333333333333333
    print(f1_score(y_true, y_pred, average=‘weighted’)) # 0.26666666666666666
    print(f1_score(y_true, y_pred, average=None)) # [0.8 0. 0. ]

    这里计算还是套公式,所以也就不再多说了。

    参考资料

    多标签分类的结果评估—macro-average和micro-average介绍
    《百面机器学习》(诸葛越主编、葫芦娃著)第二章第1节——评估指标的局限性

    展开全文
  • 前几天,帮朋友处理一个深度学习网络问题,具体场景是这样的,总共有12张,分为3个类别,同时作为训练集跟验证集,训练集跟验证集的预处理一样,使用的模型为...在训练前几个epoch时,训练准确率便达到100%,因为...

    前几天,帮朋友处理一个深度学习网络问题,具体场景是这样的,总共有12张,分为3个类别,同时作为训练集跟验证集,训练集跟验证集的预处理一样,使用的模型为ResNet50,最后的激活函数为softmax。使用keras框架,总共10个epoch,每个epoch都是只有1个batch(因为数据集就12张图片,所以一个batch也就12张图片)。

    在训练前几个epoch时,训练准确率便达到100%,因为模型较为复杂,而且数据集也有12张,所以很好拟合,但验证准确率只有33%,也即出现训练准确率远高于验证准确率的问题,

    在验证了 https://blog.csdn.net/qq_16564093/article/details/103563517 中提到可能出现的情况后,仍然未能解决问题。于是我花了三天时间去寻找答案。

    接下来是我的问题解决思路:

    (1).模型是否出现过拟合现象

    猜测,模型可能过于复杂,出现过拟合现象,导致模型过度拟合训练数据,而不适用于验证数据集。

    于是,为了验证这个猜想,我将训练数据集与验证数据集统一使用同一份,即数据迭代器都是同一份数据,但结果,训练准确率依然远高于验证准确率,可推测,并非模型过度拟合训练数据集。于是,我用同一份数据,对模型进行测试,得出结果是,准确率只有33%,即可以说明一个问题,模型是完全未拟合,那么,问题,为什么模型的训练准确率能达到100%呢?即使出现过拟合现象,训练集跟验证集一样的情况下,模型如若对训练集过度拟合,那么模型应该也对验证集过度拟合,验证准确率应该也达到100%才对。

     

    (2).训练集与验证集是否存在随机处理。

    猜测,训练集与验证集是否存在一些随机的处理方式,比如随机旋转一定角度,亮度,色度的一定范围内的变化,那么在每次数据集迭代器进行迭代完一轮后,数据都做了一些处理,而当模型出现过拟合时,对训练集进行过度拟合后,数据集迭代器对数据进行数据处理,那么模型就没办法适用于做了数据处理后产生新的数据集。但我将所有数据处理的手段都设置Flase,也即保证数据一直不做改变.的情况下,验证准确率依然只有33%,而训练准确率达到100%。

     

    (3).设置计算训练准确率跟验证准确率的计算方式不同。

    因为使用的keras,那么我便猜想,是否在设置计算训练准确率跟验证准确率的方式存在差异,是否可以额外设置计算训练准确率的方式,但我查了keras官方文档,并未找到额外的设置方式,也即表示,计算训练准确率跟验证准确率的方式标准是一样的。

     

    (4).keras底层是否对训练集跟验证集的准确率,损失的计算方式不同。

    于是,排除了种种外部因素,我开始对keras底层进行探索,猜想,除了keras底层对训练集跟验证集的准确率计算方式不同,虽然计算标准都是准确率。还有一种可能,那便是,keras底层在训练的模式下,对一个batch的数据进行了分割处理。所以接下来便是我对底层代码的探究过程,也是谜底的慢慢揭开。

     

    keras底层代码解剖

    ###模型的生成代码是:
    model = keras.models.Model(inputs = base_model.input, outputs = x)
    ###模型的训练代码是:
    model.fit_generator(train_data_generator,
                        validation_data = train_data_generator,
                        epochs = 10)

     

    (1).首先model.fit_generator函数进行解剖。

    通过一层一层的解剖,发现,模型对训练集跟验证集的准确率计算方式是一样,但模型对训练集跟验证集的前向传递,推断出来的输出结果却不一致,也即,在训练的模式下跟验证的模型下,模型输入相同的图片,输出的结果是不一致的。

     

    (2).对训练模型下跟验证模式下,模型的输出结果出现差异进行解剖。

    于是,我继续追踪模型的输出,一一比对训练时,模型调用的推断函数,跟验证时,模型调用的推断函数的差异,最终,在这个脚本里面发现了差异:

    ###site-packages\tensorflow_core\python\keras\engine\training_eager.py
    def _model_loss(model,inputs,targets,output_loss_metrics=None,sample_weights=None,training=False)
    ###在这个函数里面,有这么一段代码,就是在这里输出结果产生了差异。
      outs = model(inputs, **kwargs)

    (3).对model(inputs, **kwargs)函数进行深入解剖。

    我们在keras构建完model后,一般都是使用fit函数进行拟合,使用mode,predict进行预估,很少使用model()这种方式进行调用。比如:

    ###通常情况下
    model = keras.models.Model(inputs = base_model.input, outputs = x)
    model.fit_generator(train_data_generator,
                        validation_data = train_data_generator,
                        epochs = 10)
    res = model.predict(input)
    ###但其实可以直接这样调用
    res = model(pic,training=True)
    res = model(pic,training=False)
    ###这两种区别在于模型是否处于训练模式下。其实它调用的是class的__call__函数。

    (4).对model的__call__函数进行解剖。

    对函数进行一层一层的解剖,并一一比对训练模式跟非训练模式的区别,最终,终于在批归归一化层的处理函数发现差异,也是在数据经过批归一化后,数据产生了差异。

    ###site-packages\tensorflow_core\python\keras\layers\normalization.py
    def _fused_batch_norm(self, inputs, training):
    ###在上面内部函数中,有这个段代码
        def _fused_batch_norm_training():
          return nn.fused_batch_norm(
              inputs,
              gamma,
              beta,
              epsilon=self.epsilon,
              data_format=self._data_format)
    
        def _fused_batch_norm_inference():
          return nn.fused_batch_norm(
              inputs,
              gamma,
              beta,
              mean=self.moving_mean,
              variance=self.moving_variance,
              epsilon=self.epsilon,
              is_training=False,
              data_format=self._data_format)
        output, mean, variance = tf_utils.smart_cond(
            training, _fused_batch_norm_training, _fused_batch_norm_inference)
    ###从上面代码可知
    ###在训练模式下,模型调用的批归一化函数为_fused_batch_norm_training
    ###在非训练模式下,模型调用的批归一化函数为_fused_batch_norm_inference
    ###两者虽然调用的都是nn.fused_batch_norm函数
    ###但训练模式下,mean跟variance都是在传递过程中临时计算出来的。
    ###而非训练模式下,mean跟variance都是自己传递进去的。

    那么,我发现,在训练模式下,返回的variance数值都在(-1,1)之间,而在非训练模式下,传进批归一化函数的variance数据却达到上千,那么这个就是问题所在,在训练模式下,因为mean跟variance都在合理的数值下,那么批归一化后数据属于正常分布,但当非训练模式下,variance过大,造成数据输出已经出现偏差。

    但这就又有一个疑问,因为在训练模式下,批归一化后返回的mean跟variance都会重新保存下来,赋值给self.moving_mean跟self.moving_variance,那么在非训练模式下,应该会使用到正确的mean跟variance才对,于是我继续追踪self.moving_mean跟self.moving_variance的update过程。

    然后,我就追踪到这么一段代码:

    decay = ops.convert_to_tensor(1.0 - momentum, name='decay')
    if decay.dtype != variable.dtype.base_dtype:
        decay = math_ops.cast(decay, variable.dtype.base_dtype)
    update_delta = (variable - math_ops.cast(value, variable.dtype)) * decay

    这也就是表示,mean跟variance的update存在一个动量,而非直接赋值。所以要等mean跟variance达到正常范围,需要较多的epoch去迭代更新。

     

    所以,结果是模型并非过拟合,而是还未拟合,因为批归一化中的mean跟variance仍需要迭代很多次,才能达到合理值,而在前几个epoch中,训练模型下,mean跟variance都是通过数据集进行计算的,所以模型的输出是合理的,训练准确率也较高,但在验证集上,模型处于非训练模式,mean跟variance都是使用保存下来的,都仍然偏大,还未迭代到合理数值,所以模型的输出都异常,验证准确率也偏低。

     

    展开全文
  • 这个教程将会讨论如何计算混淆矩阵、准确率、精确率和召回率。具体而言,主要内容如下: (1)二分类的混淆矩阵 (2)多分类的混淆矩阵 (3)使用Scikit-learn库来计算混淆矩阵 (4)准确率、精确率和召回率计算...
  • 一、概念 精确率(precision):针对我们预测结果...准确率(accuracy):针对我们预测结果而言的,它表示的是预测结果中正确的预测占总样本数的比例。 精确率:precision = TP / (TP + FP) 召回率:recall =...
  • 为什么99%的准确率的分类器却不是我们想要的,因为这里数据分布不均衡,类别1的数据太少,完全错分类别1依然可以达到很高的准确率却忽视了我们关注的东西。再举个例子说明下。在正负样本不平衡的情况下,准确率这个...
  • 准确率Accuracy与损失函数Loss的关系

    万次阅读 多人点赞 2020-03-06 17:32:31
    自定义标题背景定义关系 背景 在进行一项分类任务训练时,观察到验证集上的...交叉熵损失函数:交叉熵输出的是正确标签的似然对数,和准确率有一定的关系,但是取值范围更大。交叉熵损失公式: 其中y^(i)\widehat{y...
  • 训练集准确率很高,验证集准确率低问题

    万次阅读 多人点赞 2020-10-08 17:01:57
    训练集在训练过程中,loss稳步下降,准确率上升,最后能达到97% 验证集准确率没有升高,一直维持在50%左右(二分类问题,随机概率) 测试集准确率57% 在网上搜索可能打的原因: 1.learning rate太小,陷入局部最优 2...
  • ▌混淆矩阵,准确率,精准率,召回率 混淆矩阵 二分类的模型,那么把预测情况与实际情况的所有结果两两混合,结果就会出现以下4种情况,就组成了混淆矩阵。分别引入P/N/F/T四个符号,以便于分辨出结果。 P...
  • 跑出来的结果训练集能达到1,测试集准确率基本保持在0.5左右,二分类 数据有用shuffle, 有dropout,有正则化,learning rate也挺小的。 不知道是什么原因,求解答! ![图片说明]...
  • 模型优化-提高准确率

    千次阅读 2018-10-25 15:42:52
    如何提高训练模型准确率 原文链接:https://blog.csdn.net/Winteeena/article/details/78997696 提升一个模型的表现有时很困难,尝试所有曾学习过的策略和算法,但模型正确率并没有改善。 这才是考验真本领的时候...
  • TensorFlow2 大幅提高模型准确率的神奇操作

    千次阅读 多人点赞 2021-06-17 11:16:04
    TensorFlow2 提高模型准确度, 解决过拟合问题. 详解 Regulation, Momentum, learning-rate decay, Early Stopping, Dropout 5大工具如何帮助我们提高模型准确率.
  • 思想很简单,将标注的yolo数据转下格式,转为[类别,xmin,ymin,xmax,ymax] 转换valid后的信息,两个信息进行对比 完事 具体的,在终端执行: ./darknet detector valid cfg/voc.data cfg/yolo-voc.cfg ...
  • 我们在使用深度学习解决一个分类问题的时候,需要计算准确率来评价算法,有的时候会使用top3、top5准确率,那么在tensorflow中如何实现呢? 一般分类网络都会使用交叉熵损失函数,在使用交叉熵之前,对于n分类问题...
  • 一、引言 分类算法有很多,不同分类算法又用很多不同的变种。不同的分类算法有不同的特定,在不同的数据集...正确确实是一个很好很直观的评价指标,但是有时候正确高并不能代表一个算法就好。比如某个地区某天地震
  • 小白学习笔记:Mnist 手写训练集 加入隐藏层后准确率变为0.1的解决办法提高神经网络准确率的尝试调小每次训练的批次大小 提高神经网络准确率的尝试 首先是增加隐藏层数,这样有助于提高结果的非线性性,我这里加入了...
  • 虽然 91% 的准确率可能乍一看还不错,但如果另一个肿瘤分类器模型总是预测良性,那么这个模型使用我们的样本进行预测也会实现相同的准确率(100 个中有 91 个预测正确)。换言之,我们的模型与那些没有预测能力来...
  • Top-1准确率和Top-5准确率

    千次阅读 多人点赞 2020-03-29 12:05:37
    在深度学习过程中,会经常看见各成熟网络模型在ImageNet上的Top-1准确率和Top-5准确率的介绍,如下图所示: 那Top-1 Accuracy和Top-5 Accuracy是指什么呢?区别在哪呢? 我们知道ImageNet有大概1000个分类,而模型...
  • 在使用pytorch运行图像分类的代码的时候,发现测试集准确率总是只有30%左右, 但是训练集准确率基本可以达到80%以上,那么存在的问题可能是一下几个方面导致的: 1、学习率设置得太高,可以尽量将学习率设置得小...
  • 混淆矩阵 P(Positive):代表1 N(Negative):代表0 T(True):代表预测正确 F(False):代表错误 ...照上面的字符表示,混淆矩阵就变成了下面这样: ...2. 准确率 ...准确率的定义是预测正确的结果占总...准确率=(T
  • 比如准确率、精确率、召回率、F1值、ROC、AUC等指标。 1. 混淆矩阵 介绍各个指标之前,我们先来了解一下混淆矩阵。假如现在有一个二分类问题,那么预测结果和实际结果两两结合会出现如下四种情况。 由于用数字1、0...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 390,106
精华内容 156,042
关键字:

准确率