Python3写精确率(precision)、召回率(recall)以及F1分数(F1_Score)

1. 四个概念定义:TP、FP、TN、FN

先看四个概念定义: 
- TP,True Positive 
- FP,False Positive 
- TN,True Negative 
- FN,False Negative

如何理解记忆这四个概念定义呢?

举个简单的二元分类问题 例子:

假设,我们要对某一封邮件做出一个判定,判定这封邮件是垃圾邮件、还是这封邮件不是垃圾邮件?

如果判定是垃圾邮件,那就是做出(Positive)的判定; 
如果判定不是垃圾邮件,那就做出(Negative)的判定。

True Positive(TP):预测为正,判断正确;
False Positive(FP):预测为正,判断错误;
True Negative(TN):预测为负,判断正确;
False Negative(FN):预测为负,判断错误。

 

代码实现:

import numpy as np

y_true = np.array([0, 1, 1, 0, 1, 0])
y_pred = np.array([1, 1, 1, 0, 0, 1])

#true positive
TP = np.sum(np.logical_and(np.equal(y_true,1),np.equal(y_pred,1)))
print(TP)

#false positive
FP = np.sum(np.logical_and(np.equal(y_true,0),np.equal(y_pred,1)))
print(FP)

#true negative
TN = np.sum(np.logical_and(np.equal(y_true,1),np.equal(y_pred,0)))
print(TN)

#false negative
FN = np.sum(np.logical_and(np.equal(y_true,0),np.equal(y_pred,0)))
print(FN)

2. Precision、Recall、Accuracy、Error rate、F1 Score(F Score,F Measure)

五个概念定义:

- precision = TP / (TP + FP)
- recall = TP / (TP + FN)
- accuracy = (TP + TN) / (TP + FP + TN + FN)
- error rate =  (FN + FP) / (TP + FP + TN + FN)
- F1 Score = 2*P*R/(P+R),其中P和R分别为 precision 和 recall

为什么要有F1 Score?也称F1 Measure,这是因为通常情况下,precision高的话,recall就会低;precision低的时候,recall往往比较高。为了权衡这种关系(tradeoff),所以有了F值。

=1时候,也就是我们常说的F1 Score。

 

此外,还有TPR(True Positive Rate,纵轴)与FPR(False Positive Rate,横轴)构成的ROC(Receiver Operating Characteristic)曲线,以及AUC(Area Under Curve),即ROC曲线下面的面积。
- TPR = Recall = TP / (TP + FN)
- FPR = FP / (TN + FP)

还有Precision(纵轴)和Recall(横轴)形成的PR曲线

 

代码实现:

#请先安装sklearn、numpy库
from sklearn.metrics import precision_score, recall_score, f1_score
import numpy as np

y_true = np.array([[0, 1, 1],
                   [0, 1, 0]])
y_pred = np.array([[1, 1, 1],
                   [0, 0, 1]])

y_true = np.reshape(y_true, [-1])
y_pred = np.reshape(y_pred, [-1])

p = precision_score(y_true, y_pred, average='binary')
r = recall_score(y_true, y_pred, average='binary')
f1score = f1_score(y_true, y_pred, average='binary')

print(p)
print(r)
print(f1score)

 

3.在推荐系统里实现precision、recall以及F1 Score:

R(u)表示根据用户在训练集上的行为给用户做出的Top-n推荐列表,

T(u)表示系统向用户推荐物品后,用户实际选择的物品集

 

 

def Precision_Recall_F1Score(train,test,N):
    hit = 0
    n_recall = 0
    n_precision = 0
    for user in train.keys():
        tu = test[user]
        rank = Recommend(user,N)
        for item ,pui in rank:
            if item in tu:
                hit += 1
        n_recall += len(tu)
        n_precision += N
    recall = hit / (1.0 * n_recall)
    precision = hit / (1.0 * n_precision)
    F1 = (2 * precision * recall) / (precision + recall)
    return [precision, recall, F1]

其中Recommend()函数为推荐算法,本文仅给出使用precision,recall以及F值来作为评测指标的代码实现部分

 

 

参考文献:

[1] https://www.cnblogs.com/jiangyi-uestc/p/6044282.html

[2] https://blog.csdn.net/blythe0107/article/details/75003890

[3] 项亮,陈义,王益,推荐系统实践[M]. 河北:人民邮电出版社, 2012:26-43

 

  • 20
    点赞
  • 154
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值