在 scikit-learn 中为 Brier Score Loss 创建记分器

Creating scorer for Brier Score Loss in scikit-learn

我正在尝试在 scikit-learn (0.16.1) 中使用 GridSearchCV 和 RandomizedSearchCV 进行逻辑回归,并使用随机森林 classifiers(可能还有其他的)用于二进制 class 问题。我设法让 GridSearchCV 与标准 LogisticRegression classifier 一起工作,但我无法让 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 returns 每个预测 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。