파이썬 XGBoost 분류 모델 사용법
파이썬에서 xgboost 모듈과 사이킷런을 활용하여 대표적인 앙상블 모델 중 하나인
XGBoost 분류기(XGBClassifier)를 사용하는 예제에 대하여 다루어보도록 하겠습니다.
xgboost 모듈 설치
XGBoost 분류기 함수는 사이킷런에서 제공하지는 않으며,
xgboost라는 다른 모듈이 제공하고 있습니다.
따라서 만일 xgboost 모듈이 설치되어있지 않다면
코드 창에 !pip install xgboost를 입력 후 실행하거나
터미널 창에 pip install xgboost를 입력하여 설치를 진행해주세요.
데이터셋 로드, 전처리
여기서는 예시로, kaggle의 타이타닉 생존자 예측 데이터셋의 train 셋을 데이터로 가정하고
생존 여부를 예측하여 분류하는 실습을 진행해보도록 하겠습니다.
우선, 전처리 과정은 다른 사이킷런 분류 모델을 사용하는 과정과 거의 동일합니다.
전처리 과정의 예시로 성별 column은 문자열인 관계로 one-hot 인코딩을 진행해주었으며,
클래스, 나이, 성별의 3가지 feature를 최종 feature로 선별한 상황으로 가정하여 보겠습니다.
또한, 나이 column의 결측치는 평균으로 대치한 상황을 가정했습니다.
train, test 데이터 비율은 75% : 25%의 비중으로 분리하였습니다.
전치리 과정의 코드와 최종적으로 완성된 데이터프레임(train 부분)은 아래와 같습니다.
import pandas as pd
from sklearn.model_selection import train_test_split
df = pd.read_csv('train.csv') # 데이터 파일 불러오기
df['is_male'] = (df['Sex'] == 'male') # 성별 column one-hot 인코딩
train_columns = ['Pclass', 'Age', 'is_male'] # 3가지 feature 선별 가정
df['Age'] = df['Age'].fillna(df['Age'].mean()) # 나이 column 결측치 평균 대치
# train, test 데이터셋 분리
X_train, X_test, y_train, y_test = train_test_split(df[train_columns], df['Survived'],
test_size = 0.25, random_state = 32)
X_train
XGBoost 분류기 학습
xgboost 분류 모델을 선언한 뒤, 이를 학습시키는 코드에 대해서 살펴보겠습니다.
먼저, 모델 선언은 XGBClassifier 메소드를 import하여 진행해주면 됩니다.
from xgboost import XGBClassifier
# 모델 선언 예시
model = XGBClassifier(n_estimators=500, learning_rate=0.2, max_depth=4, random_state = 32)
여기서 설정 가능한 하이퍼 파라미터는 여러 종류가 있는데,
대표적인 하이퍼 파라미터의 종류는 다음과 같습니다.
n_estimators : 학습 모델의 수, 많아질수록 성능 향상의 가능성이 있으나, 속도가 느려짐
learning_rate : 학습률, 너무 크면 gradient 발산의 가능성이 있으며, 너무 작으면 학습이 느림
max_depth : 최대 탐색 깊이, 너무 크면 과적합의 가능성, 너무 작으면 학습 성능 저하
min_samples_split : 분할 종료 최소 샘플 수, 큰 수면 과적합을 막지만 학습 성능 저하 가능성
min_samples_leaf : leaf node가 되기 위한 최소 샘플 수, min_samples_split과 비슷한 용도
random_state : 특정 숫자로 고정 시에 실행 시마다 고정된 결과 반환
더 상세한 하이퍼 파라미터 설정이 필요하신 경우에는 아래의 공식 document를 참고해주세요.
이제 선언된 XGBClassifier를 전처리가 완료된 데이터셋으로 학습시키는 과정은
다른 사이킷런 모델들과 유사하게 fit 과정으로 진행하면 됩니다.
# 모델 학습
model.fit(X_train, y_train)
XGBoost 분류기 성능 평가
이제 테스트 데이터셋을 통하여 학습된 분류기의 성능을 평가해보겠습니다.
예측 라벨은 predict 메소드로 가져올 수 있으며, 사이킷런의 정확도 함수를 통하여
accuracy를 측정해보도록 하겠습니다.
from sklearn.metrics import accuracy_score
y_pred = model.predict(X_test) # 예측 라벨(0과 1로 예측)
# 예측 라벨과 실제 라벨 사이의 정확도 측정
accuracy_score(y_pred, y_test) # 0.7847533632286996
여기서는 약 78.5% 정도의 정확도의 성능을 나타내었습니다.