python - sklearn 计算精准率(Precision)

31 篇文章 4 订阅
19 篇文章 0 订阅

python - sklearn 计算查准率

因为最近写的分类模型需要性能评价 ,常用的分类性能评价有 查准率、召回率、准确率、F1

分类问题的常用的包 sklearn ,下面对查准率所用的方法进行介绍

召回率 请看另外一篇文章: sklearn 计算召回率

前提知识

对于我们的二分类问题,会有以下情况:

  • 真正例(True Positive,TP):真实类别为正例,预测类别为正例。
  • 假正例(False Positive,FP):真实类别为负例,预测类别为正例。
  • 假负例(False Negative,FN):真实类别为正例,预测类别为负例。
  • 真负例(True Negative,TN):真实类别为负例,预测类别为负例。

然后可以构建混淆矩阵(Confusion Matrix)如下表所示。

真实类别预测类别预测类别
正例负例
正例TPFN
负例FPTN

准确率,又称查准率(Precision,P):
P = T P / ( T P + F P ) P=TP/(TP+FP) P=TP/(TP+FP)

1、sklearn.metrics.precision_score()方法

方法说明:

sklearn.metrics.precision_score(y_true, y_pred, *, labels=None, pos_label=1,average='binary', sample_weight=None,zero_division="warn"):

参数介绍:

  • y_true:真实的标签,即数据集中真实的分类标签情况,是一个1维的数组

  • y_pred:预测标签,即模型预测的分类标签情况,是一个1维的数组

  • labels:可选参数,默认为None ,是一个一维的数组, 二分类时,不需要用这个参数。

  • pos_label:字符串或者int类型,默认值是1,如果average='binary且数据是二分类,则需要报告的类,如果数据是多类或多标签的,这将被忽略;设置labels=[pos_label]average != 'binary将只报告该标签的分数。

  • average:字符串类型,取值为 [None, ‘binary’ (default), ‘micro’, ‘macro’, ‘samples’, ‘weighted’]。默认为binary,给出正样本的准确率,也就是pos_label默认参数1时的准确率。

  • sample_weight:数组类型,样本的权重

  • zero_division:取值为 [“warn”, ‘0’ , ‘1’] ,设置存在零除法时返回的值,warn也相等于是0,但是会出现警告

2、sklearn.metrics.precision_score()的使用举例(二分类)

在二分类问题上,使用这个非常简单,因为方法中很多参数都是针对 二分类 默认的参数,不需要额外指定

例如:pos_label 默认为1呀(二分类正样本的值),average为 二分类 binary

只需要 传入预测的真实的 标签,即可求出准确率

from sklearn.metrics import precision_score

pred = [0, 1, 0, 1] # 预测的值
target = [0, 1, 1, 0] # 真实的值

precision = precision_score(pred, target)

print(precision)

===> 0.5

如果不是 0 1 的值,是其他二分类的值,那么就可以通过 labelspos_label 来指定

labels = [3,4]  # 二分类 两个类别的值

pred = [3, 4, 3, 4] # 预测的值

target = [3, 4, 4, 3] # 真实的值

precision = precision_score(pred, target , labels = labels , pos_label= 3) # pos_label指定正样本的值是多少

print(precision)

===> 0.5

2、sklearn.metrics.precision_score() 的使用举例(多分类)

针对多分类问题,各个参数的传参:

  • labels :需要是传入 多分类的 类别数组
  • pos_label:该值会被忽略
  • average:取值 ‘micro’, ‘macro’, ‘samples’, ‘weighted’
  • sample_weight:权重

举例:

labels = [1, 2, 3, 4] # 有哪几类

pred = [1, 2, 3, 4, 2, 3, 4, 1] # 预测的值

target = [2, 3, 1, 4, 1, 4, 4, 1] # 真实的值

precision = precision_score(pred, target, labels=labels, average="micro") # average 指定为micro 
print(precision)

precision = precision_score(pred, target, labels=labels, average="macro") # average 指定为macro 
print(precision)

precision = precision_score(pred, target, labels=labels, average="weighted") # average 指定为weighted
print(precision)

===>0.375
===>0.25
===>0.25

这里主要的是 average 的不同,计算结果会有不同

  • macro:是先对每一个类统计指标值,然后在对所有类求算术平均值。
  • micro:是对数据集中的每一个实例不分类别进行统计建立全局混淆矩阵,然后计算相应指标
  • weightes:计算每个标签的指标,并找到它们的平均加权支持度
  • samples:计算每个实例的指标,并找到它们的平均值

比较常用的是 macromicro 这两种取值

1)macro 是先对每一个类统计指标值,然后利用下面的公式对所有类求算术平均值,
M a c r o P = ( 1 / n ) ( P 1 + P 2 + P 3 + . . . . + P n ) MacroP=(1/n)(P1+P2+P3+....+Pn) MacroP=(1/n)(P1+P2+P3+....+Pn)
2)micro 是对数据集中的每一个实例不分类别进行统计建立全局混淆矩阵,然后计算相应指标
M i c r o P = ( T P 1 + T P 2 + T P 3 + . . . . T P n ) / ( ( T P 1 + T P 2 + T P 3 + . . . . T P n ) + ( F P 1 + F P 2 + F P 3 + . . . . F P n ) ) MicroP=(TP1+TP2+TP3+....TPn)/((TP1+TP2+TP3+....TPn)+(FP1+FP2+FP3+....FPn)) MicroP=TP1+TP2+TP3+....TPn/(TP1+TP2+TP3+....TPn+FP1+FP2+FP3+....FPn)
根据不同的值,计算不同的 precision

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的`.format()`函数用于格式化字符串。可以通过该函数将参数的值填充到字符串中的占位符中。 `.format()`函数的一般格式为`'{pos or key: fill, align, sign, 0, width, .precision, type}'.format(para1...)`。其中,花括号内部的冒号前的位置或关键字用于定位参数,冒号后面的部分用于指定各种格式选项,如填充字符、对齐方式、符号、宽度、精度和类型等。 例如,`print('{:,}'.format(12345678))`用于将数字格式化为带有千位分隔符的字符串,输出结果为`12,345,678`。这里的`,`是填充字符,用于在数字中插入逗号。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python format()函数 字符串格式化方法的用法总结(全)](https://blog.csdn.net/qq_41112170/article/details/124576946)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python .format()函数使用方法](https://blog.csdn.net/m0_46164535/article/details/120960933)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值