我正在尝试在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。