簡體   English   中英

Python:計算 TP、FP、FN 和 TN

[英]Python: count TP, FP, FN и TN

我有真正的類和類的數據框,這是由某種算法預測的。

     true  pred
0       1     0
1       1     1
2       1     1
3       0     0
4       1     1

我嘗試使用

def classification(y_actual, y_hat):
    TP = 0
    FP = 0
    TN = 0
    FN = 0

    for i in range(len(y_hat)): 
        if y_actual[i] == y_hat[i] == 1:
           TP += 1
    for i in range(len(y_hat)): 
        if y_actual[i] == 1 and y_actual != y_hat[i]:
           FP += 1
    for i in range(len(y_hat)): 
        if y_actual[i] == y_hat[i] == 0:
           TN += 1
    for i in range(len(y_hat)): 
        if y_actual[i] == 0 and y_actual != y_hat[i]:
           FN += 1

    return(TP, FP, TN, FN)

但它回報我

ValueError:系列的真值不明確。 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。 我該如何解決這個問題,或者有更好的決定?

出現錯誤消息是因為 Python 嘗試將數組轉換為布爾值並失敗。

那是因為您將y_actualy_hat[i]進行比較。

它應該是y_actual[i] != y_hat[i] (代碼中的 2 次)

(我意識到這只是一個錯字,但該消息足夠神秘,使問題變得有趣)

在此期間,您可以通過將所有計數器合並在一個循環中並使用 enumerate 避免至少一次按索引訪問來制定更高效的例程:

def classification(y_actual, y_hat):
    TP = 0
    FP = 0
    TN = 0
    FN = 0

    for i,yh in enumerate(y_hat): 
        if y_actual[i] == yh == 1:
           TP += 1
        if y_actual[i] == 1 and y_actual[i] != yh:
           FP += 1
        if y_actual[i] == yh == 0:
           TN += 1
        if y_actual[i] == 0 and y_actual[i] != yh:
           FN += 1

    return(TP, FP, TN, FN)

你會看到,通過這種方式,它甚至可以被進一步簡化,通過測試和分支進行大量削減:

def classification(y_actual, y_hat):
    TP = 0
    FP = 0
    TN = 0
    FN = 0

    for i,yh in enumerate(y_hat): 
        if y_actual[i] == yh:
           if yh == 1:
               TP += 1
           elif yh == 0:
               TN += 1
        else: # y_actual[i] != yh
           if y_actual[i] == 1 and :
              FP += 1
           elif y_actual[i] == 0:
              FN += 1

    return(TP, FP, TN, FN)

我使用sklearn.metrics confusion_matrix sklearn.metrics ,它返回我需要的矩陣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM