【发布时间】:2018-03-26 12:38:42
【问题描述】:
我有一个多标签数据集,我想通过交叉验证测试确定每个单独标签的 F 值。是否有在 sklearn 或 skmultilearn 中实现的示例代码?它的文档似乎只为整个数据集提供了价值。
【问题讨论】:
标签: scikit-learn cross-validation multilabel-classification
我有一个多标签数据集,我想通过交叉验证测试确定每个单独标签的 F 值。是否有在 sklearn 或 skmultilearn 中实现的示例代码?它的文档似乎只为整个数据集提供了价值。
【问题讨论】:
标签: scikit-learn cross-validation multilabel-classification
你可以使用scikit-learn的分类报告,假设你有y和y_predict
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]
当然,您可以使用 KFolds iterator 并遍历所有折叠并获取每个标签的 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. ])
【讨论】:
np.vstack([cross_val_score(model, X, y[:,i], cv=10, scoring='f1') for i in range(y.shape[1])]) 这样的东西会生成 n_label x 10 形状的数组