• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

조기중단기능(early stopping) 질문

23.06.01 12:22 작성 조회수 169

0

안녕하세요.

좋은 강의 덕분에 많이 배우고 있습니다.

 

XGBoost를 이용한 위스콘신 유방암 예측 강의에서

early stopping 기능에 대해서 설명 주셨고,

이는 검증 데이터를 기반으로 중단 할지 말지 판단한다고 이해했습니다.

또한, 아래와 같이 학습 데이터, 검증 데이터 loss 값을 출력하여

확인해보면서, 검증 데이터가 더이상 감소하지 않는 구간이 있고

설정한 early stopping 값만큼 감소하지 않는다면

중단한하고 이해했습니다.

예제를 보면 train-logloss는 계속해서 감소하고

eval-logloss는 감소하지 않는 구간이 있는데

똑같은 데이터를 나눈 것인데 차이가 발생하는 이유가

궁금합니다!

[0]	train-logloss:0.65016	eval-logloss:0.66183
[1]	train-logloss:0.61131	eval-logloss:0.63609
[2]	train-logloss:0.57563	eval-logloss:0.61144
[3]	train-logloss:0.54310	eval-logloss:0.59204

강의에서 설명 주실때 학습 데이터는 계속해서 loss가

감소해서 오버피팅의 위험이 있기 때문에 early stopping은

검증 데이터로 진행해야 한다고 하셔서 이부분이 궁금합니다.

 

감사합니다.

 

답변 2

·

답변을 작성해보세요.

0

zcx6263님의 프로필

zcx6263

질문자

2023.06.02

안녕하세요.

아래 코드에서 eval_list 는 학습 데이터와 검증 데이터가 담겨 있고,

evals 파라미터에 이를 추가했습니다.

# 학습 데이터 셋은 'train' 또는 평가 데이터 셋은 'eval' 로 명기합니다. 
eval_list = [(dtr,'train'),(dval,'eval')] # 또는 eval_list = [(dval,'eval')] 만 명기해도 무방. 

# 하이퍼 파라미터와 early stopping 파라미터를 train( ) 함수의 파라미터로 전달
xgb_model = xgb.train(params = params , dtrain=dtr , num_boost_round=num_rounds , \
                      early_stopping_rounds=50, evals=eval_list )

이를 실행하여 출력값을 확인해 보면 train-logloss는 계속 감소하고 있고, eval-logloss는 126번

부터 더 이상 감소하지 않습니다.

evals 파라미터에 학습과 검증 데이터를 모두 넣었는데 한쪽만 감소하는 이유가 궁금했습니다!

[126]	train-logloss:0.01973	eval-logloss:0.25587
[127]	train-logloss:0.01946	eval-logloss:0.25640
[128]	train-logloss:0.01927	eval-logloss:0.25685
[129]	train-logloss:0.01908	eval-logloss:0.25665
[130]	train-logloss:0.01886	eval-logloss:0.25712
[131]	train-logloss:0.01863	eval-logloss:0.25609
[132]	train-logloss:0.01839	eval-logloss:0.25649
[133]	train-logloss:0.01816	eval-logloss:0.25789
[134]	train-logloss:0.01802	eval-logloss:0.25811
[135]	train-logloss:0.01785	eval-logloss:0.25794
[136]	train-logloss:0.01763	eval-logloss:0.25876
[137]	train-logloss:0.01748	eval-logloss:0.25884
[138]	train-logloss:0.01732	eval-logloss:0.25867
[139]	train-logloss:0.01719	eval-logloss:0.25876
[140]	train-logloss:0.01696	eval-logloss:0.25987
[141]	train-logloss:0.01681	eval-logloss:0.25960
[142]	train-logloss:0.01669	eval-logloss:0.25982
[143]	train-logloss:0.01656	eval-logloss:0.25992
[144]	train-logloss:0.01638	eval-logloss:0.26035
[145]	train-logloss:0.01623	eval-logloss:0.26055
[146]	train-logloss:0.01606	eval-logloss:0.26092
[147]	train-logloss:0.01589	eval-logloss:0.26137
[148]	train-logloss:0.01572	eval-logloss:0.25999
[149]	train-logloss:0.01557	eval-logloss:0.26028
[150]	train-logloss:0.01546	eval-logloss:0.26048
[151]	train-logloss:0.01531	eval-logloss:0.26142
[152]	train-logloss:0.01515	eval-logloss:0.26188

 

감사합니다.

evals에 학습과 검증 데이터를 다 넣어도 eval은 검증만 수행합니다. 그리고 학습을 넣으면 학습에 대한 loss만 출력해 줍니다.

0

안녕하십니까,

질문을 제대로 이해하지 못했습니다.

 

예제를 보면 train-logloss는 계속해서 감소하고 eval-logloss는 감소하지 않는 구간이 있는데

똑같은 데이터를 나눈 것인데 차이가 발생하는 이유가 궁금합니다!

=> train-logloss에 사용된 데이터와 eval-logloss에 사용되는 데이터는 서로 다릅니다. 학습 데이터를 다시 쪼개서 tr과 val 로 만들어서 적용한 것입니다. eval을 검증 데이터로 적용하고 있습니다.

원하는 답변이 아니시면 다시 한번 질문 사항을 정리 부탁드립니다.

감사합니다.