分类报告-精度和F分数定义不正确

时间:2019-01-11 16:08:40

标签: python machine-learning scikit-learn classification

我从sklearn.metrics导入了classification_report,当我输入np.arrays作为参数时,出现以下错误:

  

/usr/local/lib/python3.6/dist-packages/sklearn/metrics/classification.py:1135:   UndefinedMetricWarning:精度和F分数定义不正确,   在没有预测样本的标签中将其设置为0.0。 '精确',   “预测”,平均,warn_for)   /usr/local/lib/python3.6/dist-packages/sklearn/metrics/classification.py:1137:   UndefinedMetricWarning:回忆和F得分定义不正确,   在没有真实样本的标签中设置为0.0。 'recall','true',   平均,warn_for)

这是代码:

svclassifier_polynomial = SVC(kernel = 'poly', degree = 7, C = 5)

svclassifier_polynomial.fit(X_train, y_train)
y_pred = svclassifier_polynomial.predict(X_test)


poly = classification_report(y_test, y_pred)

当我过去不使用np.array时,它工作得很好,关于如何纠正此问题的任何想法?

2 个答案:

答案 0 :(得分:4)

这不是错误,只是警告,并不是您的所有标签都包含在table[tr/th[2]/text()="Location"]//tr 中,即y_pred中有一些标签您的分类器从不预言。

这是一个简单的可复制示例:

y_test

from sklearn.metrics import precision_score, f1_score, classification_report y_true = [0, 1, 2, 0, 1, 2] # 3-class problem y_pred = [0, 0, 1, 0, 0, 1] # we never predict '2' precision_score(y_true, y_pred, average='macro') [...] UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. 'precision', 'predicted', average, warn_for) 0.16666666666666666 precision_score(y_true, y_pred, average='micro') # no warning 0.3333333333333333 precision_score(y_true, y_pred, average=None) [...] UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. 'precision', 'predicted', average, warn_for) array([0.5, 0. , 0. ]) 会产生完全相同的警告(未显示)。

这实际上只是警告您,在f1_score中,没有预测样本的标签(此处为classification_report)的各个值将设置为0:

2
  

过去我不使用np.array时效果很好

高度怀疑,因为在上面的示例中,我使用了简单的Python列表,而不是Numpy数组...

答案 1 :(得分:1)

这意味着某些标签仅出现在火车数据中,而某些标签仅出现在测试数据集中。运行以下代码,以了解火车标签和测试标签的分布。

from collections import Counter
Counter(y_train)
Counter(y_test)

使用分层的train_test_split可以消除仅在测试数据集中存在某些标签的情况。

过去可能只是因为数据集的随机拆分而起作用。因此,始终建议进行分层拆分。

第一种情况更多是关于模型微调或模型选择。