classification_report:labels和target_names

时间:2018-01-29 01:46:37

标签: python scikit-learn classification

我有以下分类报告的输出:

             precision    recall  f1-score   support

          0     0.6772    0.5214    0.5892       491
          1     0.8688    0.9273    0.8971      1678

avg / total     0.8254    0.8354    0.8274      2169

数据集中的真实标签为sp

问题:我如何知道哪个标签为“0”且哪个为“1”?或者:如何以正确的顺序通过labels=target_names=分配标签?

3 个答案:

答案 0 :(得分:2)

如果没有另外说明,它将按字母顺序排列。所以最有可能的是:

0 - > 'P'

1 - > 'S'

无论如何,如果您传递实际标签,它们应该按原样显示。例如:

y_true = ['p', 's', 'p', 's', 'p']
y_pred = ['p', 'p', 's', 's', 'p']

print(classification_report(y_true, y_pred))

Output:
             precision    recall  f1-score   support

          p       0.67      0.67      0.67         3
          s       0.50      0.50      0.50         2

avg / total       0.60      0.60      0.60         5

所以不需要做任何事情。但是,如果您更改了标签,则可以在target_names参数中传递它们以显示在报告中。

假设您已将'p'转换为0并将's'转换为1,那么您的代码将变为:

y_true = [0, 1, 0, 1, 0]
y_pred = [0, 0, 1, 1, 0]

# Without the target_names
print(classification_report(y_true, y_pred))

          0       0.67      0.67      0.67         3
          1       0.50      0.50      0.50         2

avg / total       0.60      0.60      0.60         5

#With target_names
print(classification_report(y_true, y_pred, target_names=['p', 's']))

          p       0.67      0.67      0.67         3
          s       0.50      0.50      0.50         2

avg / total       0.60      0.60      0.60         5

答案 1 :(得分:1)

您可以使用分类器的classes_属性来获取标签列表,并对它们进行数组索引。

  

classes_:shape = [n_classes]的数组或此类数组的列表

     

类标签(单输出问题)或数组列表   类标签(多输出问题)。

答案 2 :(得分:1)

如果您使用sklearn.preprocess.LabelEncoder编码原始标签,则可以使用inverse_transform来获取原始标签

target_strings = label_encoder.inverse_transform(np.arange(num_classes))
metrics.classification_report(dev_gold, dev_predicted, target_names=target_strings)