0

아래 코드에서 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_}') 

는 (숫자가 다른에 많은 변화하지 않는 : 나는 best_score_에 (매우 가까운 근사치 이상)과 같이 best_estimator_의 결과를 점수로 내가 얻을 수 있어야한다고 생각)를 실행합니다 :

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_) 

, 나는 다음과 같은 출력을 얻고있다.

업데이트 :

은 다음과 같습니다

는 경우입니다 : 당신은 GridSearchCV, this is how에 문자열로 'loss_loss'를 제공하면 자사의 득점이 _fit_and_score() method of GridSearchCV()에 전달 될 수로 초기화 :

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

당신이 할 수 needs_proba이 참이면 predict_proba()가 채점된다는 의미입니다.

+1

물론! 감사! 점수는 이제 0.4930534590910885' '-0.5471970784999165'에 훨씬 가까워졌습니다. 그래도 여전히 ~ 10 % 할인되었지만, 표본 크기와 폴드 수에 따라 달라집니다. – Dan

+0

@ Dan 예, 그렇게 생각합니다. 점수를 정확히 일치 시키려면 classifier.best_params_를 사용하여 LogisticRegression 객체를 인스턴스화 한 다음 cross_val_score (logReg, X_train, y_train, scoring = 'neg_log_loss')의 결과 평균을 취하십시오. 그래도 random_state를 설정해야합니다. cross_val_score와 GridSearchCV는 명시 적으로 설정되지 않은 경우 동일한 CV 전략을 사용합니다. –