Kaggle 동영상 강의 Week4 - Hyperparameter Optimization
Coursera 강의인 How to Win a Data Science Competition: Learn from Top Kaggler Week4 : Hyperparameter Optimization 부분을 듣고 정리한 내용입니다
Hyperparameter Optimization
- 이번에 배울 내용
- Hyperparameter tuning in general
- General pipeline
- Manual and automatic tuning
- What should we understand about hypterparameters?
- Model, libraries and hyperparameter optimization
- Tree-based models
- GBDT : XGBoost, LightGBM, CatBoost
- RandomeForest/ExtraTrees
- Neural networks
- Pytorch, Tensorflow, Keras
- Linear models
- SVM, logistic regression
- Vowpal Wabbit, FTRL
- Factorization Machines
- libFM, libFFM
- 그러나 이 부분은 수업에서 다루진 않지만 자료 찾아보기
- Tree-based models
- Hyperparameter tuning in general
Hyperparameter 튜닝하는 방법
- 1) 가장 큰 영향력을 가진 파라미터를 선택
- 모든 파라미터를 튜닝할 순 없음
- 2) 파라미터가 정확히 training에 어떤 영향을 미치는지 이해하기
- 이 파라미터가 변하면 어떤 일이 일어나는가?
- 3) Tune them!
- a. Manually (change and examine)
- b. Automatically (hyperopt, etc..)
- Hyperopt
- Scikit-optimize
- Spearmint
- GPyOpt
- RoBO
- SMAC3
def xgb_score(param): # run XGBoost with parameters 'param' def xgb_hyperopt(): space = { 'eta' : 0.01, 'max_depth' : hp.quniform('max_depth', 10, 30, 1), 'min_child_weight' : hp.quniform('min_child_weight', 0, 100, 1), 'subsample' : hp.quniform('subsample', 0.1, 1.0, 0.1), 'gamma' : hp.quniform('gamma', 0.0, 30, 0.5), 'colsample_bytree' : hp.quniform('colsample_bytree', 0.1, 1.0, 0.1), 'objective':'reg:linear', 'nthread' : 28, 'silent' : 1, 'num_round' : 2500, 'seed' : 2441, 'early_stopping_rounds' : 100 } best = fmin(xgb_score, space, algo=tpe.suggest, max_evals=1000)
- Color-coding legend
- Underfitting (bad)
- Good fit and generalization (good)
- Overfitting (bad)
- 파라미터의 2 종류
- red
- 파라미터 증가시 fitting을 방해
- 파라미터 증가시 오버피팅을 감소
- 파라미터 증가시 모델의 자유를 감소
- 제약 조건이 많아지며 오버피팅에서 언더피팅으로 모델을 바꿈
- green
- 파라미터 증가시 train set에 더 나은 fit
- 모델이 underfit이면 파라미터를 증가
- 모델이 overfit이면 파라미터를 감소
- 언더피팅에서 오버피팅으로 모델을 바꿀 수 있음
- green 파라미터를 더 사용
- red
Tree-based models
- GBDT
- XGBoost
- LightGBM
- CatBoost : 이건 따로 공부해보기
- RandomForest, ExtraTrees
- scikit-learn
- Others
- RGF(baidu) : Regulized Greedy Forest
- 그러나 아직 사용하기 어렵고 느림
- 작은 데이터에 시도해보기
- RGF(baidu) : Regulized Greedy Forest
- GBDT
- 두 모델 모두 Tree를 생성한 후, given objective를 최적화
max_depth
: Tree의 최대 depth, 증가할수록 train set에 더 빠르게 fit, 처음엔 7로 두고 해보기!- (lightGBM)
num_leaves
: Tree가 매우 깊을 경우 이걸 조정하면 좋을 수 있음 subsample
: 일종의 정규화를 도와줌colsample_bytree, colsample_bylevel
: 만약 모델이 오버피팅같으면 이 값을 줄이면 됨min_child_weight
: 이걸 증가하면 모델이 보수적이 됨, 가장 중요한 파라미터 중 하나. 데이터에 따라 다르지만, 넓게 범위를 잡는 것을 두려워하지 말기!eta
: gradient descent 같은 필수적인 learning weightnum_rounds
: 얼마나 learning step을 수행할 것인가(=얼마나 트리를 만들 것인가)
- sklearn.RandomForest/ExtraTrees
- ExtraTrees는 Randomfrest의 더 랜덤한 버전. 파라미터는 동일
N_estimators
: 트리 개수. 처음엔 이 값을 작은 값부터 큰 값까지 설정한 후, accuracy를 측정! 그래프를 통해 추론. 보통 50?max_depth
: xgboost와 다르게 none 설정 가능(unlimited depth) 보통 7부터 시작 추천min_samples_leaf
: 정규화, min_child_weight와 유사criterion
: 지니 또는 엔트로피
Neural net models
- Framework
- Keras, Tensorflow, MxNet, PyTorch
- Keras, PyTorch 추천
- 여기선 Dense layer 이야기만 함(fully connected layer로 연결된)
- simple 레이어로 시작하기!
- Optimizers : SGD + momentum이 빠르게 수렴하긴 하지만 오버피팅일 수 있음
- Batch size : 32 또는 64로 시작
- Regularization : Dropout을 각 레이어의 마지막에 추가하거나 네트워크의 끝쪽에 추가
- Static dropconnect
- 첫 hidden layer를 굉장히 큰 units으로 구성
- 정규화하기 위해 랜덤하게 99%를 drop
Linear modesl
- Scikit-learn
- SVC/SVR
- Sklearn이 libLinear와 libSVM을 랩핑
- 멀티코어를 사용하려면 직접 컴파일
- LogisticRegression/LinearRegression + regularizers
- SGDClassifier/SGDRegressor
- SVC/SVR
- Vowpal Wabbit
- FTRL
- SVC에서 C를 천천히 상승
- L1은 feature selection할 때 사용
- L1/L2/L1+L2는 각각 모두 시도
Tips
- 하이퍼파라미터 튜닝에 너무 많은 시간을 쏟지 말기
- 더 이상 아이디어가 없거나 여분의 계산 리소스가 있는 경우에만 시도하기
- 참고 견디자
- GBDT 또는 신경망을 수천번 돌려야 할 수도 있음
- 모든 것을 평균
- 파라미터도 평균!
참고 자료
- Tuning the hyper-parameters of an estimator (sklearn)
- Optimizing hyperparams with hyperopt
- Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python
Reference
카일스쿨 유튜브 채널을 만들었습니다. 데이터 사이언스, 성장, 리더십, BigQuery 등을 이야기할 예정이니, 관심 있으시면 구독 부탁드립니다 :)
PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다
이 글이 도움이 되셨거나 다양한 의견이 있다면 댓글 부탁드립니다 :)