与sklearn一起交叉验证精度、召回率和f1



是否有任何简单的方法来交叉验证分类器并立即计算精度和召回率?目前我使用函数

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

只计算一个度量,所以我必须调用它2次来计算精度和召回率。对于大型ML模型,计算时间不必要地延长了2倍。是否有任何内置的更好的选择,或者我必须自己实现交叉验证?谢谢。

我不确定当前的情况(这个特性已经讨论过了),但是您总是可以使用下面的方法——可怕的——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数组中找到召回值。但是要注意,这个数组是全局的,所以请确保不要以无法解释结果的方式写入它。

eickenberg的答案在 cross_val_score() 的参数n_job设置为1时有效。为了支持并行计算(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 中。

我也搜索了同样的问题,所以我把它留给下一个人。

您可以使用cross_validate。在scoring参数中可以有多个度量名称。

scores = cross_validate(model, X, y, scoring=('precision','recall','f1'), cv=5)

相关内容

  • 没有找到相关文章

最新更新