[英]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_actual
與y_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.