작성
·
520
1
안녕하세요 강의 너무 잘듣고 있습니다
덕분에 좋은 강의 들으며 실력이 증가하는걸 느끼고 있습니다.
다름이 아니라 제가 캐글에서 데이터를 따와서 프로젝트를 하고 있는데 베이지안 최적화 방법을 통해서 하이퍼 파라미터를 튜닝하고 있는데 오히려 성능이 떨어지는 모습을 보입니다
모델은 radomforest, xgboost, lightgbm 이렇게 쓰고 있고
randomforest
n_estimators : 1000~2000, 100간격
max_depth : 5~15, 1간격
min_samples_split : 10~20, 1간격
xgboost
n_estimators : 1000~2000, 100간격
max_depth : 5~15, 1간격
learning_rate : 0.01~0.2
min_child_weight : 8~20, 1간격
lightgbm
n_estimators : 1000~2000, 100간격
num_leaves : 31~100, 1간격
learning_rate : 0.01~0.2
min_child_samples : 20~100, 1간격
이렇게 해서 돌리는데 randomforest는 성능이 더 떨어지고 나머지 두 모델은 조금은 좋아졌지만 효과가 미비합니다.
학습 데이터가 2만 6천개 정도인데 말단 노드가 가지는 최소 개수를 늘려야 할까요??
계속 범위를 바꾸면서 하고 있는데 어느정도로 해야하는지 감이 오질 않습니다.
답변해주시면 감사하겠습니다
답변 1
0
안녕하십니까,
강의로 실력이 증가하고 계시다니 저도 뿌듯하군요 ^^
강의에서 말씀드린 대로 lightgbm, xgboost는 기본적으로 모델 성능이 나오기 때문에 하이퍼 파라미터 튜닝으로 성능이 급격히 개선되지 않을 수 있습니다.
먼저 아래와 같은 사항 답변 부탁드립니다.
성능 평가 데이터를 학습 데이터의 몇퍼센트 수준으로 가지고 평가를 하시는 건지요? 그리고 objective_func(search_space)에서 단일 데이터 세트로 평가하시나요? 아님 cross validation 기반으로 평가를 하시나요? 성능 평가 데이터가 너무 작거나 또는 너무 클 경우(학습 데이터가 작아지기 때문에) 제대로된 평가가 나오지 않을 수 있습니다.
fmin의 최대 반복횟수 max_eval은 얼마 인지요?
그리고 randomforest, xgboost 보다는 lightgbm으로 먼저 촛점을 맞추시고 작업을 하시면 좋을 것 같습니다. xgboost는 튜닝에 시간이 너무 오래 걸립니다.
lightgbm의 주요 튜닝 파라미터는 기존에 적용하신 파라미터 외에
subsample, colsample_bytree 를 추가해서 적용해 보십시요. 두개 파라미터에 대한 설명은 lightgbm 하이퍼 파라미터 강의를 참조해 주시고 0.6 ~ 0.9 정도로 적용을 해보면 좋을 것 같습니다.
그리고 max_depth도 설정해 주십시요. 데이터를 제가 보지 않아서 잘 모르겠습니다만 feature 갯수가 30개 이상 된다면 40 ~80 정도 값으로 설정해 보시고 시도해 보십시요.
그리고 fmin의 최대 반복 횟수는 튜닝할 하이퍼 파라미터가 많을 수록 충분히 크게 주시는게 좋습니다.
그외 reg_lambda나 reg_alpha같은 경우는 개인적인 경험으로는 크게 도움은 안되었지만, 시도를 해보는 것은 나쁘지 않을 것 같습니다.
하이퍼 파라미터 튜닝은 시간이 많이 걸리는 작업 입니다.
만약 코랩을 사용하신다면 여러개의 노트북을 열어서 개별 노트북에서 서로 다른 하이퍼 파라미터들을 설정하면서 병렬로 수행하는 것이 좋습니다.
감사합니다.
제일 먼저 fmin이 너무 작군요. 하이퍼 파라미터가 많기 때문에 검색 시도 횟수를 높여야 합니다. 최소 100 이상 주십시요. 시간이 생각 보다 오래 걸리지 않으면 그 보다 더 많이 주시면 됩니다.
그리고 objective_func를 cross validation으로 하면 너무 오랜 시간이 걸리니까, 먼저 단일 평가로 하시고 나중에 시간이 되시면 cross validation으로 하셔도 될 것 같습니다.
그리고 lightgbm의 max_depth는 원래 깊게 만들어집니다. 다른 트리 모델과 다르게 max_depth가 높다고 과적합 되는 경향이 상대적으로 적습니다. 근데 5 ~15정도로 하면 lightgbm 특성이 제대로 안나올 수 있습니다. 말씀 드린 대로 40 ~80(100개도 괜찮을 것 같습니다) 정도로 설정해 주십시요.
그리고 subsample, colsample_bytree는 중요 하이퍼 파라미터이니 앞서 말씀드린대로 적용을 해보시면 좋을 것 같습니다.
답변 감사합니다.
답변해주신대로 하니 lightgbm에서 성능이 이전보다 더 좋아진 모습을 보였습니다. 감사합니다.
지금은 xgboost를 돌리고 있는 상태인데, 혹시 RandomForest의 파라미터 튜닝은 어떤 방식으로 하는 것이 좋을까요?
답변 감사합니다.
데이터는 https://www.kaggle.com/datasets/ahsan81/hotel-reservations-classification-dataset 여기에서 가져왔습니다.
일단 총 데이터는 3만 6천개에서 이 중 20 퍼센트를 테스트용 데이터로 사용하였고 학습데이터는 총 2만 8천개 정도 됩니다. objective_function에서 cross validation 기반으로 평가하고 있고 cv = 5로 하였습니다.
fmin의 반복횟수는 20정도로 하였습니다.
subsample, colsample_bytree 는 학습에서 사용할 피처가 총 17개 정도로 크지 않다고 생각하였고, 너무 한쪽으로만 치우친 피처들은 제외하였지만 그래도 남은 피처들이 크게 고르지 않아서 subsample을 사용하지 않았습니다.
reg_lambda, reg_alpha는 잘모르기도 하고 이것저것 찾아본 결과 크게 중요한 파라미터는 아닌것 같아 설정하지 않았습니다.
타겟값이 균일하지 않아 scale_pos_weight도 계속 값을 바꾸면서 설정하였지만 큰 역할은 하지 않아 굳이 설정하지 않았습니다. 또한 찾아보니 auc기반으로 볼때 scale_pos_weight가 큰 역할은 하지 않는다 해서 제외했습니다.
임계값도 바꾸면서 해봤는데 f1 스코어나 auc도 중요하지만 예측하려는 타겟 특성상 정밀도가 더 중요하다 판단하여 임계값을 굳이 건들지는 않았습니다.
max_depth의 경우 너무 깊으면 과적합 될것 같아서 대부분 5~15 정도로 하였는데 너무 작은 수치인가요??
fmin에서 반복수는 어느정도로 하는것이 좋을까요?