我正在尝试使用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分数?
答案 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)