인프런 커뮤니티 질문&답변

동규김님의 프로필 이미지
동규김

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

hyperopt를 이용한 하이퍼파라미터 튜닝

작성

·

512

0

선생님, 안녕하세요. hyperopt 파트 공부하다가 의문점이 있어서 글을 남깁니다.

 

page. 264 코드에서 xgb_clf = XGBClassifier()로 모델을 선언하는 부분에서 eval_metric='logloss'를 넣는 이유가 궁금합니다. eval_metric='logloss'를 안쓰고 나머지 코드만 돌려도 잘돌아가고, 뒤에 산탄데르 실습 page 272에서는 eval_metric='auc'를 안쓴걸로 확인이 되는데

이전에 xgboost 버전 업그레이드 전 warning 메시지를 없애기 위해서 넣은것 같다고 생각을 하고있습니다. 현 버전에는 모델 선언시 eval_metric를 안써도 잘 돌아가는데

제가 생각하는게 맞는건가요?

답변 1

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

eval_metric을 넣은 이유는 검증 데이터에 evaluation(평가)를 iteration 별로 수행하면서 evaluation 지표가 좋아지는 방향성으로 XGBoost가 최적으로 학습시키기 위해서 입니다.

XGBClassifier에서는 logloss와 auc만 evaluation metric으로 지원이 되는데,

위스콘신 암 데이터로는 정확도 평가 지표 최적화를 진행하려는데 정확도는 eval_metric이 지원되지 않아서 log_loss를 적용한 것이고, 산탄데르는 roc auc 평가 지표 최적화를 위해서 eval_metric으로 auc를 적용하였습니다.

책의 page 272에는 eval_metric을 기재하는 부분이 없습니다. 273 page를 보시면 xgb_clf.fit()에서 eval_metric을 auc로 적용합니다.

그리고 아마 개정판 책이 나올 시점은 Xgboost는 말씀하신 대로 eval_metric에 logloss등을 지정하지 않으면 warning이 나왔던 걸로 기억합니다. 하지만 eval_metric은 상황이 허락한다면 명시해 주는 것이 좋습니다. XGBoost가 조금이라도 해당 eval_metric을 최적화 하는 방향성으로 학습을 진행하기 때문입니다.

감사합니다.

동규김님의 프로필 이미지
동규김
질문자

선생님, 답변 감사합니다.

그래도 잘 이해가 안가는데 cross_val_score는 early stopping이 지원되지 않아서, 산탄 데이터에서는 kfold로 적용후 fit을 할 때 early stopping을 사용하면서 평가지표로 eval_metric을 auc로 지정했습니다. 그러면 검증 데이터를 iteration 별로 확인이 가능하고

 

앞 실습에서 위스콘신 암 데이터는 cross_val_score를 사용함으로써 검증 데이터 iteration별로 확인이 불가능한데 굳이 page. 264 코드에서 xgb_clf = XGBClassifier()로 모델을 선언하는 부분에서 eval_metric='logloss'을 넣는지 궁금합니다(산탄 데이터의 경우 모델 선언시 eval_metric 코드 안쓰고, fit()을 할 때 eval_metric 지정). 검증 데이터 이터레이션 별로 확인이 불가능한데 넣는 이유가 있나요? 물론 cross_val_score로 학습데이터로 다시 학습, 검증으로 데이터가 나눠지긴 하는데 cross_val_score는 조기중단 기능이 없는데...

선생님 답변이 이해가 갈랑 말랑합니다 ,죄송합니다

권 철민님의 프로필 이미지
권 철민
지식공유자

굳이 page. 264 코드에서 xgb_clf = XGBClassifier()로 모델을 선언하는 부분에서 eval_metric='logloss'을 넣는지 궁금합니다

=> cross_val_score()사용시 eval_metric을 안넣으셔도 됩니다. 다만 보통은 cross_val_score() 방식 보다는 eval_metric을 활용하기 위해 kfold 방식으로 적용하는게 보다 더 일반적입니다. 굳이 cross_val_score냐 kfold냐에 따라 eval_metric을 넣느냐 마느냐를 구분할 필요는 없을 것 같습니다만, 가능하다면 eval_metric을 넣어주시면 좋을 것 같습니다.

 

동규김님의 프로필 이미지
동규김
질문자

답변 정말 감사합니다!

동규김님의 프로필 이미지
동규김

작성한 질문수

질문하기