Scikit learn 在多标签分类中通过交叉验证评估单个标签的F分数

Scikit learn 在多标签分类中通过交叉验证评估单个标签的F分数,scikit-learn,cross-validation,multilabel-classification,Scikit Learn,Cross Validation,Multilabel Classification,我有一个多标签数据集,我想通过交叉验证测试确定每个标签的F分数值。有没有在sklearn或skmultilearn中实现的示例代码?它的文档似乎只为整个数据集提供了价值。您可以使用scikit learn的分类报告,假设您有y和y\u预测 from sklearn.metrics import classification_report y = [0, 1, 2, 2, 2] y_pred = [1, 0, 2, 2, 1] classes = {'Banana':0,'Apple':1,'Or

我有一个多标签数据集,我想通过交叉验证测试确定每个标签的F分数值。有没有在sklearn或skmultilearn中实现的示例代码?它的文档似乎只为整个数据集提供了价值。

您可以使用scikit learn的分类报告,假设您有y和y\u预测

from sklearn.metrics import classification_report
y = [0, 1, 2, 2, 2]
y_pred = [1, 0, 2, 2, 1]
classes = {'Banana':0,'Apple':1,'Orange':2}
print(classification_report(y, y_pred,target_names=classes.keys()))
输出

             precision    recall  f1-score   support

     Banana       0.00      0.00      0.00         1
      Apple       0.00      0.00      0.00         1
     Orange       1.00      0.67      0.80         3

avg / total       0.60      0.40      0.48         5
或者,您可以使用

print(f1_score(y, y_pred,average=None))
您将在列表中获得标签分数

[ 0.   0.   0.8]
当然,你可以使用一个,通过所有的折叠,得到每个标签的f1,但我不明白你为什么要这样做

在使用交叉验证的情况下,您可以得到每个折叠的f1分数,这是因为分数用于评估模型并选择最佳。请参见下面的示例

from sklearn import svm, datasets
from sklearn.model_selection import cross_val_score
iris = datasets.load_iris()
X, y = iris.data, iris.target
clf = svm.SVC()
cross_val_score(model, X, y, cv=10, scoring='f1_weighted')
将输出10个分数的数组,每折叠1个

array([ 1.        ,  0.93265993,  1.        ,  1.        ,  1.        ,
        0.93265993,  0.93265993,  1.        ,  1.        ,  1.        ])

谢谢你的回答。但我真正要问的是多标签数据(每个标签都有二进制类数据的多个输出(标签))而不是多类数据。因此,确定交叉验证分数的输入应该是多标签数据集的X,y(标签集输出)。使用score=cross_val_score(model,X,y,cv=10,score='f1_-weighted')将返回整个数据集的分数。是否有任何方法可以获得每个标签的分数?我能看到的唯一方法是对y中的每个列(即每组标签)使用交叉验证。类似于
np.vstack([cross_val_score(model,X,y[:,i],cv=10,scoring='f1'),用于范围内的i(y.shape[1]))
这将生成n_标签X 10形阵列