랜덤포레스트 (Random Forest) #
랜덤포레스트(Random Forest)는 여러 개의 의사결정나무를 조합하여 예측 성능을 향상시키는 앙상블(Ensemble) 학습 기법이다. 배깅(Bagging)과 무작위 특성 선택을 결합하여 개별 의사결정나무의 단점을 보완하고, 더 안정적이고 정확한 예측을 제공한다.
랜덤포레스트 이름의 의미 #
“랜덤포레스트"라는 이름은 두 가지 핵심 개념에서 유래되었다:
-
포레스트(Forest, 숲): 여러 개의 의사결정나무(Decision Tree)들이 모여 하나의 “숲"을 이룬다는 의미이다. 하나의 나무가 아닌 많은 나무들이 함께 작동하여 더 강력한 예측력을 만들어낸다.
-
랜덤(Random, 무작위): 각 나무를 학습할 때 두 가지 무작위성을 도입한다:
- 데이터의 무작위 선택: 부트스트랩 샘플링을 통해 각 나무마다 다른 훈련 데이터를 사용
- 특성의 무작위 선택: 각 노드에서 분할할 때 전체 특성 중 일부만 무작위로 선택
이러한 무작위성은 개별 나무들이 서로 다른 패턴을 학습하게 하여 다양성을 증가시키고, 최종적으로 더 일반화된 모델을 만드는 핵심 요소이다.
랜덤포레스트의 기본 개념 #
랜덤포레스트는 “숲을 이루는 나무들"이라는 의미로, 많은 의사결정나무들이 모여서 하나의 강력한 예측 모델을 만든다는 개념이다. 각각의 나무는 서로 다른 데이터 샘플과 특성을 사용하여 학습되며, 최종 예측은 모든 나무들의 투표(분류) 또는 평균(회귀)으로 결정된다.
랜덤포레스트의 핵심 원리 #
1. 배깅 (Bootstrap Aggregating) #
- 원본 데이터에서 복원 추출로 여러 개의 부트스트랩 샘플을 생성
- 각 샘플은 원본 데이터와 같은 크기를 가지지만 일부 데이터는 중복되고 일부는 누락됨
- 각 부트스트랩 샘플로 개별 의사결정나무를 학습
2. 무작위 특성 선택 (Random Feature Selection) #
- 각 노드에서 분할할 때 전체 특성 중 일부만 무작위로 선택
- 일반적으로 분류에서는 √p개, 회귀에서는 p/3개의 특성을 선택 (p는 전체 특성 수)
- 이를 통해 나무들 간의 상관관계를 줄이고 다양성을 증가
3. 다수결 투표 (Majority Voting) #
-
분류: 각 나무의 예측 클래스 중 가장 많이 선택된 클래스를 최종 예측
-
회귀: 모든 나무의 예측값의 평균을 최종 예측값으로 사용
랜덤포레스트의 가장 큰 장점은 배깅에 있다. 배깅은 샘플의 오차를 극복하는 획기적인 통계학작 방법이다. 배깅을 이해했다면 랜덤포레스트를 모두 이해했다고 할 수 있다.
랜덤포레스트의 장점 #
- 높은 예측 성능: 개별 의사결정나무보다 일반적으로 더 좋은 성능
- 과적합 방지: 여러 나무의 조합으로 과적합 위험 감소
- 안정성: 데이터의 작은 변화에 덜 민감
- 특성 중요도 제공: 각 특성의 중요도를 자동으로 계산
- 결측값 처리: 결측값이 있어도 학습 가능
- 병렬 처리: 각 나무를 독립적으로 학습할 수 있어 병렬 처리 가능
- 하이퍼파라미터 튜닝 용이: 기본 설정으로도 좋은 성능
랜덤포레스트의 단점 #
- 해석 어려움: 개별 의사결정나무에 비해 해석이 어려움
- 메모리 사용량: 많은 나무를 저장해야 하므로 메모리 사용량이 큼
- 예측 시간: 모든 나무의 예측을 계산해야 하므로 예측 시간이 오래 걸림
- 노이즈에 민감: 매우 노이즈가 많은 데이터에서는 성능이 떨어질 수 있음
주요 하이퍼파라미터 #
1. n_estimators (나무의 개수) #
- 포레스트에 포함될 의사결정나무의 개수
- 일반적으로 많을수록 성능이 좋아지지만 계산 비용 증가
- 보통 100~1000 사이의 값 사용
2. max_features (최대 특성 수) #
- 각 분할에서 고려할 최대 특성 수
- ‘sqrt’: √(전체 특성 수) - 분류에서 기본값
- ’log2’: log₂(전체 특성 수)
- None: 모든 특성 사용
3. max_depth (최대 깊이) #
- 각 나무의 최대 깊이
- None으로 설정하면 모든 잎이 순수하거나 최소 샘플 수에 도달할 때까지 성장
4. min_samples_split (분할 최소 샘플 수) #
- 내부 노드를 분할하기 위한 최소 샘플 수
- 과적합 방지에 도움
5. min_samples_leaf (잎 노드 최소 샘플 수) #
- 잎 노드에 있어야 하는 최소 샘플 수
- 과적합 방지에 도움
특성 중요도 (Feature Importance) #
랜덤포레스트는 각 특성의 중요도를 자동으로 계산한다:
$$\text{Importance}(X_j) = \frac{1}{T} \sum_{t=1}^{T} \sum_{노드} p(t) \times \Delta I(t, X_j)$$여기서:
- T는 나무의 개수
- p(t)는 노드 t에 도달하는 샘플의 비율
- ΔI(t, Xⱼ)는 특성 Xⱼ로 분할했을 때의 불순도 감소량
Out-of-Bag (OOB) 오차 #
랜덤포레스트는 별도의 검증 데이터 없이도 성능을 평가할 수 있다:
- 각 부트스트랩 샘플에 포함되지 않은 데이터(약 36.8%)를 OOB 샘플이라 함
- OOB 샘플을 이용해 각 나무의 성능을 평가
- 전체 OOB 오차는 모델의 일반화 성능을 추정하는 데 사용
실제 적용 예시 #
랜덤포레스트는 다양한 분야에서 널리 활용된다:
1. 금융 #
- 신용 위험 평가
- 주식 가격 예측
- 사기 거래 탐지
2. 의료 #
- 질병 진단
- 약물 효과 예측
- 의료 이미지 분석
3. 마케팅 #
- 고객 이탈 예측
- 추천 시스템
- 광고 클릭률 예측
4. 제조업 #
- 품질 관리
- 예측 정비
- 공정 최적화
다른 앙상블 방법과의 비교 #
vs 배깅 #
- 랜덤포레스트는 배깅에 무작위 특성 선택을 추가한 방법
- 더 다양한 나무들을 생성하여 성능 향상
vs 부스팅 #
- 부스팅은 순차적으로 학습하여 이전 모델의 오류를 보정
- 랜덤포레스트는 병렬적으로 학습하여 더 빠름
- 부스팅이 일반적으로 더 높은 성능을 보이지만 과적합 위험이 더 큼
성능 평가 및 튜닝 #
1. 교차 검증 #
- k-겹 교차 검증을 통한 성능 평가
- OOB 오차를 활용한 빠른 성능 추정
2. 그리드 서치 #
- 주요 하이퍼파라미터의 최적 조합 탐색
- n_estimators, max_features, max_depth 등
3. 학습 곡선 분석 #
- 나무 개수에 따른 성능 변화 관찰
- 과적합 여부 확인
구현 시 고려사항 #
- 데이터 전처리: 스케일링이 필요하지 않지만 결측값 처리는 필요
- 클래스 불균형: class_weight 파라미터로 클래스 가중치 조정
- 메모리 관리: 큰 데이터셋에서는 n_jobs 파라미터로 병렬 처리 활용
- 예측 확률: predict_proba()로 클래스별 확률 정보 활용
랜덤포레스트는 사용하기 쉽고 강력한 성능을 제공하는 알고리즘으로, 많은 실무 프로젝트에서 첫 번째 선택지로 고려되는 방법이다. 특히 해석 가능성보다는 예측 성능이 중요한 경우에 매우 유용한 도구이다.