Scikit-learn f1_score 用于字符串列表

Scikit-learn f1_score for list of strings

有没有什么方法可以将标签列表的 f1_score 计算为字符串,而不考虑它们的顺序?

f1_score(['a','b','c'],['a','c','b'],average='macro')

我希望这个 return 1 而不是 0.33333333333

我知道我可以对标签进行矢量化处理,但就我而言,这种语法会简单得多,因为我要处理很多标签

您需要的是用于多标签 class 化任务的 f1_score,为此您需要形状为 y_truey_pred 的二维矩阵 [n_samples, n_labels].

您目前仅提供一维数组。因此,它将被视为多 class 问题,而不是多标签问题。

official documentation 提供了必要的详细信息。

为了正确评分,您 需要y_truey_pred 转换为标签指示器矩阵 documented here

y_true : 1d array-like, or label indicator array / sparse matrix

y_pred : 1d array-like, or label indicator array / sparse matrix

所以你需要像这样更改代码:

from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.metrics import f1_score

y_true = [['a','b','c']]
y_pred = [['a','c','b']]

binarizer = MultiLabelBinarizer()

# This should be your original approach
#binarizer.fit(your actual true output consisting of all labels)

# In this case, I am considering only the given labels.
binarizer.fit(y_true)

f1_score(binarizer.transform(y_true), 
         binarizer.transform(y_pred), 
         average='macro')

Output:  1.0

您可以在此处查看 MultilabelBinarizer 的示例: