在交叉验证中将参数传递给scikit的score_func

1 投票
1 回答
3295 浏览
提问于 2025-04-18 03:23

我想在使用scikit进行交叉验证时计算微平均精度。

这里的文档:

http://scikit-learn.org/0.10/modules/cross_validation.html

你可以从metrics模块传入一个自定义的评分函数,比如metrics.precision_score:

http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html#sklearn.metrics.precision_score

但是默认情况下,它会为每个类别计算分数。如果我尝试像这样传入 average="micro"

cross_validation.cross_val_score(clf, x, label, cv=5,
score_func=metrics.precision_score(average="micro"))

我收到了以下错误:

TypeError: precision_score() takes at least 2 arguments (1 given)

我无法传入它需要的所有其他参数(y_true, y_pred),因为我不知道 y_pred 是什么。

有没有办法在scikit中通过交叉验证获取微平均精度?

1 个回答

3

这里的问题是,你在调用(带有参数averagemetrics.precision_score,而不是直接传递这个函数本身。一个简单的解决办法是创建一个函数

def micro_average_precision_score(y_true, y_pred):
    metrics.precision_score(y_true, y_pred, average="micro")

然后把它用作你的score_func,也就是说score_func=micro_average_precision_score

另外要注意的是:score_func已经被弃用了(如果我没记错的话,从0.13版本开始)。你参考的是scikit-learn 0.10版本的文档。你用的也是这个版本吗?

现在传递评分函数的新方法是使用评分对象。相关的关键词是scoring=,而不是score_func=。你可以通过使用make_scorer将任何评分函数(比如上面定义的那个)转换成评分对象。

from sklearn.metrics.score import make_scorer
scorer = make_scorer(micro_average_precision_score, greater_is_better=True)

或者,等效地:

scorer = make_scorer(metrics.precision_score, 
                     greater_is_better=True, average="micro")

撰写回答