在交叉验证中将参数传递给scikit的score_func
我想在使用scikit进行交叉验证时计算微平均精度。
这里的文档:
http://scikit-learn.org/0.10/modules/cross_validation.html
你可以从metrics模块传入一个自定义的评分函数,比如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
这里的问题是,你在调用(带有参数average
)metrics.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")