轻松上手Scikit-learn——评估模型性能(准确率、精确率、召回率、ROC和AUC)

news2024/11/14 21:05:30

轻松上手Scikit-learn——评估模型性能(准确率、精确率、召回率、ROC和AUC)

安装scikit——learn

pip install -U scikit-learn

常用模型性能评估指标

在开始介绍之前先规定几个表示:

  • 模型预测正确的正样本,称为真正样本(True Positive),简写TP
  • 模型预测正确的负样本,称为真负样本(True Negative),简写TN
  • 模型预测错误的正样本,称为假正样本(False Positive),简写FP
  • 模型预测错误的负样本,称为假负样本(False Negative),简写FN
  • y表示样本的Ground Truth
  • y ^ \hat{y} y^表示模型对于样本的预测从属。
  • 真正率: T P R = T P / ( T P + F N ) TPR=TP/(TP+FN) TPR=TP/(TP+FN)
  • 假正率: F P R = F P / ( F P + T N ) FPR=FP/(FP+TN) FPR=FP/(FP+TN)
  • 真负率: T N R = T N / ( T N + F P ) = 1 − F P R TNR=TN/(TN+FP)=1-FPR TNR=TN/(TN+FP)=1FPR

准确率

  1. 常用准确率
    a c c u r a c y ( y , y ^ ) = 1 n s a m p l e s ∑ i = 0 n s a m p l e s − 1 1 ( y i ^ = = y i ) accuracy(y,\hat{y})=\frac{1}{n_{samples}}\sum_{i=0}^{n_{samples}-1}1(\hat{y_i}==y_i) accuracy(y,y^)=nsamples1i=0nsamples11(yi^==yi)
    其中:
    1 ( y i ^ = = y i ) = { 1 if  y i ^ = = y i   , 0 others  . 1(\hat{y_i}==y_i)= \begin{cases} 1 & \text{if } \hat{y_i}==y_i\ ,\\ 0 & \text{others}\ . \end{cases} 1(yi^==yi)={10if yi^==yi ,others .

    使用sklearn快速计算准确率:

    from sklearn.metrics import accuracy_score
    y_pred = [0, 2, 1, 3]
    y_true = [0, 1, 2, 3]
    accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)
    

    accuracy_score函数共有4个参数。

    • y_true, y_pred是必须参数,分别表示Ground truth标签和预测标签(一般是模型返回的结果)。
    • normalize=True是默认参数,默认为True。如果normalize=False返回正确分类的样本数,否则返回正确分类的样本的占比分数。
    • sample_weight=None是默认参数,默认为None。表示样本的权重。
  2. top-k准确率
    常用accuracy实际上是top-k accurary的特例,当 k = 1 k=1 k=1时, t o p − 1   a c c u r a r y = a c c u r a c y top-1\ accurary=accuracy top1 accurary=accuracy

    在分类时,模型的结果往往是一系列概率。例如: [ 0.2 , 0.15 , 0.1 , 0.25 , 0.3 ] [0.2, 0.15, 0.1, 0.25, 0.3] [0.2,0.15,0.1,0.25,0.3]表示模型认为当前样本属于标签0的概率为0.2;属于标签1的概率为0.15属于标签2的概率为0.1;属于标签3的概率为0.25;属于标签4的概率为0.3。

    使用top-k时,按照预测概率从大到小排序,只要从属于真标签的预测概率在前k个之内,便算做正确。比如top-1就是前1个,即必须真标签对应最大预测概率。

    t o p − k a c c u r a r y ( y , f ^ ) = 1 n s a m p l e s ∑ i = 0 n s a m p l e s − 1 ∑ j = 1 k 1 ( y i = f ^ i , j ) top-k accurary(y, \hat{f})=\frac{1}{n_{samples}}\sum_{i=0}^{n_{samples}-1}\sum_{j=1}^{k}1(y_i=\hat{f}_{i,j}) topkaccurary(y,f^)=nsamples1i=0nsamples1j=1k1(yi=f^i,j)

    其中 f ^ \hat{f} f^表示模型的预测的概率结果, f i , j f_{i,j} fi,j表示模型推断第 i i i个样本属于第 j j j类的概率。

    使用sklearn快速计算top-k准确率:

    from sklearn.metrics import top_k_accuracy_score
    y_true = np.array([0, 1, 2, 2])
    y_score = np.array([[0.5, 0.2, 0.2],
                        [0.3, 0.4, 0.2],
                        [0.2, 0.4, 0.3],
                        [0.7, 0.2, 0.1]])
    top_k_accuracy_score(y_true, y_score, k=2)
    # Not normalizing gives the number of "correctly" classified samples
    top_k_accuracy_score(y_true, y_score, k=2, normalize=False)
    

精确率Precision

精确率有时也叫查准率,是指模型的预测结果有多少是准确的。计算如下:
p r e c i s i o n = T P T P + F P precision=\frac{TP}{TP+FP} precision=TP+FPTP
注意:不要和 T P R TPR TPR搞混。
使用sklearn快速计算精确率Precision:

from sklearn.metrics import precision_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
precision_score(y_true, y_pred, average='macro')
precision_score(y_true, y_pred, average='micro')
precision_score(y_true, y_pred, average='weighted')
precision_score(y_true, y_pred, average=None)
y_pred = [0, 0, 0, 0, 0, 0]
precision_score(y_true, y_pred, average=None)
precision_score(y_true, y_pred, average=None, zero_division=1)
precision_score(y_true, y_pred, average=None, zero_division=np.nan)

true positive + false positive == 0,precision_score返回 0 并引发 UndefinedMetricWarning。可以使用zero_division修改此行为。

召回率

召回率又叫查全率,表示预测出的真正样本占比。
r e c a l l = T P T P + F N = T P R recall = \frac{TP}{TP+FN}=TPR recall=TP+FNTP=TPR
使用sklearn快速计算召回率:

from sklearn.metrics import recall_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
recall_score(y_true, y_pred, average='macro')
recall_score(y_true, y_pred, average='micro')
recall_score(y_true, y_pred, average='weighted')
recall_score(y_true, y_pred, average=None)
y_true = [0, 0, 0, 0, 0, 0]
recall_score(y_true, y_pred, average=None)
recall_score(y_true, y_pred, average=None, zero_division=1)
recall_score(y_true, y_pred, average=None, zero_division=np.nan)

F分数

F值是综合了召回率和精确率的指标。摘自维基百科的样例:
以警察抓犯人的故事为例:

  1. 一位警察很厉害,抓了很多犯人,但是这些犯人当中,只有少部分真正有罪,其他都是被冤枉的。

    • recall 高,因为该抓与不该抓的犯人都被抓到了。
    • precision 低,因为很多都是没犯罪的人。
    • “宁可错抓一百,也不可放过一个”,recall 高,但 precision 低。
  2. 一个警察非常严谨,只逮捕真正有犯罪的人,不抓实在是没办法肯定的犯人。

    • precision 高,因为通常被抓到人的都是有罪的。
    • recall 低,因为不小心放掉一大群犯人。
    • “宁可错放一百,也不可冤枉一个”,precision 高,但 recall 低。

F β = ( 1 + β 2 ) p r e c i s i o n ∗ r e c a l l ( β 2 ∗ p r e c i s i o n ) + r e c a l l = ( 1 + β 2 ) T P ( 1 + β 2 ) T P + F P + β 2 F N F_\beta=(1+\beta^2)\frac{precision*recall}{(\beta^2*precision)+recall}=\frac{(1+\beta^2)TP}{(1+\beta^2)TP+FP+\beta^2FN} Fβ=(1+β2)(β2precision)+recallprecisionrecall=(1+β2)TP+FP+β2FN(1+β2)TP
常用 F 1 F_1 F1值,即 β = 1 \beta=1 β=1.
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 p r e c i s i o n − 1 + r e c a l l − 1 = 2 ∗ T P 2 ∗ T P + F P + F N F_1=\frac{2*precision*recall}{precision+recall}=\frac{2}{precision^{-1}+recall^{-1}}=\frac{2*TP}{2*TP+FP+FN} F1=precision+recall2precisionrecall=precision1+recall12=2TP+FP+FN2TP

使用sklearn快速计算F分数:

F1值:

from sklearn.metrics import f1_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
f1_score(y_true, y_pred, average='macro')
f1_score(y_true, y_pred, average='micro')
f1_score(y_true, y_pred, average='weighted')
f1_score(y_true, y_pred, average=None)

F β F_\beta Fβ值:

from sklearn.metrics import fbeta_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
fbeta_score(y_true, y_pred, average='macro', beta=0.5)
fbeta_score(y_true, y_pred, average='micro', beta=0.5)
fbeta_score(y_true, y_pred, average='weighted', beta=0.5)
fbeta_score(y_true, y_pred, average=None, beta=0.5)
y_pred_empty = [0, 0, 0, 0, 0, 0]
fbeta_score(y_true, y_pred_empty,
            average="macro", zero_division=np.nan, beta=0.5)

ROC和AUC

ROC曲线(接收者操作特征曲线),是一种坐标图式的分析工具,用于选择最佳模型、舍弃次佳的模型或者在同一模型中设置最佳阈值。在做决策时,ROC分析能不受成本/效益的影响,给出客观中立的建议。

ROC将FPR定义为X轴,TPR定义为Y轴。将同一模型每个阈值的 (FPR, TPR) 座标都画在ROC空间里,就成为特定模型的ROC曲线。

依旧是来自维基百科的例子:
在这里插入图片描述

将这4种结果画在ROC空间里:
在这里插入图片描述

  • 点与随机猜测线的距离,是预测能力的指针:离左上角越近的点,预测准确率越高。离右下角越近的点,预测越不准。
  • 在A、B、C三者当中,最好的结果是A方法。
  • B方法的结果位于随机猜测线(对角线)上,在例子中我们可以看到B的准确度(ACC,定义见前面表格)是50%。
  • C虽然预测准确度最差,甚至劣于随机分类,也就是低于0.5(低于对角线)。然而,当将C以 (0.5, 0.5) 为中点作一个镜像后,C’的结果甚至要比A还要好。这个作镜像的方法,简单说,不管C(或任何ROC点低于对角线的情况)预测了什么,就做相反的结论

使用sklearn快速计算roc曲线:

import numpy as np
from sklearn import metrics
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)

AUC(ROC曲线下面积)

在这里插入图片描述

ROC曲线下方的面积AUC(Area under the Curve of ROC),其意义是:

  1. 因为是在1x1的方格里求面积,AUC必在0~1之间。
  2. 假设阈值以上是阳性,以下是阴性;
  3. 若随机抽取一个阳性样本和一个阴性样本,分类器正确判断阳性样本的值高于阴性样本之 概率 = A U C 概率=AUC 概率=AUC
  4. 简单说:AUC值越大的分类器,正确率越高。

从AUC判断分类器(预测模型)优劣的标准

  1. AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
  2. 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设置阈值的话,能有预测价值。
  3. AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
  4. AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

使用sklearn快速计算AUC:

二分类

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
X, y = load_breast_cancer(return_X_y=True)
clf = LogisticRegression(solver="liblinear", random_state=0).fit(X, y)
roc_auc_score(y, clf.predict_proba(X)[:, 1])
roc_auc_score(y, clf.decision_function(X))

多分类

from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
clf = LogisticRegression(solver="liblinear").fit(X, y)
roc_auc_score(y, clf.predict_proba(X), multi_class='ovr')

多标签

import numpy as np
from sklearn.datasets import make_multilabel_classification
from sklearn.multioutput import MultiOutputClassifier
X, y = make_multilabel_classification(random_state=0)
clf = MultiOutputClassifier(clf).fit(X, y)
# get a list of n_output containing probability arrays of shape
# (n_samples, n_classes)
y_pred = clf.predict_proba(X)
# extract the positive columns for each output
y_pred = np.transpose([pred[:, 1] for pred in y_pred])
roc_auc_score(y, y_pred, average=None)
from sklearn.linear_model import RidgeClassifierCV
clf = RidgeClassifierCV().fit(X, y)
roc_auc_score(y, clf.decision_function(X), average=None)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1964069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI会带来新的就业岗位吗?

最近&#xff0c;百度的首席执行官Roy在世界人工智能大会&#xff08;WAIC&#xff09;上提出了一个观点。他表示&#xff0c;大家无需过于担心人工智能会导致大量失业&#xff0c;相反&#xff0c;人工智能会创造一批新的就业岗位。他特别提到了几个核心的典型代表&#xff0c…

visual Studio怎么设置背景图片

想在visual Studio设置一个自己喜欢的背景图片&#xff0c;效果如下&#xff1a; 废话不多说&#xff0c;以Vs2022为例&#xff0c;操作步骤如下&#xff1a; 1.打开“扩展”>“管理扩展”>“搜索ClaudiaIDe”安装 或者直接下载官方安装版https://kbuchi.gallerycdn.vs…

网安科班精选!爱荷华大学教授的网络安全零基础入门教程!

网络就像一把双刃剑&#xff0c;给我们的生活、交流、工作和发展带来了便利&#xff0c;但同时也给信息安全以及个人隐私带来了威胁。网络和信息安全问题不仅影响了网络的普及和应用&#xff0c;还关系到企国家、军队、企业的信息安全和社会的经济安全&#xff0c;让人又爱又恨…

用栈实现队列(双栈思路 + 代码实现)

题目 ①双栈大体思路 1.切入点 栈先进后出&#xff0c;队列先进先出。 两个栈&#xff0c;其中一个栈可以用于颠倒顺序。顺序就跟队列一样 2.明确双栈作用 1.第一个栈接收输入&#xff08;输入栈&#xff09; 2.第二个栈转换顺序&#xff08;输出栈&#xff09; 3.四个功…

学习记录——day23 多进程编程

目录 一、多进程引入 1.1、引入目的 1.2、进程的概念 1.3、进程的种类 1.4、进程号的概念 1.5、特殊进程 0号 1号 2号 孤儿 僵尸 1.6、进程的相关命令 1&#xff09;查看进程信息的命令&#xff1a;ps 跟不同的选项&#xff0c;执行不同的状态 2&…

springboot的轻量替代框架-Solon

Java之所以是广泛使用的编程语言&#xff0c;不仅仅因为其具有跨平台性、面向对象、可靠性&#xff0c;还有很重要的一点是强大的生态系统&#xff0c;spring家族的一系列框架&#xff0c;对Java的崛起有着不可忽视的作用。 学Java的不可能不知道Spring&#xff0c;今天给大家…

品致差分探头和泰克差分探头的优势和特点分析

品致差分探头和泰克差分探头各有其独特的优势和特点&#xff0c;选择哪个更好主要取决于具体的应用场景、测试需求以及预算等因素。以下是对两个品牌差分探头的详细比较&#xff1a; 品致差分探头优势与特点&#xff1a; 高精度测量&#xff1a;品致差分探头具有高精度的测量…

docker(一):Develop faster. Run anywhere.

前言 在进行微服务部署时&#xff0c;首先需要进行部署环境的搭建。目前&#xff0c;Docker 已经成为了微服务部署的主流解决方案之一。Docker 可以帮助我们更快地打包、测试以及部署应用程序&#xff0c;从而缩短从编写到部署运行代码的周期。 在本文中&#xff0c;我们将对…

ChatGPT的高级语音功能“Her”终于上线啦!!

ChatGPT版“Her”突然开放&#xff0c;第一批体验报告来了&#xff01;用户们已经疯狂 刚刚&#xff0c;万众期待的GPT-4o语音功能&#xff0c;也就是被称为“Her”的功能&#xff0c;终于开始向用户陆续开放&#xff01; OpenAI官方推特表示&#xff0c;选中的Alpha用户们将在…

快速部署私有化大模型 毕昇(使用docker-compose方式)

docker安装 1. # Linux系统安装docker&#xff0c;以CentOS/RHEL为例&#xff0c;其他操作系统请参考docker官方安装方法 # 如果已经安装过docker 期望重装&#xff0c;先卸载 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \d…

【Vue】权限控制

权限管理 分类&#xff1a; 页面权限功能(按钮)权限接口权限 vue3-element-admin 的实现方案 一般我们在业务中将 路由可以分为两种&#xff0c;constantRoutes 和 asyncRoutes。 constantRoutes&#xff1a; 代表那些不需要动态判断权限的路由&#xff0c;如登录页、404(或…

机器学习算法——常规算法,在同的业务场景也需要使用不同的算法(二)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

新兴材料中载流子迁移率的霍尔效应测量

这篇文章是发表在《自然电子学》&#xff08;Nature Electronics&#xff09;2024年7月刊上的一篇评论文章&#xff0c;标题为“Reporting Hall effect measurements of charge carrier mobility in emerging materials”&#xff0c;作者是Vladimir Bruevich和Vitaly Podzorov…

数据仓库及数仓架构概述

往期推荐 大数据HBase图文简介-CSDN博客 数仓常见名词解析和名词之间的关系-CSDN博客 目录 0. 前言 0.1 浅谈维度建模 0.2 数据分析模型 1. 何为数据仓库 1.1 为什么不直接用业务平台的数据而要建设数仓&#xff1f; 1.2 数据仓库特征 1.3 数据仓库和数据库区别 1.4 以…

LLM 各种技巧| Prompt Engineering 大总结|指南

LLM 各种技巧| Prompt Engineering 大总结|指南 截止至今&#xff0c;关于LLM 的优化与技巧层出不穷&#xff0c;几乎每个月都有新的技术和方法论被提出&#xff0c;因此本篇主要是要介绍在各种不同情境下&#xff0c;LLM 的各种Prompt Engineering 技巧&#xff0c;每篇都有附…

数据结构经典测试题5

1. int main() { char arr[2][4]; strcpy (arr[0],"you"); strcpy (arr[1],"me"); arr[0][3]&; printf("%s \n",arr); return 0; }上述代码输出结果是什么呢&#xff1f; A: you&me B: you C: me D: err 答案为A 因为arr是一个2行4列…

使用AWS CDK构建生产级VPC基础设施指南

简介 虽然有很多关于AWS的信息&#xff0c;但实际如何将这些服务投入生产使用&#xff0c;还是需要自己思考。本文将介绍我们是如何思考并实施这些工作的。 目前有很多AWS环境构建的方法&#xff0c;但在这里我们将使用AWS CDK进行说明。 ※ 本文不会涉及CDK的基本操作方法或…

Java每日一练,技术成长不间断

目录 题目1.下列关于继承的哪项叙述是正确的&#xff1f;2.Java的跨平台特性是指它的源代码可以在多个平台运行。&#xff08;&#xff09;3.以下 _____ 不是 Object 类的方法4.以下代码&#xff1a;5.下面哪个流类不属于面向字符的流&#xff08;&#xff09;总结 题目 选自牛…

AI系统测试方法|变异测试的流程及优化技术

变异测试是AI系统测试中较为常见的一种测试方法。通过引入人工制造的缺陷来评估系统的健壮性。在AI系统测试实践中&#xff0c;变异测试解决了对测试套件进行有效性和充分性评估的难题。本文将重点探讨变异测试在AI系统测试中的执行流程&#xff0c;呈现一个完整的测试框架&…

Apple intelligence 正式开启测试!第一波文本工具测试体验来啦!

Apple Intelligence 开启测试了&#xff01;苹果带着它的人工智能走进现实了&#xff01; 但是&#xff0c;坏消息是&#xff0c;目前Apple Intelligence仅支持美国地区使用美英语言的开发者账户使用&#xff0c;国行的小伙伴不要急着更新了。 本次测试内容为WWDC2024预告中公布…