
랜덤 포레스트 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()

의사결정나무 vs 랜덤 포레스트
랜덤 포레스트는 성능 면에서 의사결정나무보다 대부분 우수하지만, 트리가 많아질수록 학습 시간과 메모리 사용량이 증가합니다. 해석 가능성이 중요한 경우에는 의사결정나무를, 예측 성능이 우선인 경우에는 랜덤 포레스트를 선택합니다.
| 항목 | 의사결정나무 | 랜덤 포레스트 |
| 구조 | 단일 트리 | 다수의 트리 앙상블 |
| 해석 가능성 | 높음(트리 시각화 가능) | 낮음(개별 트리 해석 어려움) |
| 과적합 | 과적합 발생 쉬움 | 과적합에 강건 |
| 예측 성능 | 상대적으로 낮음 | 상대적으로 높음 |
| 학습 속도 | 빠름 | 느림(트리 수에 비례) |
| 특성 중요도 | 제공 | 제공(더 안정적) |
마무리하며
랜덤 포레스트는 배깅과 특성 무작위 선택을 통해 다수의 의사결정나무를 독립적으로 학습시키고 결과를 집계하는 앙상블 알고리즘입니다. 단일 트리의 과적합 문제를 효과적으로 보완하며, 특성 중요도를 통해 변수 선택에도 활용할 수 있습니다. "n_estimators"와 "max_depth"가 성능에 가장 큰 영향을 미치는 파라미터입니다.
'이론' 카테고리의 다른 글
| [알고리즘] 주성분 분석 PCA - 개념 정리 (2) | 2026.07.29 |
|---|---|
| [알고리즘] 라쏘 회귀 - Lasso Regression 개념 정리 (2) | 2026.07.23 |
| [알고리즘] 의사결정나무 Decision Tree - 개념 정리 (2) | 2026.07.07 |
| [이론] CVRP, Capacitated Vehicle Routing Problem - 기초 개념 정리 (3) | 2026.06.29 |
| [이론] TSP Traveling Salesman Problem - 기초 개념 정리 (3) | 2026.04.06 |