如何使用Sklearn的cross_validation(多标签分类)获得每个标签的F1分数

时间:2016-06-14 14:31:19

标签: python scikit-learn cross-validation multilabel-classification

我正在尝试使用sklearn的cross_val_score函数(http://scikit-learn.org/stable/modules/cross_validation.html)进行多标签分类。

scores = cross_validation.cross_val_score(clf, X_train, y_train,
        cv = 10, scoring = make_scorer(f1_score, average = None))

我想要返回每个标签的F1分数。这种方式适用于第一次折叠,但在之后发出错误:

ValueError: scoring must return a number, got [ 0.55555556  0.81038961  0.82474227  0.67153285  0.76494024  0.89087657 0.93502377  0.11764706  0.81611208] (<type 'numpy.ndarray'>)

我认为引发此错误是因为cross_val_score需要返回一个数字。有没有其他方法可以使用cross_val_score来获得每个标签的F1分数?

3 个答案:

答案 0 :(得分:1)

我通常使用

from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, classification_report, confusion_matrix
metrics.classification_report(y_test, y_predicted2)

这通常为我提供了评估模型性能所需的所有值。

答案 1 :(得分:0)

我通过在... / scikit-learn / sklearn / cross_validation.py中进行一些更改来解决问题。更具体地说,我评论了这些内容:

1651     if not isinstance(score, numbers.Number):
1652         raise ValueError("scoring must return a number, got %s (%s) instead."
1653                          % (str(score), type(score)))

这消除了检查类型是否为数字,从而允许传递numpy数组。

答案 2 :(得分:0)

这个问题似乎有点老了。但这对于正在寻找多类的类似需求的任何人都是有用的。使用scikit中最新的doc,可学习0.23.1及更高版本;您可以将自己的字典与度量函数一起传递;

custom_scorer = {'accuracy': make_scorer(accuracy_score),
                 'balanced_accuracy': make_scorer(balanced_accuracy_score),
                 'precision': make_scorer(precision_score, average='macro'),
                 'recall': make_scorer(recall_score, average='macro'),
                 'f1': make_scorer(f1_score, average='macro'),
                 }
scores = cross_validation.cross_val_score(clf, X_train, y_train,
        cv = 10, scoring = custom_scorer)