【问题标题】:How to get F1 score per label using Sklearn's cross_validation (multi-label classification)如何使用 Sklearn 的 cross_validation(多标签分类)获得每个标签的 F1 分数
【发布时间】:2016-10-15 08:37:43
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

我通过在 .../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】:

    似乎这个问题有点老了。但这对于正在寻找具有多类的类似要求的任何人都将很有用。用最新的doc in 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)
    
    

    【讨论】:

    • 原始问题要求每个标签的分数,而不是平均值。
    • 我从来没有提到过平均值。这是关于使用scoring 参数传递您自己的记分员
    • average='macro'
    猜你喜欢
    • 2018-03-25
    • 2017-12-30
    • 2020-08-21
    • 2019-10-12
    • 2016-05-09
    • 2020-02-22
    • 2016-08-05
    • 2022-01-20
    • 2018-09-11
    相关资源
    最近更新 更多