精确度是评估分类器性能的一个重要指标,它衡量的是分类器正确识别正样本的能力。在二分类问题中,精确度定义为真正例(tp)与真正例和假正例(fp)之和的比值。精确度的最佳值为1,最差值为0。
在处理多分类和多标签数据时,可以通过将每个标签视为一个二分类问题来计算精确度。对于二分类情况,如果设置average='binary'
,则会返回指定正样本标签的精确度。如果average
不是'binary'
,则会忽略pos_label
参数,并计算两个类别的精确度,然后进行平均或同时返回(当average=None
时)。同样,对于多分类和多标签目标,根据average
参数的设置,可以返回所有标签的精确度或进行平均。
可以使用labels
参数指定计算精确度的标签集合。在多分类问题中,可以通过排除某些标签(例如,排除“负类”)来使用这个参数。此外,即使某些标签在数据中不存在,也可以将其包含在内,这些标签将被分配0个样本。对于多标签目标,标签是列索引。默认情况下,会使用y_true
和y_pred
中的所有标签,并按排序顺序使用。
在多分类或多标签目标中,average
参数是必需的。如果设置为None
,则会返回每个类别的分数。否则,这个参数决定了对数据执行的类型平均:
'binary': 仅报告由pos_label指定的类别的结果。这只在目标(y_true, pred)是二分类时适用。
'micro': 通过计算总的真正例、假负例和假正例来全局计算指标。
'macro': 为每个标签计算指标,并找到它们的未加权平均值。这不考虑到标签不平衡。
'weighted': 为每个标签计算指标,并找到它们的平均值,按支持度(每个标签的真实实例数)加权。这改变了‘macro’以考虑到标签不平衡;它可能导致F分数不在精确度和召回率之间。
'samples': 为每个实例计算指标,并找到它们的平均值(这只在多标签分类中有意义,此时与accuracy_score不同)。
还可以通过sample_weight
参数设置样本权重,以及通过zero_division
参数设置当出现零除错误时返回的值。
当真正例加上假正例等于0时,精确度返回0并引发UndefinedMetricWarning。可以通过zero_division
参数修改这种行为。
以下是一些使用精确度计算的示例:
import numpy as np
from sklearn.metrics import precision_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
print(precision_score(y_true, y_pred, average='macro')) # 输出: np.float64(0.22...)
print(precision_score(y_true, y_pred, average='micro')) # 输出: np.float64(0.33...)
print(precision_score(y_true, y_pred, average='weighted')) # 输出: np.float64(0.22...)
print(precision_score(y_true, y_pred, average=None)) # 输出: array([0.66..., 0. , 0. ])
在多标签分类中,精确度的计算方法如下:
y_true = [[0, 0, 0], [1, 1, 1], [0, 1, 1]]
y_pred = [[0, 0, 0], [1, 1, 1], [1, 1, 0]]
print(precision_score(y_true, y_pred, average=None)) # 输出: array([0.5, 1. , 1. ])