scikit-learn - 如何计算F1分数进行多标签分类?

标签 scikit-learn metrics multilabel-classification precision-recall

我尝试计算f1_score,但是当我使用sklearn f1_score方法时,在某些情况下会收到一些警告。

我有一个预测的多标签5类问题。

import numpy as np
from sklearn.metrics import f1_score

y_true = np.zeros((1,5))
y_true[0,0] = 1 # => label = [[1, 0, 0, 0, 0]]

y_pred = np.zeros((1,5))
y_pred[:] = 1 # => prediction = [[1, 1, 1, 1, 1]]

result_1 = f1_score(y_true=y_true, y_pred=y_pred, labels=None, average="weighted")

print(result_1) # prints 1.0

result_2 = f1_score(y_true=y_ture, y_pred=y_pred, labels=None, average="weighted")

print(result_2) # prints: (1.0, 1.0, 1.0, None) for precision/recall/fbeta_score/support

当我使用average="samples"而不是"weighted"时,我得到了(0.1,1.0,0.1818 ...,无)。 "weighted"选项对多标签问题不是很有用吗?或者我如何正确使用f1_score方法?

使用average="weighted"时,我也会收到警告:

"UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples."

最佳答案

如果您稍微添加数据,它会起作用:

y_true = np.array([[1,0,0,0], [1,1,0,0], [1,1,1,1]])
y_pred = np.array([[1,0,0,0], [1,1,1,0], [1,1,1,1]])

recall_score(y_true=y_true, y_pred=y_pred, average='weighted')
>>> 1.0
precision_score(y_true=y_true, y_pred=y_pred, average='weighted')
>>> 0.9285714285714286

f1_score(y_true=y_true, y_pred=y_pred, average='weighted')
>>> 0.95238095238095244

数据表明我们没有错过任何真实的肯定,也没有预测任何错误的否定(recall_score等于1)。但是,我们在第二次观察中预测到一个假阳性,导致precision_score等于〜0.93。

由于precision_score参数的recall_scoreweighted都不为零,因此存在f1_score。我相信您的案例由于该示例中的信息不足而无效。

关于scikit-learn - 如何计算F1分数进行多标签分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46732881/

相关文章:

machine-learning - 如何更加重视机器学习中的某些特征?

Azure 指标图图例

python - sklearn - 从文本文档预测多标签分类中的前 3-4 个标签

python - 使用 Out of Core 进行 Scikit Learn 多标签分类

scala - 如何在 Flink 中使用多个计数器

keras - Keras中具有类权重的多标签分类

python - 将 SKLearn 癌症数据集加载到 Pandas DataFrame 中

python - "train_test_split(shuffle=False)"和 "TimeSeriesSplit"有什么区别

python - Sklearn Lasso 回归比岭回归差几个数量级?

qt - 查找 Qt QML 文本元素的绘制 X 和 Y 位置(例如左上角)