본문 바로가기
두두 IT/머신런닝(ML)

TODO와 함께하는 복습 - 6 (결정트리 & 랜덤포레스트)

by DoDo's 2026. 5. 26.
반응형

📦 패키지 2: 집단 지성과 스무고개 (결정트리 & 랜덤포레스트)

1. 09_결정트리 (Decision Tree)

"결정트리는 완벽하게 **'스무고개 게임'**과 같아. 예를 들어 '이 사람은 건강한가?'라는 문제를 풀 때, AI가 데이터의 특징을 보고 질문을 던지는 거지. '나이가 40세 이상인가요?' ➡️ Yes/No ➡️ '운동을 일주일에 3회 이상 하나요?' ➡️ Yes/No. 이런 식으로 꼬리에 꼬리를 무는 질문 보따리를 나무가 가지를 뻗는 모양처럼 자라나게 해서 최종 정답을 찾아내는 방식이야."

💻 핵심 이론 및 코드 규칙

  • 장점: 지난번에 다룬 plot_tree처럼 AI가 결론을 내린 과정을 인간이 눈으로 다 추적할 수 있어서 아주 명쾌합니다. 또한, 거리를 재는 모델이 아니기 때문에 스케일링(StandardScaler)을 하지 않아도 성능에 아무런 영향이 없습니다.
  • 단점: 질문(가지)을 제한 없이 너무 깊게 파고들면, 내가 가진 공부용 데이터(Train)의 사소한 특징까지 달달 외워버리는 과적합(Overfitting)에 쉽게 빠집니다. 실전 시험(Test)에 가면 점수가 뚝 떨어지죠.
  • 핵심 다이얼: 이 과적합을 막기 위해 나무의 최대 깊이를 제한하는 max_depth 다이얼을 가장 많이 조절합니다.

2. 09_랜덤포레스트 (Random Forest)

🗣️ 남에게 가르칠 때 (이해하기 쉬운 비유)

"결정트리가 똑똑한 의사 한 명의 의견이라면, 랜덤포레스트는 **'의사 100명이 모인 대학병원 컨퍼런스'**야. 아무리 똑똑한 의사(결정트리)도 혼자 결론을 내리면 편견이나 실수를 할 수 있잖아? 그래서 데이터와 특징을 랜덤하게 조금씩 나누어 가진 **서로 다른 나무(Tree)를 수백 그루 심어서 하나의 거대한 숲(Forest)**을 만들어. 그리고 새로운 환자가 오면 100그루의 나무가 각자 진단을 내린 뒤, **다수결(투표)**로 최종 정답을 결정하는 '집단 지성' 알고리즘이지."

💻 핵심 이론 및 코드 규칙

  • 앙상블(Ensemble): 이렇게 여러 개의 모델을 협력시켜서 하나의 강력한 모델을 만드는 기술을 '앙상블'이라고 부릅니다. 랜덤포레스트가 그 대표 주자입니다.
  • 핵심 다이얼: * n_estimators: 숲에 나무를 몇 그루 심을지 정하는 다이얼입니다. (기본값 100)
    • max_depth: 각 나무들이 너무 깊어지지 않게 통제하는 다이얼입니다.

📝 TODO 실습 문제: 랜덤포레스트 숲에 나무 심기

이번에는 랜덤포레스트 모델의 핵심 다이얼들을 조절하는 그리드 서치 코드를 작성해 보겠습니다.

앞서 배운 팁을 복습해 볼까요? 공식 문서를 보지 않고 내 모델이 가진 다이얼 이름들을 확인하고 싶을 때 쓰는 치트키 명령어가 있었습니다.

아래 코드의 빈칸(___) 4개를 채워 완성해 보세요.

Python
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestClassifier # 랜덤포레스트 소환

# 데이터 준비
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    cancer.data, cancer.target, test_size=0.3, random_state=0, stratify=cancer.target
)

# 1. AI 집단지성 모델 객체 생성 (기본 세팅으로 소환)
rf_model = RandomForestClassifier(random_state=42)

# [치트키 리마인드] 모델이 가진 다이얼 이름 목록을 확인하고 싶다면?
# 결과창에 나오는 리스트 중에서 나무 개수 다이얼과 깊이 다이얼을 참고합니다.
print(rf_model.________________().keys())

# 2. 튜닝할 다이얼 후보군 설정
# 이번에는 파이프라인을 안 썼기 때문에 '모델명__'을 붙일 필요 없이 원래 다이얼 이름만 적으면 됩니다!
# 나무 개수(n_estimators) 후보는 50개, 100개 / 최대 깊이(max_depth) 후보는 3, 5로 지정해 보세요.
params = {
    '________________': [50, 100],
    '________________': [3, 5]
}

# 3. 그리드 서치 장비에 모델과 파라미터 후보군 장착
grid_search = GridSearchCV(________, param_grid=params, cv=3, n_jobs=-1)

# 4. 훈련 시작
grid_search.fit(X_train, y_train)

print("최적의 숲 세팅:", grid_search.best_params_)

 


 

정답

 

반응형