Python:计算TP,FP,FN和TN

时间:2016-09-27 20:41:42

标签: python machine-learning scikit-learn

我的数据框具有真正的类和类,这是通过某种算法预测的。

     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()。   我该如何解决这个问题,或者可能有更好的决定?

2 个答案:

答案 0 :(得分:1)

发生错误消息是因为Python尝试将数组转换为布尔值并失败。

那是因为您将y_actualy_hat[i]进行了比较。

它应该是y_actual[i] != y_hat[i](代码中的2次)

(我意识到这只是一个错字,但这个消息足够神秘,让问题变得有趣)

虽然我们正在使用它,但您可以通过在单个循环中合并所有计数器并使用枚举来避免至少一次索引访问来提高效率:

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)

答案 1 :(得分:1)

我使用confusion_matrix中的sklearn.metrics并返回需要矩阵。