0

以下のコードでは、best_estimator_best_score_の間の接続を理解しようとしています。私はそうのようなbest_estimator_の結果を採点することによってbest_score_に(少なくとも非常に近い近似値)を取得することができるはずだと思う:sklearnについてGridSearchCVの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

Log_lossは、ほとんどpredict_proba()に定義されています。 私は、GridSearchCVが内部的にpredict_probaを呼び出していて、スコアを計算していると仮定しています。

predict()predict_proba()に変更してください。同様の結果が表示されます。かなり近くに見える

0.165794760809 
-0.185370083771 

アイリスデータセットで
y_pred = classifier.best_estimator_.predict_proba(X) 

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

、私は次の出力を取得しています。

アップデート:これが事実であるように

が見える:

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

することができますように:あなたはGridSearchCVに文字列として'loss_loss'を供給すると、this is howはその_fit_and_score() method of GridSearchCV()に渡されるスコアラーとして初期化needs_probaがtrueの場合、predict_proba()のスコアリングに使用されます。

+1

もちろん!ありがとう!スコアは今では '0.4930534590910885' ' -0.5471970784999165'ですが、それでもまだ10%オフですが、サンプルサイズと折り返し数によって影響を受けているようですが、 – Dan

+0

@ダンはい、そうです。それでもスコアを正確に一致させるには、classifier.best_params_でLogisticRegressionオブジェクトをインスタンス化し、cross_val_score(logReg、X_train、y_train、scoring = 'neg_log_loss')の結果の平均を取ることができます。しかし、必ずrandom_stateを設定してください。 cross_val_scoreとGridSearchCVは、明示的に設定されていない場合、同じCV戦略を使用します。 –

関連する問題