举个栗子
假设有10个数据,
target: [ 1,1,1,1,1,0,0,0,0,0 ]
predict:[ 1,0,1,1,1,1,1,0,0,0 ]
target为数据现实的分类,predict为数据的预测结果。
查准率 P = (真正预测对的数量)/(预测结果是“对”的数量) 查准率即要求准确
此例中 P = 4/6
查全率 R = (真正预测对的数量)/(所有结果是“对”的数量) 查全率即要求“对”的越多越好
此例中 R=4/5
F值
F(k) = ( 1 + k ) * P * R / ( ( k*k ) * P + R )。 k>1查全率影响更大,k<1查准率影响更大
其中,常用的F1值,即 F(1) = 2 * P * R / ( P + R )
写个代码
分别求出类别0和1的P,R,F1值。
计算查准率P
class Precision:
def __init__(self, right_num=0., pred_right_num=0.):
"""
查准率
:param pred_right_num: 真正预测准确的数量
:param pred_num: 预测结果是“对”的数量
"""
self.right_num = right_num
self.pred_right_num = pred_right_num
if self.pred_right_num != 0:
self.P = self.right_num / self.pred_right_num
else:
self.P = 0
计算查全率R
class Recall:
def __init__(self, right_num=0., tar_right_num=0.):
"""
查全率
:param right_num: 真正预测对的数量
:param target_right_num:目标结果是“对”的数量
"""
self.right_num = right_num
self.tar_right_num = tar_right_num
if self.tar_right_num != 0:
self.R = self.right_num / self.tar_right_num
else:
self.R = 0
计算F值
class Fk:
def __init__(self, P=0., R=0., k=1):
"""
F值
:param P: precision
:param R: recall
"""
self.P = P
self.R = R
self.k = k
if (self.k * self.k) * self.P + self.R != 0:
self.Fk = (1 + k) * self.P * self.R / ((self.k * self.k) * self.P + self.R)
else:
self.Fk = 0