1. 程式人生 > >Python3寫精確率(precision)、召回率(recall)以及F1分數(F1_Score)

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)意思表示做出Positive的判定,而且判定是正確的。因此,TP的數值表示正確的Positive判定的個數。 
同理,False Positive(TP)數值表示錯誤的Positive判定的個數。 
依此,True Negative(TN)數值表示正確的Negative判定個數。 
False Negative(FN)數值表示錯誤的Negative判定個數。

 

程式碼實現:

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、F1 Score(F Score,F Measure)

四個概念定義:

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

為什麼要有F1 Score?也稱F1 Mersure,這是因為通常情況下,precision高的話,recall就會低;precision低的時候,recall往往比較高。為了權衡這種關係(tradeoff),所以有了F值。

=1時候,也就是我們常說的F1 Score。

 

程式碼實現:

#請先安裝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)

 

在推薦系統裡實現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