본문 바로가기

데이터사이언스/머신러닝

[scikit-learn] RandomForestClassifier 알아보기

1. RandomForest란?

 Random Forest는 다수의 decision tree를 통해 데이터를 분류하는데 사용되는 앙상블 기법이다. 무작위성을 더해 분류기를 만들기 때문에  overfitting될 확률이 높은  decision tree의 단점이 개선되었다. 학습시킬때는 주어진 데이터 중 각각의 tree를 만들기 위한 데이터셋을 N개 만든다. N개의 데이터셋을 기반으로 N개의 decision tree를 훈련시킨다. 마지막으로 각 decision tree가 투표한 결과에 따라서 각 데이터를 분류한다.

 

 

2. scikt-learn에서의 RandomForestClassifier(텍스트 데이터)

 텍스트 데이터의 Conclusion 열을 input으로 넣어 0과 1로 되어있는 label을 예측하도록 했다. 텍스트의 벡터화는 사용된 토큰은 1로, 사용되지 않은 토큰은 0으로 만들어주는 Scikit-learn의 CountVectorizer를 이용했다. 최소 몇번 등장한 단어로 토큰 사전을 만들지 지정해주는 min_df는 1로 설정하여 한번이라도 등장한 토큰은 모두 사용했다.  train test split에서는 train과 test 데이터 모두에서 예측하고자 하는 데이터의 class 비율을 유지해주는 stratify를 사용했다. 마지막으로 predict_proba 메소드를 이용해 주어진 input이 각 클래스에 속할 확률을 리턴받았다. sklearn.metrics의 roc_auc_score에서는 그 값을 실제 Y 값과 비교해서 threshold를 바꾸어가며 ROC 커브를 그리고, 커브 아래 넓이를 계산해 AUC score를 계산한다.

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
import pandas as pd

records = pd.read_csv('text.csv')

vectorizer = CountVectorizer(min_df=1)

X = vectorizer.fit_transform(records['Conclusion\n']).toarray()
y = records['label']

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.3, stratify=records.AcuteInfarction)

rfc = RandomForestClassifier(max_depth=35)
rfc.fit(X_train, y_train) # 학습 진행
auc =  roc_auc_score(y_test, rfc.predict_proba(X_test)[:, 1])

print(f'AUC: {auc}')

 

 

3. 주요 parameter

n_estimators: int, default=100

만들 트리의 개수이다. 트리의 개수가 작으면 빠른 훈련이 가능하지만 학습 성능이 떨어질 수 있다. 크다면 좋은 성능을 내낼 수 있지만 과적합의 위험이 있다.

 

bootstrap: bool, default=True

각 decision tree를 학습시키기 위한 데이터셋을 구축할 때 전체 데이터의 일부만 사용할지 여부이다. True면 각 tree를 학습시킬 때 최대 max_samples로 전달한 숫자만큼의 데이터 셋을 구축한다. False면 모든 decision tree를 만들 때 전체 데이터를 사용한다.

 

max_depth: int, default=None

각 트리의 최대 깊이이다. 만약 None으로 주어진다면, 트리는 데이터가 완전히 나누어지거나, min_samples_split에 지정된 개수 미만으로 데이터가 남을 때까지 뻗어나간다. 클수록 더 정확하게 분류가 가능하지만 과적합의 위험이 있다.

 

max_features: {“sqrt”, “log2”, None}, int or float, default=”sqrt”

트리에서 새로운 가지를 뻗어나갈 때 고려할 최대의 feature 숫자이다. 정수라면 해당 개수의 feature까지만 고려하고, 실수라면 int(input_feature의 개수 * max_feature)만큼의 feature까지만 고려한다. 만약 그 숫자가 1보다 작다면 한개의 feature만 고려한다. 만약 sqrt, log2를 인자로 받는다면 input으로 받은 feature에 해당 함수를 취해준 개수까지만 고려한다.

 

min_samples_split: int or float, default=2

리프노드가 아닌 노드를 분리하기 위해서 필요한 최소 데이터 갯수

 

min_samples_leaf: int or float, default=1

리프노드에 필요한 최소 데이터 갯수