了解sklearn GridSearchCV的best_score_和best_estimator_

时间:2017-11-03 10:24:13

标签: python machine-learning scikit-learn statistics cross-validation

在下面的代码中,我试图了解best_estimator_best_score_之间的联系。我认为通过对best_score_的结果进行评分,我应该能够(至少非常接近)得到best_estimator_

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import log_loss

classifier = GridSearchCV(LogisticRegression(penalty='l1'),
                          {'C':10**(np.linspace(1,6,num=11))},
                          scoring='neg_log_loss')

classifier.fit(X_train, y_train)

y_pred = classifier.best_estimator_.predict(X_train)
print(f'{log_loss(y_train,y_pred)}') 
print(f'{classifier.best_score_}')

但是我得到以下输出(不同运行的数字变化不大):

7.841241697018637
-0.5470694752031108

我知道best_score_将被计算为交叉验证迭代的平均值,但是这肯定是计算整个集合上的度量的近似近似(无偏估计量?)。我不明白为什么他们如此不同,所以我认为我已经犯了一个实现错误。

我如何自己计算classifier.best_score_

1 个答案:

答案 0 :(得分:1)

Log_loss主要定义为predict_proba()。 我假设GridSearchCV在内部调用predict_proba然后计算得分。

请将predict()更改为predict_proba(),您会看到类似的结果。

y_pred = classifier.best_estimator_.predict_proba(X)

print(log_loss(y_train,y_pred)) 
print(classifier.best_score_)

在虹膜数据集上,我得到以下输出:

0.165794760809
-0.185370083771

看起来非常接近。

更新

看起来就是这种情况:当您将'loss_loss'作为字符串提供给GridSearchCV时,this is how将其初始化为记分员,然后传递给_fit_and_score() method of GridSearchCV()

log_loss_scorer = make_scorer(log_loss, greater_is_better=False,
                              needs_proba=True)

如你所见,needs_proba为真,意味着将使用得分predict_proba()。