【问题标题】:Classification Report - Precision and F-score are ill-defined分类报告 - 精度和 F 分数不明确
【发布时间】:2026-01-22 22:30:01
【问题描述】:

我从 sklearn.metrics 导入了分类报告,当我输入我的 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。 “回忆”、“真实”、 平均,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 时它工作得很好,关于我如何纠正这个问题的任何想法?

【问题讨论】:

    标签: python machine-learning scikit-learn classification


    【解决方案1】:

    这不是错误,只是一个警告,并非所有标签都包含在您的y_pred 中,即您的y_test 中有一些标签是您的分类器永远无法预测的。 p>

    这是一个简单的可重现示例:

    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 中,没有预测样本的标签(此处为 2)的相应值将设置为 0:

    print(classification_report(y_true, y_pred))
    
    
                  precision    recall  f1-score   support
    
               0       0.50      1.00      0.67         2
               1       0.00      0.00      0.00         2
               2       0.00      0.00      0.00         2
    
       micro avg       0.33      0.33      0.33         6
       macro avg       0.17      0.33      0.22         6
    weighted avg       0.17      0.33      0.22         6
    
    [...] UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. 
      'precision', 'predicted', average, warn_for)
    

    当我过去不使用 np.array 时,它工作得很好

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

    【讨论】:

      【解决方案2】:

      这意味着某些标签仅存在于训练数据中,而某些标签仅存在于测试数据集中。运行以下代码,了解训练和测试标签的分布情况。

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

      使用分层 train_test_split 来摆脱某些标签仅存在于测试数据集中的情况。

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

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

      【讨论】:

      • 如果即使使用分层拆分也出现此错误,我是否应该尝试增加数据集和/或调整模型的超参数以解决此问题?跨度>