【问题标题】:Python: count TP, FP, FN и TNPython:计算 TP、FP、FN 和 TN
【发布时间】:2017-02-05 15:11:11
【问题描述】:

我有真正的类和类的数据框,是由某种算法预测的。

     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:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。 我该如何解决这个问题,或者也许有更好的决定?

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    我使用来自sklearn.metricsconfusion_matrix,它返回我需要的矩阵。

    【讨论】:

      【解决方案2】:

      出现错误消息是因为 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)
      

      【讨论】:

      • 但在第一种和第三种情况下应该相等,但在第一种情况下等于1,但在第三种情况下等于0
      • @Petr 你没有抓住重点,Jean 只是在指出一个明显的错误——你在两行末尾忘记了[i]。修复它,它会按预期工作。
      猜你喜欢
      • 2021-03-31
      • 2021-03-01
      • 2021-04-17
      • 2015-03-13
      • 2017-09-27
      • 2019-06-16
      • 2021-05-04
      • 2015-01-05
      • 2021-08-29
      相关资源
      最近更新 更多