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

Hgyoon님의 프로필 이미지
Hgyoon

작성한 질문수

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

LightGBM 등에서 cross-validation을 통한 early stopping 결정

해결된 질문

작성

·

2.8K

0

선생님 안녕하세요, 

좋은 강의 정말 잘 듣고 있습니다. 

강의 내용 바탕으로 제가 가지고 있는 개인 데이터들로도 진행을 해보고 있는데, 

아무래도 data 수가 너무 적어서 validation set을 따로 만들지 않고 cross-validation을 진행하려고 합니다. 

그런데 LightGBM 등에서 'eval_set =' 에 지정해줘야하는 dataset을 어떻게 코드로 만들어야할지 조금 난감해서요... 

예를 들어 10-fold cross-validation이라고 한다면,

training set을 10개로 나눈 뒤 학습을 총 10번 수행하는 것일 테고,

그 10번의 평균 error를 최소화시키는 model을 찾고 이를 test set에 적용을 해야할텐데 ㅠㅠ 

어떤 식으로 코드를 짤지 감이 잘 오지가 않네요.. 

조금의 실마리라도 제공해주실 수 있을지요. 

질문이 다소 추상적인 점 죄송합니다. 

답변 8

0

Hgyoon님의 프로필 이미지
Hgyoon
질문자

감사합니다! 

질문이 많았는데 덕분에 도움이 정말 많이 되었습니다 ㅠㅠ

0

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

안녕하십니까,

SPSS나 R에서 사용하는 로지스틱회귀와 scikit-learn에서 사용하는 로지스틱 회귀 분석이 거의 비슷하지 않을까요?

저도 SPSS나 R지식이 많지 않아서 인터넷 검색으로 찾아본 결과 Cost function의 Regularization이 약간의 차이가 있는 것 같습니다. 아래 참조 부탁드립니다. 

https://stats.stackexchange.com/questions/203816/logistic-regression-scikit-learn-vs-glmnet

감사합니다.

0

Hgyoon님의 프로필 이미지
Hgyoon
질문자

감사합니다! 

질문을 하다보니 자꾸 질문이 생기네요... 

일반적으로 SPSS나 R에서 사용하는 로지스틱회귀와

scikit-learn에서 사용하는 로지스틱 회귀 분석은 서로 다른 것일지요. 

scikit-learn에선 경사하강법을 통해 계수를 추정한다는 것이 차이점일까요??

0

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

도움이 되셨다니 다행입니다.

그리고 Logistic Regression은 뛰어난 알고리즘입니다. 특히 이진 분류나 Sparse한 데이터 세트(예를 들어 텍스트 분류)에서 높은 성능을 나타냅니다.

LightGBM의 경우 데이터 건수가 많지 않으면(예를 들어 몇천건 이하) 성능이 높게 나오지 않을 수 있습니다.

그리고 전반적으로 Tree기반 Boosting 알고리즘 들은 데이터의 스케일링, 인코딩등의 전처리와  imbalance등에 상대적으로 다른 알고리즘에 비해 영향을 덜 받으며,  그중 XGBoost와 LightGBM이 일반적으로 높은 성능이 나타냅니다만 모든 데이터 세트에서 성능 우위를 보이지는 않습니다.

감사합니다.

0

Hgyoon님의 프로필 이미지
Hgyoon
질문자

자세한 답변 감사합니다! 

사실 cross-validation을 하려는 이유가 최적의 hyperparameter를 찾기 위해서라기보다는 전체 sample size가 작다보니 따로 validation set을 만드는게 부담스러워서 그랬던 거였습니다. 그 과정에서 마치 deep learning에서 loss function을 최소화 시키는 epoch을 찾는 것과 같이 적정한 n_estimators를 찾는 것이 좋을 것 같아 질문드리게 되었던 것이구요. (실제로 eval metric을 test set으로 해서 추이를 봤더니 n_estimators가 증가함에 따라 loss값이 나이키 로고처럼 나와서요) 

말씀주신 방법대로, list(range(100, 500, 50))과 같은 형태로 하이퍼파라미터 적용해보면 될 것 같습니다. 감사합니다. 

P.S 제 데이터셋이 너무 작아서 그럴 수도 있긴 한데, XGBoost나 LightGBM보다 Logistic regression이 더 performance가 좋게 나오는데 ㅠㅠ 이럴 수도 있는 것일까요? 

0

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

안녕하십니까,

hyperparmeters = {'n_estimator : [1:501]} 로 early-stopping 아이디어는 무척 창의적이십니다. 

하지만 일반적으로 그렇게 적용하기에는 너무 많은 반복이 발생합니다. early stopping은 중간에 멈출수 있는데 위 경우는 그렇게 할수가 없습니다.(나중에 최적을 뽑으면 됩니다만). 그리고 수행 속도가 너무 느립니다. 500* cross validation 횟수까지 생각하면 너무 많은 반복이 됩니다.

 n_estimators를 [100, 200, 500] 정도만 정하시면 어떨까요? 데이터 세트가 작다면 아무리 최적화를 해도 오버피팅이 발생하기 너무 쉽습니다. 너무 최적화에 수행 시간을 사용하실 필요는 없다고 생각합니다.

감사합니다.

0

Hgyoon님의 프로필 이미지
Hgyoon
질문자

늦은 시간이었는데 빠른 답변 감사합니다. 

제가 이해한게 맞다면, 예를 들어 내가 원래 설정하고자 했던 n_estimator가 500이었다고 할 때 

hyperparmeters = {'n_estimator : [1:501]} 과 같은 형태로 만든 뒤에 model을 fitting하면 

n_estimator 중에서 cross-validation에 의한 loss값을 최소로 만들어주는 estimator 수를 찾아준다는 것일지요?

그렇게 되면 GridSearchCV 기능을 통해서 자연스래 early-stopping이 되는 것 같은 효과를 얻을 수 있는 것이니까요. 

0

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

안녕하십니까,

GridSearchCV를 적용해 보시는 것을 어떠실지요?

LGBMClassifier/LGBMRegressor 모두 GridSearchCV가 가능합니다. 데이터 세트가 적기 때문에 꼭 eval_set를 사용하여 early_stopping 하실 필요가 없을 것으로 생각됩니다. GridSearchCV 적용 방법은 2장에 나와 있으며 의도하신 바가 아니시면 다시 질문 부탁드립니다.

감사합니다.

Hgyoon님의 프로필 이미지
Hgyoon

작성한 질문수

질문하기