在书上看见Python代码说是可以求出查准率(precision)和查全率(recall),我想了半天才得知这个逻辑,写出来记录一下
代码如下,从唐亘老师的《精通数据科学:从线性回归到深度学习》这本书中转载
def evaluation(re):
"""
计算预测结果的查准查全率以及f1
参数
----
re :DataFrame,预测结果,里面包含两列:真实值‘lable_code’、预测值‘pred’
"""
bins = np.array([0, 0.5, 1])
label = re["label_code"]
pred = re["pred"]
tn, fp, fn, tp = np.histogram2d(label, pred, bins=bins)[0].flatten()
precision = tp / (tp + fp) # 0.707
recall = tp / (tp + fn) # 0.374
f1 = 2 * precision * recall / (precision + recall) # 0.490
print("查准率: %.3f, 查全率: %.3f, f1: %.3f" % (precision, recall, f1))
这其中 np.histogram2d(label,pred,bins=bins)[0].flatten() 这段最难理解
以下部分是从scipy官方文档中得知的
https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram2d.html
np.histogram2d 这个函数是计算两个样本的二维直方图
以此类推 np.histogram就是一维直方图
np.histogramdd就是多维直方图
label就是x轴的一维数据,pred是y轴的一维数据
再说明一下label是逻辑回归的因变量,取值为0和1
pred是逻辑回归的预测值,取值范围是(0,1)
bins=[0,0.5,1]就设置的x轴和y轴的取值范围
tn为x轴为[0,0.5],y轴为[0,0.5]的个数;
fp为x轴为[0,0.5],y轴为(0.5,1]的个数;
tn为x轴为(0.5,1],y轴为[0,0.5]的个数;
tp为x轴为(0.5,1],y轴为(0.5,1]的个数
...[0].flatten()是取前一个二维二列的数组变为一维多列,因为这个函数的结果后面还会自带array([0. , 0.5, 1. ]), array([0. , 0.5, 1. ])两个这样的数组
同时还得知这个函数的参数bins的值还可以录入shape(2,2)的数据默认设置为[[xmin,xmax],[ymin,ymax]]
还有一个参数density(别名normed)默认为False,设置为Ture的时候计算的就是bin_个数/样本总数/图形区域(就是密度的意思)