jjzjj

准确率、精确率、召回率、F1-score

ywfwyht 2023-07-18 原文

准确率、精确率、召回率、F1-score

概念理解

TP(True Positives):真正例,预测为正例而且实际上也是正例;

FP(False Positives):假正例,预测为正例然而实际上却是负例;

FN(false Negatives):假负例,预测为负例然而实际上却是正例;

TN(True Negatives):真负例,预测为负例而且实际上也是负例。

真实值(True)真实值(False)
预测值(Positive)真正例(TP)假正例(FP)
预测值(Negative)假负例(FN)真负例(TN)

准确率(accuracy)

所有预测正确的样本(包含正例或负例均预测正确,即正例预测为正TP或负例预测为负TN)占总样本的比例。

a c c u r a c y = T P + T N T P + F P + F N + T N accuracy = \dfrac{TP+TN}{TP+FP+FN+TN} accuracy=TP+FP+FN+TNTP+TN
虽然准确率能够判断总的正确率,但是在样本不均衡的情况下,并不能作为很好的指标来衡量结果。在样本不平衡的情况下,得到的高准确率没有任何意义,此时准确率就会失效。

精确率(也叫查准率,precision)

预测为正的正例样本与全部预测为正例的样本 (对于预测而言,包括真正例TP,假正例FP)的比值。即正确预测为正的占全部预测为正的比例,(真正正确的占所有预测为正的比例)
p r e c i s i o n = T P T P + F P precision= \dfrac{TP}{TP+FP} precision=TP+FPTP

我们关心的主要部分是正例,所以查准率就是相对正例的预测结果而言,正例预测的准确度。直白的意思就是模型预测为正例的样本中,其中真正的正例占预测为正例样本的比例,用此标准来评估预测正例的准确度。
精确率代表对正样本结果中的预测准确程度,准确率则代表整体的预测准确程度,包括正样本和负样本。

召回率(也叫查全率,recall)

预测为正的正例占全部实际为正例的样本 (可能将实际正例预测为正例即真正例TP,也可能实际正例预测为负例即假负例FN)的比例(真正正确的占所有实际为正的比例)
以实际样本为判断依据,实际为正例的样本中,被预测正确的正例占总实际正例样本的比例。
p r e c i s i o n = T P T P + F N precision= \dfrac{TP}{TP+FN} precision=TP+FNTP

F1-score

精确率和召回率互相影响,理想状态下肯定追求两个都高,但是实际情况是两者相互“制约”:追求精确率高,则召回率就低;追求召回率高,则通常会影响精确率。我们当然希望预测的结果精确率越高越好,召回率越高越好, 但事实上这两者在某些情况下是矛盾的。这样就需要综合考虑它们,最常见的方法就是F-score。 也可以绘制出P-R曲线图,观察它们的分布情况。
F1值为算数平均数除以几何平均数,且越大越好,将Precision和Recall的上述公式带入会发现,当F1值小时,True Positive相对增加,而false相对减少,即Precision和Recall都相对增加,即F1对Precision和Recall都进行了加权。
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 = 2 T P 2 T P + F P + F N F_1= \dfrac{2*precision*recall}{precision+recall}=\dfrac{2TP}{2TP+FP+FN} F1=precision+recall2precisionrecall=2TP+FP+FN2TP
一般来说准确率和召回率呈负相关,一个高,一个就低,如果两个都低,一定是有问题的。 一般来说,精确度和召回率之间是矛盾的,这里引入F1-Score作为综合指标,就是为了平衡准确率和召回率的影响,较为全面地评价一个分类器。F1是精确率和召回率的调和平均。F1-score越大说明模型质量更高。

有关准确率、精确率、召回率、F1-score的更多相关文章

  1. ruby - 如何强制 Float 在不使用科学记数法的情况下以完全精确的方式显示,而不是作为字符串显示? - 2

    在Ruby中,如何在没有科学记数法的情况下强制显示所有重要位置/完全精确的float?目前我将BigDecimal转换为Float,BigDecimal(0.000000001453).to_f,但这会产生1.453e-09的结果float。如果我执行类似"%14.12f"%BigDecimal("0.000000001453").to_f的操作,我会得到一个字符串。然而,在这种情况下,字符串作为输出是NotAcceptable,因为我需要它作为没有科学记数法的实际数字float。---编辑---好吧,让我在这里提供一些背景信息,这可能需要更改我原来的问题。我正在尝试使用Highsto

  2. ruby - 使用正则表达式在 Ruby 中查找精确的模式匹配 - 2

    我将如何使用正则表达式测试精确匹配。"car".match(/[ca]+/)返回true。由于正则表达式模式不包含“r”,我如何让上述语句返回false?任何包含除“c”和“a”以外的任何字符的字符串都应返回false。“acacaccc”应该返回真“acacacxcc”应该返回false 最佳答案 为其添加一些anchor:/^[ca]+$/ 关于ruby-使用正则表达式在Ruby中查找精确的模式匹配,我们在StackOverflow上找到一个类似的问题:

  3. ruby - 获取以兆字节为单位的准确文件大小? - 2

    如何获得以MB为单位的准确文件大小?我试过这个:compressed_file_size=File.size("Compressed/#{project}.tar.bz2")/1024000puts"filesizeis#{compressed_file_size}MB"但它截断了0.9并显示2MB而不是2.9MB 最佳答案 尝试:compressed_file_size=File.size("Compressed/#{project}.tar.bz2").to_f/2**20formatted_file_size='%.2f'%c

  4. ruby-on-rails - 将 ruby​​ 数组的元素划分为精确数量的(几乎)大小相等的子数组 - 2

    这个问题在这里已经有了答案:HowtochunkanarrayinRuby(2个答案)关闭4年前。我需要一种方法来将数组拆分为精确数量且大小大致相等的较小数组。谁有办法做到这一点?例如a=[1,2,3,4,5,6,7,8,9,10,11,12,13]groups=a.method_i_need(3)groups.inspect=>[[1,2,3,4,5],[6,7,8,9],[10,11,12,13]]Notethatthisisanentirelyseparateproblemfromdividinganarrayintochunks,becausea.each_slice(3).t

  5. ruby - 如何通过匹配 Capybara 中元素的精确文本来查找元素 - 2

    我在HTML中有以下两个元素BerlinBerlinGermany我正在尝试使用以下Capybara方法查找元素find("a",:text=>"berlin")上面将返回两个元素,因为它们都包含文本berlin。有没有办法在Capybara中精确匹配文本? 最佳答案 使用正则表达式而不是字符串作为:text键的值:find("a",:text=>/\ABerlin\z/)查看方法的“选项哈希”部分:Capybara::Node::Finders#alldocumentation.PS:文本匹配是区分大小写的。您的示例代码实际上引发

  6. javascript - 准确的长轮询示例? - 2

    我创建了一个函数,该函数应该进行长轮询并获取“推送”给我的实时数据。现在我正在测试一个json对象,该对象的格式与我收到数据后的外观相同。到目前为止,它似乎工作准确。我只是想知道你怎么想的?您会以某种方式重构它还是完全以另一种方式重构它?varurl='../../path_to_script/respondents.json';functionfetchData(){$.ajax({url:url,method:'GET',dataType:'json',contentType:"application/json;charset=utf-8",cache:false,success:

  7. javascript - 具有精确流类型的对象传播 - 2

    我似乎无法在流程中获得确切的类型来处理对象传播。typePoint={|x:number,y:number|};constp1:Point={x:10,y:10};constp2:Point={...p1,y:5};生成错误对象文字。不精确类型与精确类型不兼容这不会产生错误,但会修改p1:constp3:Point=Object.assign(p1,{y:5});对空对象使用Object.assign也会产生相同的对象字面量错误:constp4:Point=Object.assign({},p1,{y:5});如果我使用typePoint={x:number,y:number};那么对

  8. javascript - 40 位整数在 JavaScript 中是否准确表示? - 2

    我正在使用需要生成(使用*和+操作)和比较40位整数的服务器端计算。我知道此时V8引擎将数字存储为Double而不是int。我可以依赖这些数字来正确生成和比较吗?我的直觉是肯定的-double不应该有问题-但我不确定如何检查或在哪里可以找到这方面的信息。 最佳答案 是的。JavaScriptNumber,这是一个64位IEEE754浮点值,可以存储从-253到253的整数而不损失精度,因为double最多可以存储53位尾数(明确为52)。引用资料:ECMA-262:4.3.19NumbervalueDouble-precisionf

  9. javascript - 使用 Javascript 捕获 react 时间,准确性问题 - 2

    我正在构建一个点探测任务(人们必须在图像消失后对一个点做出快速react),我们需要测量react时间并显示预定义时间间隔内的刺激,以便在在线治疗研究中使用。我们已经决定使用Javascript,我们愿意对用户施加一些限制,即排除IE等。不过我们不能完全禁止Windows。我读了JohnResig'spost关于这个话题,根据这个,我们将不得不禁止Windows上的所有浏览器,除了Firefox和Chrome。另外thisanswer建议使用console.time();作为FF和Chrome的最佳实践。我有一些后续问题,考虑到Resig的帖子现在已有4年历史,并且上面的问题是关于测量

  10. javascript - 在向用户显示输出的同时准确测量 Javascript 函数的性能 - 2

    正如您在下面的代码中看到的,当我增加字符串的大小时,它会导致0毫秒的差异。此外,随着字符串数量的增加,会出现不一致的情况。我是不是做错了什么?letstringIn=document.getElementById('str');letbutton=document.querySelector('button');button.addEventListener('click',()=>{lett1=performance.now();functionToTest(stringIn.value);lett2=performance.now();console.log(`timetakeni

随机推荐