在scikit-learn中为Brier Score Loss创建得分手

时间:2015-04-16 03:07:23

标签: python scikit-learn

我试图在scikit-learn(0.16.1)中使用GridSearchCV和RandomizedSearchCV进行逻辑回归和随机森林分类器(以及可能的其他方法)用于二进制类问题。我设法让GridSearchCV使用标准的LogisticRegression分类器,但我无法使用自定义评分函数(特别是brier_score_loss)使LogisticRegressionCV工作(或RandomForestClassifier的RandomizedGridCV)。我试过这段代码:

lrcv = LogisticRegressionCV(scoring = make_scorer(brier_score_loss, greater_is_better=False, needs_proba=True, needs_threshold=False, pos_label=1))
lrcv_clf = lrcv.fit(X=X_train,y=y_train)

但是我一直得到的错误本质上是说brier_score_loss函数正在接收带有2列的输入(y_prob),从而导致错误(输入形状错误)。有没有办法指定只使用y_prob的第二列(lrcv.predict_proba),以便以这种方式计算Brier分数?我认为pos_label可能会有所帮助,但显然不是。我是否需要避免使用make_scorer并创建自己的评分函数?

感谢您的任何建议!

1 个答案:

答案 0 :(得分:2)

predict_proba为每个预测的y值返回两个概率,第一个约为0,第二个约为1。您应该选择您需要的那个并将其进一步传递给评分函数 我使用简单的代理功能执行此操作:

def ProbaScoreProxy(y_true, y_probs, class_idx, proxied_func, **kwargs):
    return proxied_func(y_true, y_probs[:, class_idx], **kwargs)

可以这样使用:

scorer = metrics.make_scorer(ProbaScoreProxy, greater_is_better=False, needs_proba=True, class_idx=1, proxied_func=metrics.brier_score_loss)

对于二进制分类,class_idx可以是0或1。