랜덤 포레스트(Random Forest)
배깅(Bagging) 기법을 기반으로 한 앙상블 학습 모델
여러 개의 결정 트리(Decision Tree)를 학습시킨 후, 각 트리의 예측 결과를 결합하여 최종 예측 수행
개별 트리들이 독립적으로 학습되므로 과적합 방지, 일반화 성능 향상 가능
랜덤 포레스트의 구조
- 여러 개의 결정 트리로 구성됨
- 각 결정 트리는 원본 데이터에서 부트스트랩 샘플링(Bootstrap Sampling)된 데이터로 학습됨
- 예측 시, 회귀 문제에서는 평균값, 분류 문제에서는 다수결 투표 방식을 사용
랜덤 포레스트의 원리
- 부트스트랩 샘플링: 원본 데이터에서 중복을 허용하여 무작위 샘플 생성
- 결정 트리 학습: 각 부트스트랩 샘플을 사용하여 결정 트리를 학습
- 각 노드에서 무작위로 선택된 특성의 일부만 사용하여 분할을 수행
- 예측 결합: 모든 결정 트리의 예측 결과를 결합하여 최종 예측 수행
- 회귀 문제: 평균 사용
- 분류 문제: 다수결 투표 사용
랜덤 포레스트의 무작위성
랜덤 포레스트는 두 가지 무작위성을 도입하여 모델의 다양성을 높이고 과적합을 방지함
데이터 샘플링의 무작위성 : 각 트리는 원본 데이터에서 무작위로 샘플링된 데이터로 학습됨
특성 선택의 무작위성 : 각 노드에서 특성의 일부만 무작위로 선택하여 분할을 수행함
→ 모델의 상관성이 줄어들고 일반화 성능이 향상
장점
- 과적합 방지 : 여러 개의 결정 트리를 사용하여 단일 트리보다 일반화 성능이 우수함
- 특성 중요도 제공 : 어떤 특성이 예측에 중요한 역할을 하는지 확인할 수 있음 → 데이터 분석에 도움을 줌
- 결측치에 대한 강건함 : 일부 특성에 결측값이 있더라도 비교적 잘 동작함
- 범주형 및 연속형 데이터 모두 사용 가능
단점
- 높은 계산 비용 : 다수의 결정 트리를 학습해야 하므로 학습 시간이 오래 걸릴 수 있음
- 설명이 어려움 : 모델이 복잡하여 해석 가능성이 낮음
- 고차원 데이터에서 성능 저하 가능성 : 너무 많은 특성이 있는 경우, 일부 특성이 모델에 잘 반영되지 않을 수도 있음
랜덤 포레스트 모델 구현 및 평가
유방암 데이터셋을 이용하여 랜덤 포레스트 모델을 구현하고 평가
데이터 로드 및 전처리
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 유방암 데이터 로드
cancer_data = load_breast_cancer()
X, y = cancer_data.data, cancer_data.target
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 데이터 스케일링
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
모델 학습 및 평가
from sklearn.ensemble import RandomForestClassifier
# 랜덤 포레스트 모델 생성
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
# 모델 학습
rf_model.fit(X_train_scaled, y_train)
# 예측
y_pred_rf = rf_model.predict(X_test_scaled)
# 평가
mse_rf = mean_squared_error(y_test, y_pred_rf)
print(f'랜덤 포레스트 모델의 MSE: {mse_rf}')
"""
랜덤 포레스트 모델의 MSE: 0.03276140350877193
"""
중요 특성 확인 및 시각화
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# 데이터프레임 변환
X_df = pd.DataFrame(X, columns=cancer_data.feature_names)
# 특성 중요도 추출
feature_importances = rf_model.feature_importances_
# 특성 중요도를 데이터프레임으로 변환
feature_importances_df = pd.DataFrame({
'Feature': X_df.columns,
'Importance': feature_importances
})
# 중요도 순으로 정렬
feature_importances_df = feature_importances_df.sort_values(by='Importance', ascending=False)
# 특성 중요도 시각화
plt.figure(figsize=(10, 7))
sns.barplot(x='Importance', y='Feature', data=feature_importances_df)
plt.title('랜덤 포레스트의 특성 중요도')
plt.show()

'⊢MachineLearning' 카테고리의 다른 글
앙상블 학습 - XGBoost(eXtreme Gradient Boosting) (2) | 2025.03.18 |
---|---|
앙상블 학습 - 그래디언트 부스팅 머신(Gradient Boosting Machine, GBM) (0) | 2025.03.18 |
앙상블 학습 : 배깅(Bagging)과 부스팅(Boosting) (0) | 2025.03.17 |
비지도학습 : 차원축소 - LDA(Linear Discriminant Analysis) (0) | 2025.03.17 |
비지도학습 : 차원축소 - t-SNE(t-Distributed Stochastic Neighbor Embedding) (2) | 2025.03.17 |