Python/Sklearn

[Sklearn] 파이썬 랜덤 포레스트 모델 학습, 하이퍼파라미터 튜닝 - RandomForestClassifier

jimmy_AI 2021. 11. 17. 13:31
반응형

이번 포스팅에서는 파이썬에서 대표적인 머신러닝 분류기 중 하나인 랜덤 포레스트를 사이킷런에서 사용하는 방법에 대해서 살펴보도록 하겠습니다.

 

Sklearn(사이킷런) 랜덤 포레스트 분류기

kaggle의 타이타닉 데이터셋을 대상으로 사용 예시를 보여드리도록 하겠습니다.

 

우선 다음 코드처럼 모듈을 임포트 한 뒤, train / test 데이터셋을 분리하도록 하겠습니다.

 

train feature는 Pclass, SibSp, 성별을 사용하는 것으로 가정하겠습니다.

단, 이 모듈에서는 'male', 'female' 등의 텍스트를 feature로 인식할 수 없으므로, one-hot 인코딩을 진행해주도록 하겠습니다.(남성인지 아닌지를 1/0 혹은 True/False로 표현)

이제 위에서 정한 train feature를 기반으로 생존여부를 예측하는 간단한 모델을 작성해보도록 하겠습니다.

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

df['is_male'] = (df['Sex'] == 'male') # 성별 column one-hot 인코딩

train_columns = ['Pclass', 'SibSp', 'is_male'] # train_feature를 나타내는 column

# train, test 데이터셋 분리(random state 지정시 항상 고정, test set 비율도 지정 가능)
X_train, X_test, y_train, y_test = train_test_split(df[train_columns], df['Survived'], 
                                                    test_size = 0.25, random_state = 32)

 

이제 Train, Test 데이터 셋(X_train, X_test) 및 각 데이터 셋에 매칭되는 생존 여부 라벨(y_train, y_test) 분리가 완료되었습니다.

Sklearn(사이킷런) 랜덤 포레스트 모델 학습

위에서 전처리가 완료되었으면 이제 랜덤 포레스트 모델을 선언하고 학습을 진행할 차례입니다.

먼저, 모델의 구조를 선언하도록 하겠습니다.

model = RandomForestClassifier(n_estimators=5, random_state=0)

모델 구조 선언시 하이퍼파라미터를 지정할 수 있습니다. 이는 맨 뒷 부분에서 추가로 다루도록 하겠습니다.

 

이제 train 데이터셋 및 라벨을 가지고 모델을 학습하도록 하겠습니다. 코드는 매우 간단합니다.

model.fit(X_train, y_train)

 

마지막으로 학습된 모델을 바탕으로 test 데이터셋의 라벨을 예측하고 실제 라벨과 정확도를 비교해보겠습니다.

from sklearn.metrics import accuracy_score

# test 데이터셋에 대해서 라벨 예측(0, 1로 이루어진 array)
y_pred = model.predict(X_test)

# 예측 결과와 실제 결과 사이의 정확도 반환
accuracy_score(y_pred, y_test)

여기서는 약 76% 정도의 정확도가 기록된 것을 확인할 수 있었습니다.

 

Sklearn(사이킷런) 랜덤 포레스트 하이퍼파라미터

모델의 구조 선언 단계에서 랜덤 포레스트의 세부 구조를 정하여 여러 실험을 진행할 수 있습니다.

많이 사용하는 대표적인 하이퍼파라미터의 리스트는 다음과 같으며, 더 자세한 내용은 공식 document를 참조해주시기를 바랍니다.

 

n_estimator : forest size, 의사결정나무의 개수, 클수록 성능은 좋아질 수 있지만 시간이 오래 걸림

criterion : 'gini', 'entropy' 중 선택 가능, 기본 값은 'gini'이며, 의사 결정 나무를 학습하는 과정에서 기준 선정

max_depth : 과적합을 방지하기 위하여 의사결정나무의 depth 최대 값을 제한

min_samples_split : split을 끝낼 node의 sample 최소 갯수 선정, 클수록 과적합이 방지되지만, 너무 크면 split이 제대로 되지 않을 수 있음

min_samples_leaf : leaf node의 최소 sample 개수를 의미

n_jobs : -1로 설정시 컴퓨팅 프로세서 최대한 활용

random_state : 임의의 정수로 설정시 실행시마다 결과가 바뀌지 않고 고정됨