준비하는 대학생

[기계학습] 앙상블 학습 - 랜덤포레스트(Random Forest) 본문

Programming/Machine learning

[기계학습] 앙상블 학습 - 랜덤포레스트(Random Forest)

Bangii 2023. 6. 8. 19:12

앙상블 학습(Ensemble Learning)이란?

앙상블 학습은 여러 개의 기본 학습 모델을 조합하여 더 강력한 모델을 만드는 기법입니다. 비유를 들자면, 한 명의 전문가의 의견보다 여러 명의 전문가들의 의견을 종합한 쪽이 더 신뢰성이 높을 수 있다는 원리와 비슷합니다.

앙상블 학습의 주요 기법들

1. 보팅(Voting)

보팅은 여러 개의 다른 종류의 기본 모델들의 예측을 결합하는 가장 간단한 형태의 앙상블 학습입니다. 보팅은 크게 두 가지로 나뉩니다.
(같은 데이터를 다른 모델들로 예측)

  • 하드 보팅(Hard Voting): 각 모델의 예측 결과를 투표로 취합하여 가장 많은 표를 얻은 결과를 최종 예측값으로 사용합니다.
  • 소프트 보팅(Soft Voting): 각 모델의 예측 확률을 평균내어, 가장 높은 확률을 가진 결과를 최종 예측값으로 사용합니다.

2. 배깅(Bagging)

배깅은 'Bootstrap Aggregating'의 줄임말로, 원본 데이터셋으로부터 랜덤하게 샘플을 여러 번 추출하여(Bootstrap), 각 샘플로 모델을 개별적으로 학습시킨 후, 이들의 결과를 취합(Aggregating)하는 기법입니다. 대표적인 알고리즘으로는 랜덤 포레스트(Random Forest)가 있습니다.

*부트스트랩: 주어진 데이터를 복원추출로 표본을 추출하고, 이를 이용하여 각 표본의 통계량을 구하거나 모형을 훈련하는 것
(복원추출을 하기 때문에 같은 데이터가 여러번 나올수 있고, 데이터가 한번도 나오지 않을 수 있습니다.)

3. 부스팅(Boosting)

부스팅은 여러 개의 약한 모델(Weak Learners)을 순차적으로 학습시켜, 이전 모델의 오류를 개선하는 방식으로 진행됩니다. 약한 모델들을 점진적으로 강화하여 하나의 강력한 모델로 만들어 나갑니다. 대표적으로 AdaBoost, Gradient Boosting, XGBoost, LightGBM 등이 있습니다.

부스팅 동작 원리

  • 부스팅은 여러 개의 분류기가 순차적으로 학습(병렬로 학습할 수 없음)
  • 이전 학습시 예측이 틀린 데이터에 대해서 올바르게 예측할 수 있도록 다음 분류기에서는 틀린 데이터에 더 큰 가중치를 부여해서 표본 추출 후, 학습과 예측을 수행
  • 이전 모델에서 틀린 데이터를 좀더 집중해서 모델에 투입해서 교정을 이어 나감

랜덤 포레스트(Random Forest)란?

랜덤 포레스트는 앙상블 학습의 한 종류로, 배깅(Bagging) 기법을 활용한 대표적인 알고리즘입니다. 랜덤 포레스트는 여러 개의 의사결정나무(Decision Trees)를 만들고, 이들의 예측을 종합하여 최종 예측을 내는 방법입니다. 포레스트라는 이름에서 알 수 있듯이, 여러 개의 나무들로 이루어진 숲과 같은 개념입니다.

작동 원리

  1. 부트스트랩 샘플링(Bootstrap Sampling): 원본 데이터셋에서 랜덤하게 샘플을 여러 번 추출합니다. 이때, 샘플은 중복 추출이 가능합니다.
  2. 특성 무작위 선택: 각 의사결정나무를 학습시킬 때, 모든 특성을 사용하는 것이 아니라 일부 특성만 무작위로 선택하여 학습합니다. 이를 통해 나무들 사이의 상관관계를 줄이고, 다양성을 증가시킵니다.
    ( 이 때 특성은 전체 특성의 제곱근의 수 만큼 브트스트랩 샘플링하여 선택합니다.)
  3. 나무 생성: 각각의 부트스트랩 샘플과 무작위로 선택된 특성을 사용하여 의사결정나무를 학습시킵니다.
  4. 결과 취합: 모든 의사결정나무의 예측을 취합하여, 가장 많이 등장하는 클래스(분류) 또는 평균(회귀)을 최종 예측 결과로 사용합니다.

장점

  • 과적합(Overfitting) 방지: 개별 나무들의 다양성으로 인해 과적합을 효과적으로 방지할 수 있습니다.
  • 높은 정확도: 여러 나무들의 예측을 취합함으로써 정확도가 높아질 수 있습니다.
  • 병렬 처리 가능: 각 나무는 독립적으로 학습되므로, 병렬 처리를 통해 빠른 학습이 가능합니다.

단점

  • 모델 복잡도: 나무가 많을 경우, 모델의 크기가 커지고, 해석이 어려워질 수 있습니다.

예시코드

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score

# 데이터 로드
iris = load_iris()
X = iris.data
y = iris.target

# 데이터를 학습용과 테스트용으로 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 랜덤 포레스트 모델 생성
# n_estimators는 생성할 의사결정나무의 개수입니다. 더 많은 나무를 사용하면 성능이 좋아질 수 있지만, 계산 시간이 늘어납니다.
clf = RandomForestClassifier(n_estimators=100, random_state=42)

# 모델 학습
clf.fit(X_train, y_train)

# 예측
y_pred = clf.predict(X_test)

# 성능 평가
print("Accuracy: {:.2f}%".format(accuracy_score(y_test, y_pred) * 100))
정확도: 100.00%

RandomForestClassifier 매개변수

  • n_estimators: 랜덤 포레스트에서 사용할 의사결정나무의 개수입니다. 이 값이 크면 클수록 모델의 성능은 좋아질 수 있지만, 계산 시간이 늘어납니다. (기본값: 100)
  • criterion: 분할 품질을 측정하는 기능입니다. “gini”는 지니계수를 사용하고, “entropy”는 엔트로피를 사용합니다. (기본값: “gini”)
  • max_depth: 나무의 최대 깊이를 제어합니다. 이 값이 너무 크면 과적합(overfitting)의 위험이 있고, 너무 작으면 성능이 떨어질 수 있습니다. None으로 설정하면, 모든 리프 노드가 순수해질 때까지 노드가 확장됩니다. (기본값: None)
  • min_samples_split: 노드를 분할하는데 필요한 최소 샘플 수입니다. 이 값이 크면 나무의 깊이가 줄어들어 과적합을 방지할 수 있습니다. (기본값: 2)
  • min_samples_leaf: 리프 노드에 있어야 하는 최소 샘플 수입니다. 이 값도 과적합을 제어하는데 사용됩니다. (기본값: 1)
  • max_features: 각 노드에서 분할에 사용할 특성의 최대 수입니다. 이 값을 적절히 설정하여, 나무들 간의 상관관계를 줄일 수 있습니다. (기본값: "auto", 즉 sqrt(n_features))
  • bootstrap: 부트스트랩 샘플링을 사용할지 여부를 결정합니다. True로 설정하면, 부트스트랩 샘플링을 사용하며, False로 설정하면 전체 데이터셋을 사용합니다. (기본값: True)
  • oob_score: out-of-bag 샘플을 사용하여 일반화 정확도를 추정할지 여부를 결정합니다. (기본값: False)
    (out-of-bag : 학습에 사용되지 않은 데이터)
  • n_jobs: 적합성과 예측을 위해 동시에 실행할 작업 수입니다. -1로 설정하면 모든 프로세서를 사용합니다. (기본값: None)
  • random_state: 랜덤성을 제어하는 데 사용되는 시드 값입니다. 이 값을 고정하여 실험의 재현성을 보장할 수 있습니다. (기본값: None)
  • verbose: 학습 과정에서 출력되는 텍스트 메시지의 상세 수준을 조절합니다. (기본값: 0)
  • class_weight: 클래스 가중치를 설정할 수 있습니다. 불균형한 데이터셋을 처리할 때 유용합니다. (기본값: None)

정리

앙상블 학습은 여러 기본 모델들을 영리하게 조합하여 더 높은 성능을 추구하는 기계학습의 기법입니다. 보팅, 배깅, 부스팅, 스태킹 등 다양한 앙상블 기법들을 적절히 활용함으로써, 복잡하고 다양한 문제에 대해 더욱 견고한 모델을 구축할 수 있습니다. 랜덤 포레스트는 그 중에서도 많이 사용되는 기법으로, 여러 개의 의사결정나무를 활용하여 높은 정확도와 견고함을 제공합니다..

Comments