在scikit-learn中为Brier得分损失创建得分手



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

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而只创建自己的评分函数?

感谢您的任何建议!

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。

相关内容

  • 没有找到相关文章

最新更新