python - sklearn 计算查准率
因为最近写的分类模型需要性能评价 ,常用的分类性能评价有 查准率、召回率、准确率、F1
分类问题的常用的包 sklearn ,下面对查准率所用的方法进行介绍
召回率 请看另外一篇文章: sklearn 计算召回率
前提知识
对于我们的二分类问题,会有以下情况:
- 真正例(True Positive,TP):真实类别为正例,预测类别为正例。
- 假正例(False Positive,FP):真实类别为负例,预测类别为正例。
- 假负例(False Negative,FN):真实类别为正例,预测类别为负例。
- 真负例(True Negative,TN):真实类别为负例,预测类别为负例。
然后可以构建混淆矩阵(Confusion Matrix)如下表所示。
真实类别 | 预测类别 | 预测类别 |
---|---|---|
正例 | 负例 | |
正例 | TP | FN |
负例 | FP | TN |
准确率,又称查准率(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 的值,是其他二分类的值,那么就可以通过 labels、pos_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:计算每个实例的指标,并找到它们的平均值
比较常用的是 macro 与 micro 这两种取值
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