본문 바로가기
C.W.K.
Stream
Lesson 06 of 07 · published

Random Forest

~28 min · random-forest, bagging, ensembles

Level 0Scout
0 XP0/48 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

흔들리는 나무를 많이 평균내

무작위 숲은 학습 자료에서 복원추출한 부트스트랩 표본마다 결정나무를 하나씩 키워. 회귀에서는 나무 예측의 평균을, 분류에서는 범주 투표나 확률 평균을 사용해. 단일 깊은 나무는 분산이 크지만 서로 조금씩 다른 많은 나무를 평균내면 우연한 분할이 상쇄되어 일반화가 안정돼.

특성 무작위화가 나무를 서로 다르게 만들어

모든 분할에서 전체 특성을 보면 강한 특성 하나가 거의 모든 나무의 첫 질문이 되어 나무끼리 비슷해질 수 있어. 무작위 숲은 각 분할에서 일부 특성만 후보로 보여 나무 사이 상관을 낮춰. 개별 나무는 조금 약해져도 평균했을 때 분산 감소가 커지는 이유야.

나무 수는 안정될 때까지 늘려

n_estimators를 늘리면 보통 성능이 나빠지진 않지만 학습 시간, 예측 시간, 메모리는 계속 늘어. 몇십 개에서 시작해 수백 개까지 OOB나 검증 점수가 평평해지는 지점을 그려. 점수가 충분히 안정되면 더 많은 나무는 작은 분산 감소만 주므로 운영 예산에 맞춰 멈춰.

나무의 모양을 조절해

max_features는 각 분할에서 볼 특성 수를 정해 나무 다양성과 개별 강도를 바꿔. max_depthmin_samples_leaf는 개별 나무의 복잡도를 제한해. 기본값이 강한 출발점이지만 자료가 작거나 잡음이 많다면 잎의 최소 표본 수를 늘리는 게 도움이 돼. 폴드 간 흔들림과 학습·검증 차이로 조절해.

OOB 표본은 공짜에 가까운 점검 창이야

각 나무의 부트스트랩 표본에는 원본 행의 약 36.8%가 빠져. 해당 행을 보지 않은 나무들의 예측을 모으면 out-of-bag 점수를 계산할 수 있어. oob_score=True는 별도 학습 없이 일반화 추정치를 주지만 시간, 집단, 자료 전처리 경계를 대신 지키지는 않아. 최종 모델 비교에는 문제에 맞는 교차검증과 시험 자료가 여전히 필요해.

확률과 중요도는 따로 검증해

무작위 숲의 확률은 순위는 좋아도 완벽히 보정되지 않을 수 있으니 신뢰도 그림을 봐. 기본 feature_importances_는 가능한 분할점이 많거나 고유값이 많은 특성을 선호하는 편향이 있어. 홀드아웃 자료에서 순열 중요도를 계산하고 연관된 특성이 기여를 나눠 갖는 현상도 설명해야 해.

표 자료의 튼튼한 두 번째 기준선

로지스틱 회귀 다음으로 복잡한 비선형 관계를 큰 튜닝 없이 잡고 싶을 때 무작위 숲이 좋아. 스케일링이 필요 없고 병렬 학습이 쉬운 대신 결과물이 크고 예측 때 많은 나무를 통과해야 해. 그래디언트 부스팅이 종종 조금 더 정확하지만 무작위 숲의 안정성과 단순한 튜닝이 운영에서는 이길 수 있어.

Code

OOB와 균형 범주 가중치를 둔 무작위 숲·python
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(
    n_estimators=400, max_depth=None, max_features="sqrt",
    class_weight="balanced", oob_score=True, n_jobs=-1, random_state=7
)
rf.fit(X_train, y_train)
print("OOB score:", rf.oob_score_)
내부 중요도보다 정직한 순열 중요도·python
from sklearn.inspection import permutation_importance

perm = permutation_importance(rf, X_val, y_val, n_repeats=20, random_state=7, n_jobs=-1)
for name, score in sorted(zip(X_val.columns, perm.importances_mean), key=lambda x: -x[1])[:10]:
    print(f"{score:+.4f}  {name}")

External links

Exercise

문제에 RandomForestClassifier(n_estimators=400, oob_score=True)를 학습해. OOB 점수와 문제에 맞는 5겹 교차검증 평균·표준편차를 비교하고 한 표준편차 밖이라면 분할이나 자료 의존성을 조사해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.