Scikit learn 在多标签分类中通过交叉验证评估单个标签的F分数
我有一个多标签数据集,我想通过交叉验证测试确定每个标签的F分数值。有没有在sklearn或skmultilearn中实现的示例代码?它的文档似乎只为整个数据集提供了价值。您可以使用scikit learn的分类报告,假设您有y和y\u预测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
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形阵列