【问题标题】:finding class-wise accuracy in pandas using value_counts()使用 value_counts() 在 pandas 中查找分类精度
【发布时间】:2020-05-26 04:17:56
【问题描述】:

我在 pandas 数据框中有两列:label(ground truth)和 pred(模型预测)。我在标签中有 4 个类:狗、猫、大象和蛇。我想要的是每类预测的准确性或精确度。例如,如果我有以下数据框:

label    pred
dog      cat
elephant elephant
dog    snake
cat     cat
snake   snake
snake   cat
dog    dog

我所做的是对每个类使用 value_counts,然后手动插入比率以获得 pandas 的准确性。问题是 value_counts 是按原始计数排序的,因此 label 和 pred 的顺序可能不同。

numerators = df[pred].value_counts()
   denominators = df[label].value_counts()

然后我得到输出:

 dog    0.33
  cat   1
  snake  0.5
  elephant 1 

有没有办法在 pandas 中实现自动化?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    Ben 的回答可以迅速解决您的问题。我只想添加混淆矩阵:

    confusion_matrix = (df.groupby('label')['pred']
                          .value_counts(normalize=True)
                          .unstack(fill_value=0)
                       )
    

    输出:

    pred           cat       dog  elephant     snake
    label                                           
    cat       1.000000  0.000000       0.0  0.000000
    dog       0.333333  0.333333       0.0  0.333333
    elephant  0.000000  0.000000       1.0  0.000000
    snake     0.500000  0.000000       0.0  0.500000
    

    【讨论】:

    • 谢谢,所以这里的 groupy 确保我们只为每个“label”组获得“pred”的计数?
    • @vkaul11 是的,它是正确的。所以任何行的总和都是1
    【解决方案2】:

    您可以检查两列在哪里相等,然后groupby 第一列和mean

    print (df['label'].eq(df['pred']).groupby(df['label']).mean())
    label
    cat         1.000000
    dog         0.333333
    elephant    1.000000
    snake       0.500000
    dtype: float64
    

    【讨论】:

      【解决方案3】:

      让我们试试pd.crosstab,得到矩阵后,我们可以做热图看看相关性

      pd.crosstab(df.label,df.pred,normalize='index')
      pred           cat       dog  elephant     snake
      label                                           
      cat       1.000000  0.000000       0.0  0.000000
      dog       0.333333  0.333333       0.0  0.333333
      elephant  0.000000  0.000000       1.0  0.000000
      snake     0.500000  0.000000       0.0  0.500000
      

      【讨论】:

      【解决方案4】:

      由于您要求准确性或精确度,我建议使用sklearn.metrics.classification_report

      from sklearn.metrics import classification_report
      
      print(classification_report(df['label'].values, df['pred'].values))
      

      【讨论】:

      • 确实非常有用的包。
      猜你喜欢
      • 2017-04-02
      • 2021-03-15
      • 2018-11-08
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      相关资源
      最近更新 更多