我试图在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并创建自己的评分函数?
感谢您的任何建议!
答案 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。