[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/Data & AI

[scikit-learn 라이브러리] RandomForestClassifier (랜덤 포레스트 분류)

inu 2020. 8. 12. 21:02
반응형

랜덤 포레스트(Random Forest)

  • 기본 결정트리는 해당 데이터에 대해 맞춰서 분류를 진행한 것이기 때문에 과적합 현상이 자주 나타났다.
  • 그에 따라 이를 개선하기 위해 2001년 앙상블 기법으로 고안된 것이 랜덤 포레스트이다.
  • 훈련 과정에서 구성한 다수의 결정 트리들을 랜덤하게 학습시켜 분류 또는 회귀의 결과도출에 사용된다.
  • 즉, 특정 특성을 선택하는 트리를 여러개 생성하여 이들을 기반으로 작업을 수행하는 것이다.
  • 각각의 트리가 독립적으로 학습하기 때문에 학습과정을 병렬화할 수 있다.
  • 일반적인 의사결정트리는 Tree Correlation이라고 하는 특정 feature 하나가 정답에 많은 영향을 주게되면 대부분의 결과치가 유사하게 나타나는 문제점이 있었다.
  • 하지만 랜덤 포레스트에서는 그러한 문제를 해결했고, 파라미터의 개수가 적어 튜닝도 쉽다.
  • 타깃 예측을 잘하며 각각이 구별되는 여러개의 트리를 만들기 위해 무작위성이 부여된다.
  • 대표적인 '배깅' 모델이다. (cf. 배깅(Bagging)은 bootstrap aggregating의 줄임말이다.)
  • 결정트리의 단점을 보완하고 장점은 그대로 가지고 있는 모델이어서 별다른 조정 없이도 괜찮을 결과를 만들어낸다.
  • 랜덤하게 만들어지기 때문에 random_state를 고정해야 같은 결과를 볼 수 있다.
  • 트리 개수가 많아질 수록 시간이 더 오래 걸린다.

랜덤 포레스트 과정

  • 모델 내부에 트리를 만들기 위해 데이터에 대한 부트스트랩 샘플들을 생성한다. 부트스트랩 샘플이란 중복을 허용한 샘플로서, 데이터에서 부트스트랩 샘플이 생성된다. (ex. [‘a’, ‘b’, ‘c’, ‘d’]에서 부트스트랩 샘플을 만든다고 하면 [‘b’, ‘d’, ‘d’, ‘c’] , [‘d’, ‘a’, ‘d’, ‘a’], [‘a’, ‘a’, ‘c’, ‘b’] 등이 생성된다.)
  • 생성 데이터 샘플을 기반으로 트리들을 생성한다. 몇 의 특성을 고를지(max_features), 몇 의 트리를 만들지(n_estimators) 등을 파라미터로 받아 이를 기반으로 생성된다.
  • 이렇게 생성된 모든 트리를 기반으로 예측이 수행된다. 회귀의 경우 모든 예측을 평균하여 결과를 도출하고, 분류는 soft voting 방식을 응용해 사용한다.

RandomForestClassifier()

RandomForestClassifier(n_estimators, criterion, max_depth, min_samples_split, min_samples_leaf, min_weight_fraction_leaf, max_features, max_leaf_nodes, min_impurity_decrease, min_impurity_split, bootstrap, oob_score, n_jobs, random_state, verbose, warm_start, class_weight)
  • n_estimators : 모델에서 사용할 트리 갯수(학습시 생성할 트리 갯수)
  • criterion : 분할 품질을 측정하는 기능 (default : gini)
  • max_depth : 트리의 최대 깊이
  • min_samples_split : 내부 노드를 분할하는데 필요한 최소 샘플 수 (default : 2)
  • min_samples_leaf : 리프 노드에 있어야 할 최소 샘플 수 (default : 1)
  • min_weight_fraction_leaf : min_sample_leaf와 같지만 가중치가 부여된 샘플 수에서의 비율
  • max_features : 각 노드에서 분할에 사용할 특징의 최대 수
  • max_leaf_nodes : 리프 노드의 최대수
  • min_impurity_decrease : 최소 불순도
  • min_impurity_split : 나무 성장을 멈추기 위한 임계치
  • bootstrap : 부트스트랩(중복허용 샘플링) 사용 여부
  • oob_score : 일반화 정확도를 줄이기 위해 밖의 샘플 사용 여부
  • n_jobs :적합성과 예측성을 위해 병렬로 실행할 작업 수
  • random_state : 난수 seed 설정
  • verbose : 실행 과정 출력 여부
  • warm_start : 이전 호출의 솔루션을 재사용하여 합계에 더 많은 견적가를 추가
  • class_weight : 클래스 가중치

사용예제

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

# 데이터 로드
X, y = make_moons(n_samples=100, noise=0.25, random_state=3)
X_train, X_test, y_train, y_test = train_test_split(X,y,stratify=y,random_state=42)

# 모델 학습
model = RandomForestClassifier(n_estimators=5, random_state=0)
model.fit(X_train, y_train)
  • make_moons 데이터로부터 데이터를 받고 이를 학습데이터와 테스트데이터로 분류한다.
  • 모델을 생성하고 위의 학습데이터를 학습(fit)시킨다.
  • 이렇게 학습 후 생성된 랜덤포레스트 내부 트리는 estimator_ 속성에 저장되어 있다.
import matplotlib.pyplot as plt
import mglearn

# 결정 경계 시각화
# 다섯 개의 결정트리 결정 경계
fig, axes = plt.subplots(2, 3, figsize=(20,10) )
for i, (ax, tree) in enumerate( zip( axes.ravel(), model.estimators_ ) ):
    ax.set_title("tree {}".format(i) )
    mglearn.plots.plot_tree_partition(X, y, tree, ax=ax)

# 랜덤포레스트로 만들어진 결정경계
axes[-1, -1].set_title("Random forest")
mglearn.plots.plot_2d_separator(model, X, fill=True, alpha=0.5, ax=axes[-1,-1] )
mglearn.discrete_scatter(X[:,0], X[:,1], y)

  • 그렇게 만들어진 랜덤포레스트의 결정경계와 내부에 존재하는 트리들의 결정경계를 시각화하여 확인해보았다.
  • 각 트리들의 특성을 기반으로 랜덤 포레스트는 덜 과적합된 좋은 결정경계를 그리고 있음을 알 수 있다.
  • 실제의 경우 더 많은 트리(수백~수천)를 사용하기 때문에 훨씬 부드럽고 합리적인 결정경계를 그려낸다.

oob_score

  • oob_score의 oob는 out-of-bag의 약자로, 부트스트랩 샘플링 시 선택되지 않은 샘플을 뜻한다. oob_score를 true로 하면 훈련 종료 후 oob 샘플을 기반으로 평가를 수행한다.
# 모델 학습
model = RandomForestClassifier(n_estimators=10, random_state=0,
                              max_features=4, oob_score=True)
model.fit(X_train, y_train)

# 평가
print("훈련 세트 정확도: {:.3f}".format(model.score(X_train, y_train)) )
print("테스트 세트 정확도: {:.3f}".format(model.score(X_test, y_test)) )
print("OOB 샘플의 정확도: {:.3f}".format(model.oob_score_) )
==결과==
훈련 세트 정확도: 0.992
테스트 세트 정확도: 0.933
OOB 샘플의 정확도: 0.958

cf. 엑스트라 트리(Extra-Trees)

  • 랜덤 포레스트보다 특성선택과 샘플링에 있어 무작위성을 많이 갖는 앙상블 모델이다.
  • 랜덤 포레스트에서 최적의 임계값을 찾아 그를 특성으로 선택했던 것과 달리, 엑스트라 트리는 후보 특성을 기반으로 무작위로 분할을 하고 그 중 최적치를 선택하게 된다. 즉, 무작위성이 더 크다.
  • 또한 부트스트랩 샘플링을 적용하지 않고 전체 원본 샘플을 사용한다. 부트스트랩 샘플링에 따른 다양성으로 발생할 분산을 조금 줄이는 것이다.
  • ExtraTreesClassifier() 함수를 사용하고 파라미터는 랜덤포레스트와 유사하다. (https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html)
  • 계산 비용 및 실행 시간 측면 에서 Extra Trees 알고리즘이 더 빠르다.
반응형