评估指标:精确率,召回率,F1_score,ROC,AUC

分类算法评估标准详解

分类准确度并不能够评估所有的场景,展示的结果也比较片面,这时候就需要其他的评估方法来进行测量评估。
所以接下来介绍一些其他的评估标准,将从以下5个方面来介绍:

混淆矩阵
精准率和召回率
F1 Score
ROC曲线
AUC

一、混淆矩阵(Confusion Matrix)

对于二分类问题,所有的问题分为0和1两类,混淆矩阵是2*2的矩阵:
在这里插入图片描述
TP:真实值是1,预测值是1,即我们预测是positive,预测正确了。
FN:真实值是1,预测值是0,即我们预测是negative,但预测错误了。
FP:真实值是0,预测值是1,即我们预测是positive,但是预测错误了。
TN:真实值是0,预测值是0,即我们预测是negative,预测正确了。

例如现在有个癌症预测系统,假设对于1万人进行检测,根据混淆矩阵得出结果入下:
对于1万个人中,有9978个人本身并没有癌症,我们的算法也判断他没有癌症;
有12个人本身没有癌症,但是我们的算法却错误地预测他有癌症;
有2个人确实有癌症,但我们算法预测他没有癌症;
有8个人确实有癌症,而且我们也预测对了。

混淆矩阵得出的结果更为全面。
在这里插入图片描述

二、精准率和召回率

精准率:
在这里插入图片描述
即:精准率为8/(8+12)=40%

精准率就是测量出,预测正确的个数占所有预测成positive情况的比例

一句话:预测值为1,且预测对了的比例

召回率
在这里插入图片描述
即:精准率为8/(8+2)=80%

召回率是:所有真实值为1的数据中,预测对了的个数

三、F1 Score

精准率和召回率是有效的评估方式,但是根据场景不同应该将评估的重点放在不同的方面。
为了取得一个平衡,使用一个新的指标F1 Score

概念介绍
F1 Score是精准率和召回率的调和平均值

调和平均值的特点是如果二者极度不平衡,如某一个值特别高、另一个值特别低时,得到的F1 Score值也特别低;只有二者都非常高,F1才会高。这样才符合我们对精准率和召回率的衡量标准。

四、ROC曲线

分类阈值:设置判断样本为正例的阈值thr
如果某个逻辑回归模型对某封电子邮件进行预测时返回的概率为 0.9995,则表示该模型预测这封邮件非常可能是垃圾邮件。相反,在同一个逻辑回归模型中预测分数为 0.0003 的另一封电子邮件很可能不是垃圾邮件。可如果某封电子邮件的预测分数为 0.6 呢?为了将逻辑回归值映射到二元类别,您必须指定分类阈值也称为判定阈值)。如果值高于该阈值,则表示“垃圾邮件”;如果值低于该阈值,则表示“非垃圾邮件”。人们往往会认为分类阈值应始终为 0.5,但阈值取决于具体问题,因此您必须对其进行调整。

精准率随着threshold阈值的增加而减低,recall随着阈值的增大而减小。

TPR: 预测为1,且预测对了的数量,占真实值为1的数据百分比,这个就是召回率
FPR: 预测为1,但预测错了的数量,占真实值不为1的数据百分比
TPR和FPR呈正比关系,ROC曲线就是描述这两个关系的曲线。

ROC曲线
ROC(Receiver Operation Characteristic Curve),横轴是FPR, 纵轴是TPR.
TPR就是所有正例中,有多少被正确地判定为正;
FPR是所有负例中,有多少被错误地判定为正。

分类阈值会影响TPR和FPR的取值,理想状态下,希望TPR = 1, FPR = 0,这个是不可能实现的,所以需要找一个合适的分类阈值来保证成功预测比例比较大。

ROC曲线距离左上角越近,证明分类器效果越好。如果一条算法1的ROC曲线完全包含算法2,则可以断定性能算法1>算法2。这很好理解,此时任做一条 横线(纵线),任意相同TPR(FPR) 时,算法1的FPR更低(TPR更高),故显然更优。

很多时候两个分类器的ROC曲线交叉,无法判断哪个分类器性能更好,这时可以计算曲线下的面积AUC,作为性能度量

五、AUC

AUC(Area Under Curve)指的是ROC曲线下面的面积,纵轴和横轴范围都是(0,1),所以总面积小于1。

ROC曲线下方由梯形组成,矩形可以看成特征的梯形。因此,AUC的面积可以这样算:(上底+下底)* 高 / 2,曲线下面的面积可以由多个梯形面积叠加得到。AUC越大,分类器分类效果越好。

AUC = 1,是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC = 0.5,跟随机猜测一样,模型没有预测价值。
AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

编程实现

手动实现混淆矩阵,精准率和召回率,f1分值,ROC曲线,AUC

import pandas as pd
‘’‘处理二维矩阵’’’
df = pd.DataFrame([
[0,1],[1,1],[2,1],[3,-1],[4,-1],
[5,-1],[6,1],[7,1],[8,1],[9,-1]
])
X = df.iloc[:,[0]]
Y = df.iloc[:,-1]

‘’‘用逻辑二分类’’’
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X, Y)

精准率:
from sklearn.metrics import precision_score
print(“精准率为:”,precision_score(Y,model.predict(X)))

结果:
0.6

召回率
from sklearn.metrics import recall_score
print(“召回率为:”,recall_score(Y,model.predict(X)))

结果:
1.0

混淆矩阵
from sklearn.metrics import confusion_matrix
print(confusion_matrix(Y, model.predict(X)))

结果:
array([[0 4]
[0 6]],dtype=int64)

f1_score分值
from sklearn.metrics import f1_score
print(“f1_score为:”,f1_score(Y,model.predict(X)))

结果:
0.7499999999999999

AUC
from sklearn.metrics import roc_auc_score
print(‘AUC:’, roc_auc_score(Y, model.predict_proba(X)[:, -1:]))

结果:
AUC: 0.625

ROC曲线
import matplotlib.pyplot as plt ‘’‘画图’’’
from sklearn.metrics import roc_curve
plt.rcParams[‘font.sans-serif’] = [‘SimHei’] ‘’‘黑体’’’
fpr, tpr, th = roc_curve(Y, model.predict_proba(X)[:, -1:])
plt.title(‘ROC曲线’)
plt.plot(fpr, tpr)
plt.show()

‘’‘展示曲线图’’’
在这里插入图片描述
再强调一下易混淆点:
精准率(查准率):预测值为1,且预测对了的比例,即:我们关注的那个事件,预测的有多准。
召回率(查全率):所有真实值为1的数据中,预测对了的个数,即:我们关注的那个事件真实的发生情况下,我们成功预测的比例是多少。

完美~

热门文章

暂无图片
编程学习 ·

Linux centos7 乱码设置中文字符集

1.locale 查看现在使用的字符集locale -a 查看有哪些字符集utf8的就可以显示中文yum -y install kde-l10n-Chinese 安装后选个uft8的 ,设置一下全局变量vi /etc/profileexport LANG=en_CA.utf8=号后面是字符集,这个大家随意最后让这个配置文件生效就可以了. /etc/profile 可能…
暂无图片
编程学习 ·

JVM(一)--JVM的内存区域划分以及相关知识点

JVM(一)–JVM的内存区域划分以及相关知识点 一、JVM的内存区域是怎么划分的? JVM结构图JVM = 类加载器 + 执行引擎 + 运行时数据区类加载器(Class Loader):把硬盘上的class文件加载到JVM中的运行时数据区域,它不负责这个类文件是否能够执行 执行引擎(Execution Engine):…
暂无图片
编程学习 ·

c++数制2~16数进制的转换

通项公式: while(n!=0){ a[i]=n%d; n=(n/d); i++; } 其中n为要转换的十进制的数。d为要转换的数制,如二进制为2. #include<iostream> using namespace std;int main() {int i,n,d,a[100];//n 为要转换的十进制数,d为要转为的数制 while(cin>>n>>d){i=0;wh…
暂无图片
编程学习 ·

命令模式

菜鸟教程中代理模式总结)1.定义:将请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令 的合适的对象,并把该命令传给相应的对象,该对象执行命令。 2.主要解决:行为请求者与行为实现者通常是一种紧耦合的关系,为了消除这种耦合关系 3.何时使用:命…
暂无图片
编程学习 ·

solr自动更新索引,tomcat+solr

核心文件夹: tomcat-8.0.35-search------端口8888 solr-7.2.0------端口8984 核心配置: 用于配置solr索引的定时增量更新和全部更新,两个文件保持一致就可以。 /tomcat/tomcat-8.0.35-search/bin/solr/conf/dataimport.properties /solr-7.2.0/server/solr/chuai/conf/datai…
暂无图片
编程学习 ·

Linux磁盘管理与文件系统

Linux磁盘管理与文件系统磁盘结构1.硬盘的物理结构2.硬盘的数据结构3.硬盘的接口fdisk命令mkfs命令mkswap 命令挂载、卸载文件系统 前言:管理磁盘是管理员的重要工作内容之一,此次将从磁盘的分区和格式化操作等方面,学习在linux系统中的磁盘和管理技术。除此之外,文件系统也…
暂无图片
编程学习 ·

Netty

Netty是什么?异步事件驱动的网络应用框架,可以快速开发一个可维护的高性能的服务端和客户端。都是谁在用Netty?Dubbo、zk、RocketMQ、es、Spring5(对于Http协议的实现)、Spak等大型开源项目使用Netty作为底层通讯的实现。Netty中的核心概念是什么?1、Channel管道,是对Sock…
暂无图片
编程学习 ·

nat表中的dnat snat的使用(iptables)

nat表中的dnat snat的使用- snatiptables -t nat -A POSTROUTING -o enp6s0 -j SNAT --to-source 172.25.254.33- dnatiptables -t nat -A PREROUTING -i enp6s0 -j DNAT --to-dest 170.25.254.22从enp6s0进来的所有数据都转给170.25.254.11,即给enp6s0(172.25.254.33)的所有…
暂无图片
编程学习 ·

[46]api接口文档的生成和与项目文档进行集成

导出api文档 登录Eolinker 平台,生成api文档因为我们不是付费用户,所以无法导出markdown文档,所以导出了html文档 集成到docsify 因为docsify默认时处理markdown的,所以如果我们放上一个html文件就会出现解析错误,所以我们需要对该路径启用不处理window.$docsify = {name:…
暂无图片
编程学习 ·

MySql简单入门_第四篇(2)_存储

5、存储过程:为以后的使用而保存的一条或多条MySql语句的集合存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(…
暂无图片
编程学习 ·

idea+maven配置log4j详解

实现log4j打印日志依赖的jar包共3个,在pom.xml中加入相关依赖: <!-- 添加log4j日志相关jar包:共3个jar--><!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifac…
暂无图片
编程学习 ·

产品经理新人必看的避坑指南

产品经理的一路走来,会遇到大大小小的“坑”。从毕业开始做产品经理已有7年,一直在回想自己有哪些地方做的不够好需要改进的。趁自己闲暇时间总结分享出来,希望能给产品新人一些启示。 一、不问要求埋头苦干。 产品新人刚入职的时候,因为经验不足,不太熟悉业务,往往一开始…
暂无图片
编程学习 ·

Flink原理与实现:Flink中的状态管理,keygroup,namespace

namespace维护每个subtask的状态上面Flink原理与实现的文章中,有引用word count的例子,但是都没有包含状态管理。也就是说,如果一个task在处理过程中挂掉了,那么它在内存中的状态都会丢失,所有的数据都需要重新计算。从容错和消息处理的语义上(at least once, exactly onc…
暂无图片
编程学习 ·

java 并发 join 之 老王泡茶

package juc;import java.util.concurrent.TimeUnit;/*** @author yanjun.liu* @date 2020/7/1--17:00*/ public class Test6 {public static void main(String[] args) throws InterruptedException {Thread lw= new Thread(()->{try {System.out.println("老王开始洗…
暂无图片
编程学习 ·

Vue报错object(...)is not a function

Vue 报错object(…)is not a function 的原因是在vue文件中引入的定义接口所在的js文件路径不对或者引入的接口名字不正确 import { 接口名字 } from ‘@api/接口所在文件’
暂无图片
编程学习 ·

内网渗透 -- 获取内网浏览器历史记录等相关信息

“我喜欢你,做我女朋友可以吗?”电话的那头没有反应,男生沉不住气了,小心翼翼地问着,“你在干嘛呀?”“我在点头。”---- 网易云热评环境:小攻:Kali 2020,ip:192.168.1.133小受:win7 x86,ip:192.168.1.137一、生成木马及监听主机参考上篇文章:二、获取浏览器历史…
暂无图片
编程学习 ·

Query&Filtering与多字符串多字段查询

Query&Filtering与多字符串多字段查询Query Context & Filter Contxtbool查询bool查询语法如何解决结构化查询 - "包含而不是相等"的问题增加count字段,是用bool查询解决Filter Context - 不影响算分Query Context - 影响算分bool嵌套查询语句的结构,会对相…
暂无图片
编程学习 ·

生成文件时加序号

生成的文件按序号01,02,03,04去排列,有需要的同学可以使用,希望可以帮到你public static String generateName(File fil,final String fileName){int count = fil.listFiles(new FileFilter(){public boolean accept(File file){if(file.getName().startsWith(fileName))…
暂无图片
编程学习 ·

企业实战--kubernetes(九)---存储(Secret)

一、Secret简介 Secret对象类型用来保存敏感信息,例如密码、OAuth令牌和ssh key。 敏感信息放在Secret中比放在Pod的定义或者容器镜像中来说更加安全和灵活。 Pod可以用两种方式来使用Secret: 作为volume中的文件被挂载到pod中的一个或多个容器中。 当kubelet为pod拉取镜像时…