공개 커널을 필사하여 어느 정도 데이터에 대한 감을 잡았으니 이제 Baseline 모델을 구축하고자 합니다.
바닥부터 데이터만 가지고 모델링을 해가는 방법이 있지만 이렇게 할 경우 정말 많은 삽질을 해야하기에
저는 이미 참가자들 사이에서 검증된 공개 Baseline 커널을 가져와 조합하여 만들었습니다.
github code : baseline / 공개커널1 / 공개커널2
Baseline은 LightGBM(LGBM)으로 구축하여 속도와 정확성을 한번에 잡아보고자 했으며, 추후에 모델 다양성을
확보하기 위해 Xgboost 와 Catboost로 확장하여 진행할 예정이고 시간이 된다면 Ridge, Lasso로도 확장해보고자
합니다. 데이터 용량이 매우 크기 때문에 LGBM으로 학습하여도 8 Core 16 Thread / 64GB 환경에서 약 40분 정도
소요되고 Inference 시간까지 합치면 1.5시간이 소요됩니다.
ㅁ Baseline 구축하기
1. LightGBM / Shuffle =True : PB = 1.44
- Train / Weather / Building_meta 데이터를 모두 Merge 한 후에 Timestamp를 월/주/일로 Feature를 뽑아내고 LGBM Parameter를 임의로 입력하여 학습한 결과, Public Score가 1.44를 기록했습니다.(끝에서 3% 수준)
- 초기 Baseline에서 점수가 낮게 나온 사유 중 하나가 Shuffe=True 설정이지 않을까 생각합니다
Sklearn에서 제공하는 kfold 함수는 Default가 Shuffle=True로 설정되어 있는데, 지금처럼 데이터가 Timeseries 된 데이터라면 Cross validation을 할 때 시간 정보도 중요한 인자가 될 수 있으므로 이때는 Shuffle= False로 설정하여 학습해주는게 좋습니다. 실제로 아래 shuffle=False로 변경하고 점수가 향상되었습니다.
- LGBM을 비롯한 Tree 기반의 모델들은 입력 Parameter를 어떻게 넣어주느냐에 따라 점수가 크게 달라질 수 있기 때문에 추후에 Hyperparameter Tuning을 진행하여 최적 Parameter를 넣어줄 예정입니다.
(이 글을 포스팅하는 현재 BayesianOptimization 함수가 12시간째 돌아가고 있습니다. 남은 시간은 한 10시간 정도?)
params = {
'boosting_type': 'gbdt',
'objective': 'regression',
'metric': {'rmse'},
'subsample': 0.2,
'learning_rate': 0.9,
'feature_fraction': 0.9,
'bagging_fraction': 0.9,
'alpha': 0.1,
'lambda': 0.1
}
%%time
folds = 5
seed = 99 #666
kf = KFold(n_splits=folds, shuffle=True, random_state=seed)
models = []
for train_index, val_index in kf.split(train_df):
train_X = train_df.iloc[train_index]
val_X = train_df.iloc[val_index]
train_y = target.iloc[train_index]
val_y = target.iloc[val_index]
lgb_train = lgb.Dataset(train_X, train_y)
lgb_eval = lgb.Dataset(val_X, val_y)
gbm = lgb.train(params,
lgb_train,
num_boost_round=300,
valid_sets=(lgb_train, lgb_eval),
# feval=rmsle,
early_stopping_rounds= 30,#100,
verbose_eval=50) #100)
models.append(gbm)
2. LightGBM / Shuffle = False : LB = 1.3
- 이번에는 위에서 이야기한 대로 CV Split 할 때 Shuffle이 되지 않도록 변경했습니다. 또한 num_boost_round를 크게(300→3000) 설정하여 학습이 충분히 되도록 설정했습니다.
3. LightGBM / Shuffle = False : LB = 1.32
- Folds 수를 늘리면(3→5) 더욱 Deep 하게 학습이 가능할 것으로 예상하고 테스트했는데 CV Score는 이전보다 낮아지고 학습 시간도 길어졌으나 Public Score는 오히려 감소하는 현상이 있었습니다.
Discussion에 한 참가자가 올린 테스트 결과를 보면 2-Fold → 12Fold까지 올렸더니 LB가 1.11→ 1.20까지 증가했다고 합니다. 결론적으로 이 대회에서는 folds =2 또는 3으로 진행하는 것이 제일 좋은 듯합니다.
참고 : https://www.kaggle.com/kimtaegwan/what-s-your-cv-method
'Kaggle 대회' 카테고리의 다른 글
[ASHRAE - Great Energy Predictor III] Model 확장 (0) | 2019.12.08 |
---|---|
[ASHRAE - Great Energy Predictor III] Model 성능 향상시키기 (0) | 2019.12.08 |
[ASHRAE - Great Energy Predictor III] 데이터 파악하기 (0) | 2019.12.05 |
[ASHRAE - Great Energy Predictor III] 대회 소개 (0) | 2019.12.05 |
[Santander Product Recommendation] 대회 소개 (0) | 2019.11.25 |
댓글