0

我尝试计算f1_score,但是当我使用sklearn f1_score方法时,我得到了一些警告。如何计算多分数分类的F1分数?

我有一个预测多标签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:召回和F-分数是不明确的和被设置为0.0的标签没有真正样本”

回答

1

它的工作原理,如果你稍加起来数据:

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_scorerecall_score都不为零,所以weighted参数f1_score因此存在。我相信你的情况是无效的,因为在这个例子中缺乏信息。

+0

嗨我的数组与np.zeros((1,5))有形状(1,5)我刚刚写了一个评论给一个例子如何一个样本看起来像但它是实际的形式像这样[[1 ,0,0,0,0] ...]。问题是f1_score与平均值=“微”/“宏”一起工作,但它不与“加权”。所以我的问题是“权重”选项不适用于多标签,还是必须在f1_score函数中设置其他选项,如标签/ pos_label。 –

+0

请阅读答案。您无法使用形状为(1,5)的目标变量。在这种情况下,即使'微'或'宏'平均,你的'f1_score'也不起作用。 –

+0

当我使用ravel来获得形状(5,)时,它将一个值作为一个样本使用,因此它不适用于多标签,例如当我尝试使用平均值=“样本”的形状时,出现错误“基于样本的精度,回忆,fscore在多标签分类之外无效”。我得到了微观和宏观形状(1,5)的工作结果(它们是正确的)唯一的问题是选项average =“weighted” –