在 scikit learn 中准备和可视化分类报告时出现错误“FutureWarning: elementwise comparison failed”

Posted

技术标签:

【中文标题】在 scikit learn 中准备和可视化分类报告时出现错误“FutureWarning: elementwise comparison failed”【英文标题】:Error "FutureWarning: elementwise comparison failed" while preparing and visualizing classification report in scikit learn 【发布时间】:2021-03-19 23:51:17 【问题描述】:

我尝试使用this answer 中给出的代码来可视化分类报告。

如果我不包含 classification_report() 的标签,它可以工作:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report 

y_test_1 = np.loadtxt('ytest1.txt')
y_pred_1 = np.loadtxt('ypred1.txt')
_classification_report = classification_report(y_test_1, y_pred_1)

_classification_report = "\n".join(list(_classification_report.split("\n")[i] for i in [0,1,2,3,4,5,6,7,8,9,10,11,12,15]))

plot_classification_report(_classification_report)

可以在this colab notebook 中看到。

但如果我包含标签:

_categories=['blues', 'classical', 'country', 'disco', 'hiphop', 'jazz', 'metal', 'pop', 'reggae', 'rock']

y_test_1 = np.loadtxt('ytest1.txt')
y_pred_1 = np.loadtxt('ypred1.txt')
_classification_report = classification_report(y_test_1, y_pred_1, labels = _categories)

_classification_report = "\n".join(list(_classification_report.split("\n")[i] for i in [0,1,2,3,4,5,6,7,8,9,10,11,12,15]))

plot_classification_report(_classification_report) 

它开始给出以下错误:

F:\ProgramFiles\python\lib\site-packages\numpy\lib\arraysetops.py:565: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  mask &= (ar1 != a)
F:\ProgramFiles\python\lib\site-packages\sklearn\metrics\_classification.py:1221: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))
F:\ProgramFiles\python\lib\site-packages\sklearn\metrics\_classification.py:1221: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))
F:\ProgramFiles\python\lib\site-packages\sklearn\metrics\_classification.py:1221: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))
F:\ProgramFiles\python\lib\site-packages\sklearn\metrics\_classification.py:1221: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 due to no true samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))

我不知道这里的确切原因是什么。它可能是以下两种之一:

    这可能是因为 numpy 中的 this 错误。 我的 txt 文件包含数字数据,实际上是编码格式的类别。例如,blues 是 0,classical 是 1 等等。这就是它可能失败的原因。在其他模型中,y_testy_pred 直接包含每个测试数据样本的类别(如str),它可以工作: 我觉得重要的是指定标签的顺序。但如果不是这种情况,我是否必须将编码后的数字显式转换回类别?标准方法是什么?

您可以找到ytest1.txtypred1.txt here。

【问题讨论】:

【参考方案1】:

我错误地认为classification_reportlabels 参数接受要在图形上显示的标签,因为我没有意识到它对数据执行过滤。我觉得它只是将标签放在输出图像中(因为我觉得文档对labels 的功能有点模棱两可)。考虑到我可能错了,我尝试将编码的标签转换为原始形式。

我进行如下编码:

from sklearn.preprocessing import LabelEncoder
y = #load data set...
y = encoder.fit_transform(y)

使用相同的encoder 对象,我使用其inverse_transform() 方法获得原始标签,如下所示:

if y_test.dtype == 'int32' or y_test.dtype == 'int64':
    _classification_report = classification_report(encoder.inverse_transform(y_test), encoder.inverse_transform(y_pred), labels=_categories)

如果有更标准的方法,请告诉我。

【讨论】:

以上是关于在 scikit learn 中准备和可视化分类报告时出现错误“FutureWarning: elementwise comparison failed”的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scikit Learn SVM 为文本分类准备数据

机器学习实战----使用Python和Scikit-Learn构建简单分类器

[机器学习与scikit-learn-38]:算法-分类-支持向量机-通过等高线可视化决策边界线和隔离带

scikit-learn决策树算法类库使用小结

机器学习系列7 基于Python的Scikit-learn库构建逻辑回归模型

[机器学习与scikit-learn-35]:算法-分类-支持向量机-线性分类代码示例