본문 바로가기
Kaggle 대회

[ASHRAE - Great Energy Predictor III] Baseline 구축하기

by 사자처럼 우아하게 2019. 12. 7.

공개 커널을 필사하여 어느 정도 데이터에 대한 감을 잡았으니 이제 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 수를 늘리면(35) 더욱 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

댓글