이론

[알고리즘] 랜덤 포레스트 Random Forest 개념 정리

weweGH 2026. 8. 5. 09:00
반응형

랜덤 포레스트 개념 정리
랜덤 포레스트 개념 정리


랜덤 포레스트 Random Forest 개념 정리


들어가며


랜덤 포레스트(Random Forest)는 여러 개의 의사결정나무를 동시에 학습시켜 그 결과를 종합하는 앙상블(Ensemble) 알고리즘입니다.

의사결정나무 하나는 데이터에 과적합되기 쉬운 단점이 있습니다. 이를 보완하기 위해 등장한 방법이 랜덤 포레스트입니다. 나무 한 그루보다 숲 전체가 더 안정적인 판단을 내리는 것처럼, 수십~수백 개의 트리를 조합하여 더 정확하고 견고한 예측을 만들어 냅니다.

이 글에서는 랜덤 포레스트의 핵심 개념인 배깅(Bagging)특성 무작위 선택(Feature Randomness)을 중심으로 동작 원리를 설명하고, 파이썬 구현 예제를 소개합니다.


  • 배깅-랜덤 포레스트의 핵심 아이디어
  • 랜덤 포레스트의 동작 과정
  • 특성 중요도
  • 파이썬을 활용한 랜덤 포레스트
  • 의사결정나무 vs 랜덤 포레스트

배깅 - 랜덤 포레스트의 핵심 아이디어


랜덤 포레스트는 배깅(Bagging, Bootstrap Aggregating) 기법을 기반으로 합니다.

배깅이란, 원본 데이터에서 복원 추출(Bootstrap) 로 여러 개의 서로 다른 학습 데이터를 만들고, 각각 독립적으로 모델을 학습시킨 뒤 결과를 집계(Aggregating)하는 방법입니다. 예를 들어, 100명의 의사에게 같은 환자를 진료하게 한 뒤 다수결로 최종 진단을 내리는 방식과 유사합니다. 의사 한 명이 틀려도 전체 결론에 큰 영향을 주지 않습니다.

배깅 예시
배깅 예시

복원 추출(Bootstrap)이란, 전체 데이터에서 샘플을 뽑을 때 한 번 뽑은 데이터를 다시 후보에 넣고 뽑는 방식입니다. 따라서 각 트리의 학습 데이터는 서로 조금씩 다르게 구성됩니다.

용어 설명
Bootstrap 원본 데이터에서 복원 추출로 서브셋 생성
Aggregating 분류: 다수결 투표 / 회귀: 평균값으로 최종 예측
OOB(Out-Of-Bag) 부트스트랩에 포함되지 않은 샘플로 검증에 활용

랜덤 포레스트의 동작 과정


랜덤 포레스트는 다음 과정으로 동작합니다.


1단계 - 데이터 샘플링

전체 학습 데이터에서 복원 추출로 $B$개의 서브셋을 만듭니다. 각 서브셋의 크기는 원본 데이터와 동일합니다.

 

2단계 - 특성 무작위 선택

각 트리를 학습할 때, 전체 특성(feature) 중 일부만 무작위로 선택하여 분할 기준을 결정합니다. 일반적으로 전체 특성 수 $p$에 대해 $\sqrt{p}$개(분류) 또는 $p/3$개(회귀)를 사용합니다. 이 단계가 의사결정나무의 단순 배깅과 구별되는 랜덤 포레스트만의 핵심입니다. 특성까지 무작위로 선택하면 트리 간의 상관관계가 낮아져 앙상블 효과가 극대화됩니다.

 

3단계 - 트리 학습

각 서브셋으로 의사결정나무를 독립적으로 학습합니다. 가지치기(Pruning)는 하지 않고 최대 깊이까지 학습합니다.

 

4단계 - 결과 집계

  • 분류(Classification): $B$개 트리의 예측 결과 중 가장 많은 클래스 선택 (다수결)
  • 회귀(Regression): $B$개 트리의 예측값 평균 최종 예측 수식은 다음과 같습니다.

$$ \hat{y} = \frac{1}{B} \sum_{b=1}^{B} f_b(x) $$

  • $\hat{y}$: 최종 예측값 (회귀의 경우 평균)
  • $B$: 트리의 수 (n_estimators)
  • $f_b(x)$: $b$번째 트리의 예측값

특성 중요도 Feature Importance


랜덤 포레스트는 학습 과정에서 특성 중요도(Feature Importance)를 자동으로 계산합니다. 각 특성이 불순도를 얼마나 감소시키는지를 기준으로 중요도를 산출합니다.

특성 중요도의 수식은 다음과 같습니다.

$$ FI_j = \frac{1}{B} \sum_{b=1}^{B} \sum_{\text{node } t \in f_b, \, x_j \text{로 분할}} \frac{n_t}{n} \cdot \Delta Impurity_t $$

  • $FI_j$: 특성 $j$의 중요도
  • $n_t$: 노드 $t$에 속한 샘플 수
  • $\Delta Impurity_t$: 분할 전후 불순도 감소량

수식이 복잡해 보이지만, 핵심은 "특정 특성으로 분할했을 때 불순도가 많이 줄어들수록 중요한 특성" 으로 판단한다는 점입니다. 특성 중요도를 활용하면 어떤 변수가 예측에 실질적인 영향을 미치는지 파악할 수 있어, 변수 선택(Feature Selection)에 유용하게 활용됩니다.

반응형

파이썬을 활용한 랜덤 포레스트


파이썬에서는 sklearn의 RandomForestClassifier를 사용하여 랜덤 포레스트를 구현합니다. 유방암 데이터셋(breast_cancer)으로 분류 예제를 구현하면 다음과 같습니다.

출력 결과에서 단일 의사결정나무 대비 높은 정확도를 확인할 수 있습니다.

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
import matplotlib.pyplot as plt

# 데이터 로드
data = load_breast_cancer()
X, y = data.data, data.target

# 학습/테스트 분리
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 모델 학습
model = RandomForestClassifier(
    n_estimators=100,   # 트리 개수
    max_depth=5,        # 최대 깊이
    random_state=42
)
model.fit(X_train, y_train)

# 예측 및 정확도 확인
y_pred = model.predict(X_test)
print(f"정확도: {accuracy_score(y_test, y_pred):.4f}")

정확도 출력
정확도 출력


주요 파라미터

파라미터 설명 기본값
n_estimators 트리의 수. 많을수록 안정적이나 학습 시간 증가 100
max_depth 개별 트리의 최대 깊이 (과적합 방지) None
max_features 분할 시 고려할 특성 수 (sqrt, log2, 정수) sqrt
min_samples_split 노드 분할에 필요한 최소 샘플 수 2
oob_score OOB 샘플로 검증 여부 False
n_jobs 병렬 처리 CPU 수 (-1이면 전체 사용) 1

특성 중요도 시각화

"feature_importances_" 속성으로 각 특성의 중요도를 바로 확인할 수 있습니다. 중요도가 높은 특성에 집중하여 모델을 개선하거나 불필요한 특성을 제거할 수 있습니다.

# 특성 중요도 상위 10개 시각화
importances = pd.Series(
    model.feature_importances_,
    index=data.feature_names
).sort_values(ascending=False)[:10]

plt.figure(figsize=(10, 6))
importances.plot(kind='bar')
plt.title("Feature Importance - 상위 10개")
plt.ylabel("중요도")
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()

Feature Importance 시각화
Feature Importance 시각화


의사결정나무 vs 랜덤 포레스트


랜덤 포레스트는 성능 면에서 의사결정나무보다 대부분 우수하지만, 트리가 많아질수록 학습 시간과 메모리 사용량이 증가합니다. 해석 가능성이 중요한 경우에는 의사결정나무를, 예측 성능이 우선인 경우에는 랜덤 포레스트를 선택합니다.

항목 의사결정나무 랜덤 포레스트
구조 단일 트리 다수의 트리 앙상블
해석 가능성 높음(트리 시각화 가능) 낮음(개별 트리 해석 어려움)
과적합 과적합 발생 쉬움 과적합에 강건
예측 성능 상대적으로 낮음 상대적으로 높음
학습 속도 빠름 느림(트리 수에 비례)
특성 중요도 제공 제공(더 안정적)

마무리하며

랜덤 포레스트는 배깅과 특성 무작위 선택을 통해 다수의 의사결정나무를 독립적으로 학습시키고 결과를 집계하는 앙상블 알고리즘입니다. 단일 트리의 과적합 문제를 효과적으로 보완하며, 특성 중요도를 통해 변수 선택에도 활용할 수 있습니다. "n_estimators""max_depth"가 성능에 가장 큰 영향을 미치는 파라미터입니다.


반응형