본문 바로가기
Kaggle 대회

[ASHRAE - Great Energy Predictor III] Model 확장

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

 

이번에는 Lightgbm이 아닌 다른 모델을 활용하여 다양성을 부여해보도록 하겠습니다.

지금은 Lightgbm이 tree 계열에서 가장 좋은 성능을 보이는 모델이지만 이전에는 Xgboost 만한 모델이 없었습니다.

최근에는 Xgboost가 Lightgbm에 비해 성능이 조금 떨어지고 CPU 학습시 속도도 오래걸리는 경향이 있지만 GPU를

활용한 학습이 가능하다는 점에서 아직까지 많은 사람들이 찾고 있습니다. Lightgbm도 GPU 를 활용한 적합이 가능은

하지만 Kaggle에 올라오는 경험담에 의하면 안정적인 결과를 내지 못하는 것 같다고 합니다. 그래서 저는 Lightgbm으로

학습 할 때 CPU만 활용하고 있고 Xgboost는 GPU 학습시킬 때 활용하고 있습니다. Xgboost 결과를 아래에서 같이 확인해보도록 하겠습니다.

 

또한 함께 시도해볼 모델은 Catboost 입니다. 지난 10월에 열린 "IEEE_CIS Fraud Detection" 에서 Catboost가 좋은 성능

을 보이면서 처음 접하게 되었으나 그때 당시에는 캐글에서 제공하는 2Core-16GB HW를 활용하다보니 잦은 메모리 

에러로 포기했었습니다. 하지만 최근에 제가 장비를 맞추면서 Catboost도 사용해볼 수 있게 되었네요.

 

 

* Baseline model  :  Lightgbm , Best LB Score : 1.103

1. Xgboost , LB Score : 1.125, +0.022  * Github code 바로가기 

   - Xgboost를 학습시키는 건 꽤나 어렵고 귀찮은 작업이었습니다. 아시는 분도 계시겠지만, GPU로 학습을 시킨 후

     Xgboost-gpu는 자동으로 GPU 메모리를 Release 하지 않습니다. 이 때문에 Fold 하나만 돌리고 나면 무조건  

     Memory error 가 발생했습니다. 

 

     이를 해결하는 방법은 두가지 입니다. 

      ① Multiprocessing 모듈을 활용하여 특정 Process 안에서 학습을 시키고 끝나면 해당 Process를 Close 시키는 방법

         (링크 참조 : 바로가기)

from multiprocessing import Process

def fitting(args):
    clf = xgb.XGBClassifier(tree_method = 'gpu_hist',gpu_id = 0,n_gpus = 4, random_state = 55,n_jobs = -1)
    clf.set_params(**params)
    clf.fit(X_train, y_train, **fit_params)

    #save the model here on the disk

fitting_process = Process(target=fitting, args=(args))
fitting process.start()
fitting_process.join()

       ② __del__() 함수 활용하는 방법

          - 처음엔 Multiprocessing으로 접근하려했다가, 속는 셈 치고 모델을 저장한 후 __del__() 함수를 쓰고 

            다시 모델을 불러오는 방법을 썼는데,  시원하게 Memory 가 Release 되었습니다. 

# training
bst = xgb.train(param, dtrain, num_round)

#save model
joblib.dump(bst, 'xgb_model.dat')
bst.__del__() #*****

#load saved model
bst = joblib.load('xgb_model.dat')
preds = bst.predict(dtest)

 

 

2. Catboost, LB Score : 1.152 , +0.049  * Github 코드 바로가기

   - 장비를 셋업하고 Catboost는 처음 쓰는 것이라 처음엔 걱정을 좀 했습니다. Xgboost-gpu 를 설치할 때 애를 좀

     먹었기 때문인데 예상과 달리 Catboost 설치는 매우 간단했습니다. 따로 설정할 것 없이 pip install 만 해주면 

     되었습니다.  그리고 사용법도 Xgboost 보다 간단했습니다. 따로 데이터 셋을 만들어줄 필요가 없었습니다.

 

   - 다만, Run 버튼을 누르고 한동안 Catboost가 돌아가는 것이 맞나 라는 생각이 한동안 들었는데요. CPU는 열심히

     돌고 있는데 창에 찍히는건 하나도 없었기 때문입니다. 이를 한 15분 정도 기다리고 나니 그때서야 gpu에 데이터가

     올라가는 모습이 보이고 학습이 시작되었습니다.

     듣던대로 Catboost는 학습이 느렸습니다. 지금 Hyperparameter Tuning 을 30시간째 돌리고 있는데 Catboost는

     엄두가 안나네요.

# shuffle = False
kf = KFold(n_splits=folds, shuffle=False, random_state=seed)
scores = [] 
models = []
for i,(train_index, val_index) in enumerate(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]
    
    gbm = CatBoostRegressor(**params)
    print(i)
    gbm.fit(
            train_X, train_y,
             eval_set=(val_X, val_y),
            early_stopping_rounds = 30,
            cat_features=categorical_features,
            verbose=30)

 

 

댓글