如何使用 Sklearn 的 cross_validation(多标签分类)获得每个标签的 F1 分数
How to get F1 score per label using Sklearn's cross_validation (multi-label 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 分数?
我通过对.../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 数组。
这个问题好像有点老了。但这对于任何正在寻找与多类类似需求的人来说都是有用的。用最新的doc scikit learn 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)
我正在尝试使用 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 分数?
我通过对.../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 数组。
这个问题好像有点老了。但这对于任何正在寻找与多类类似需求的人来说都是有用的。用最新的doc scikit learn 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)