[Python] H2O 패키지를 활용하여 XGBoost 모델 구축하기

최근 프로젝트를 수행하면서 H2O 라는 좋은 패키지를 활용해볼 수 있는 기회가 있어서 이에 대한 내용을 정리해보려고 한다. 

 

https://docs.h2o.ai/h2o/latest-stable/h2o-docs/welcome.html

 

Welcome to H2O 3 — H2O 3.36.1.4 documentation

Docs » Welcome to H2O 3 Edit on GitHub Welcome to H2O 3 H2O is an open source, in-memory, distributed, fast, and scalable machine learning and predictive analytics platform that allows you to build machine learning models on big data and provides easy pro

docs.h2o.ai

h2o 패키지의 장점은 

1) 오픈소스이기 때문에 (코드 공개형) 무료로 사용 가능하다 

2) 메모리 분산처리 등으로 빠르게 모델 학습이 가능하다. 

3) 오버피팅 발생시 중지하는 옵션을 설정할 수 있어, 정확도가 조금 더 높은 모델을 얻을 수 있다.

4) 여러 언어로 활용 가능하다 (R, Python, 스칼라 등)

정도로 정리해볼 수 있을 것 같다. (+추가 장점이 있다면 댓글로 알려주시면 추가하겠습니다) 

 

기본적으로 JAVA 언어로 작성되었지만 R, Python, JAVA 등의 언어로 모두 사용 가능하도록 구성되어 있기에 범용성이 높고, 언어별로 특성을 반영하여 코드명이 작성되어있다. 또한 Rest API를 지원하기에 json을 통해서 외부 프로그램 및 스크립트에서도 사용 가능하고 웹 ui를 지원하여 gui 기반으로 활용이 가능하다. (해당 부분은 따로 포스팅 할 예정) 

 

하둡이나 스파크에서 작동 가능하기에 현업에서도 많이 사용하고 있다. (적어도 프로젝트를 수행한 기업에서는 실제로 쓰고 있었다) 

 

기본적으로 맥이나 리눅스에서 사용하는 것을 권장한다. 윈도우에선 XGBoost 가 작동하지 않는 것 같다. 

 

설치에 대한 포스팅은 따로 요청이 있을 경우 하려고 하며, 이번 포스팅에서는 데이터를 호출하여 xgboost 모델을 구축하는 방법에 대해 다루려고 한다. 함께 간단한 실습을 해보는 게 가장 좋을 거 같아서, colab 에서 간단한 예제와 함께 실행해보려 한다. 

 

간단한 예제라면 역시 타이타닉 데이터다. XGBoost이기 때문에 categorical 변수가 있으면 좋을 거 같아서 선택했다. 

 

설치 

환경에 따라 다르지만, colab에서는 

!pip install h2o

코드면 설치가 된다.

local 컴퓨터에서 사용시 JAVA 프로그램(JVM)을 필수 사전 설치해야 한다. 

환경별 자세한 설치 방법은 해당 페이지를 참고. (https://docs.h2o.ai/h2o/latest-stable/h2o-docs/downloading.html)

 

실습에 필요한 패키지/데이터 호출 및 전처리 

import pandas as pd 
import seaborn as sns 
import xgboost as xgb
import matplotlib.pyplot as plt
import h2o
from sklearn.model_selection import train_test_split

사용 예정인 패키지를 모두 불러온다. 

+ titanic 데이터는 seaborn 패키지 안에 내장되어 있다. 

- 데이터 로드 

df = sns.load_dataset('titanic')
df

- 아까 말했듯 tree 기반이 아닌 다른 모델에서는 표준화, 결측값 처리 등의 절차가 추가되어야 하지만, 여기서는 사용하지 않는다. 

- one-hot encoding 과 같은 가변수화는 h2o 에서 알아서 수행해준다. 너무 편한 기능이다. 

h2o 사용

1) h2o 초기화 

h2o 를 사용하려면 우선 초기화를 먼저 진행해야 한다. 아니면 오류가 발생할 수 있다. 

h2o.init()

2) h2o 데이터 프레임화 

df_h2o = h2o.H2OFrame(df) #.import_file('titanic.csv')
df_h2o

데이터를 h2o에서 사용할 수 있도록 H2OFrame화 시켜줘야 한다. 

3) 변수형 변환

df_h2o["survived"] = df_h2o["survived"].asfactor()
df_h2o[['age', 'fare', 'sibsp']] = df_h2o[['age', 'fare', 'sibsp']].asnumeric()

# target 변수와 분리
x = df_h2o.columns
y = "survived"
x.remove(y)

target 변수인 survived 변수는 factor변수기 때문에 먼저 바꿔주고, 컬럼명을 x에 넣고 target 변수이름을 지우는 remove를 수행한 결과를 보면 사용할 변수명들이 잘 모여있다.

 

4) train/valid/test 데이터 분할

train,test,valid = df_h2o.split_frame(ratios=[.7, .15],seed=1234)

훈련, 검증, 테스트 데이터를 분할하는 기능도 h2o에 있다. split_frame 으로, 각각의 분할의 비율을 ratios 안에 적으면 비율에 맞게 분할 된다. 

 

5) 기본적인 XGBoost 모델 구축

from h2o.estimators import H2OXGBoostEstimator

titanic_xgb = H2OXGBoostEstimator(seed=1234, 
                                  ntrees = 300, 
                                  max_depth = 5)

h2o의 xgboost 구축 함수는 H2OXGBoostEstimator 이다. 기본 hyper-parameter로 ntrees(tree의 최대개수), max_depth(tree의 깊이)가 있다. 

 

이 함수는 hyper-parameter를 설정하는 부분이고 실제 데이터로 모델을 훈련시키는 코드는 다음과 같다. 

titanic_xgb.train(x=x,
                  y=y,
                  training_frame=train,
                  validation_frame = valid)
                  # 추가 early stopping 옵션
                  #stopping_metric = "auc", 
                  #stopping_tolerance=0.1, 
                  #stopping_rounds=3)

아까 저장한 x에는 요인변수들이 들어있고, y에는 target 변수, training_frame에는 train에 활용할 데이터, validation_frame에는 validation 에 활용할 데이터를 넣어주면 된다. 

 

h2o의 장점이었던 early stopping 옵션은 모델마다 다르나, xgboost에서 가장 많이 사용하는 옵션은 위의 3가지로 stopping_metric 은 모델 훈련시 과적합 발생할 때 어떤 지표를 기준으로 종료하느냐를 설정하는 옵션이고, stopping_tolearance는 stopping round에서 이동평균이 계산되는데, 최상의 이동평균과 이  stopping round 이동평균의 차이가 설정값 이상으로 벌어지는 경우 모델 훈련을 종료하는 옵션이다. 

 

모델 결과를 보면 굉장히 긴데, training과 validation 의 결과를 각각 보여주기 때문에 중복값으로 보이나 다르다.

다양한 지표들을 확인할 수 있다.

tree 모형이기 때문에 나무의 구조에 따른 성능을 중간중간 보여주는 table도 출력된다. 

 

6) test 

pred = titanic_xgb.predict(test)
pred

test데이터를 모델에 넣어서 예측하게 되면 class 가 나오는데, 이를 가지고 원래 test 데이터의 정답과 비교하면 성능을 얻을 수 있다. 

여기까지가 h2o 패키지를 활용하여 python 에서 xgboost 모델을 구축하는 과정이다. 

 

 

728x90
반응형