【问题标题】:Cross-validate precision, recall and f1 together with sklearn与 sklearn 一起交叉验证精度、召回率和 f1
【发布时间】:2016-01-31 16:35:02
【问题描述】:

有没有简单的方法来交叉验证分类器并同时计算精度和召回率?目前我使用该功能

cross_validation.cross_val_score(classifier, designMatrix, classes, cv=5, scoring="precision")

但是它只计算一个指标,所以我必须调用它 2 次来计算精度和召回率。对于大型 ML 模型,计算时间会不必要地延长 2 倍。有没有更好的内置选项,还是我必须自己实现交叉验证?谢谢。

【问题讨论】:

  • 这也在github 上进行了讨论。显然有一个 merge 正在关注这个问题。

标签: python scikit-learn


【解决方案1】:

我不确定当前的情况(这个功能已经讨论过了),但你总是可以摆脱以下 - 糟糕 - hack

from sklearn.metrics import recall_score, precision_score
from sklearn.metrics.scorer import make_scorer
recall_accumulator = []
def score_func(y_true, y_pred, **kwargs):
    recall_accumulator.append(recall_score(y_true, y_pred, **kwargs))
    return precision_score(y_true, y_pred, **kwargs)
scorer = make_scorer(score_func)

然后在您的交叉验证中使用scoring=scorer。您应该在recall_accumulator 数组中找到召回值。但请注意,此数组是全局的,因此请确保不要以无法解释结果的方式写入它。

【讨论】:

    【解决方案2】:
    cross_val_score() 的参数 n_job 设置为 1 时,

    eickenberg 的 答案有效。支持并行计算 (n_jobs > 1),必须使用共享列表而不是全局列表。这可以在 multiprocessing 模块中的 Manager 类的帮助下完成。

    from sklearn.metrics import precision_recall_fscore_support
    from sklearn.metrics.scorer import make_scorer
    from multiprocessing import Manager
    
    recall_accumulator = Manager().list()
    def score_func(y_true, y_pred, **kwargs):
        recall_accumulator.append(precision_recall_fscore_support(y_true, y_pred))
        return 0
    scorer = make_scorer(score_func)
    

    然后每次折叠的结果会存储在recall_accumulator中。

    【讨论】:

      猜你喜欢
      • 2017-03-14
      • 2017-05-28
      • 2021-09-01
      • 2017-11-18
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      相关资源
      最近更新 更多