일반적인 Train/Test Split만으로는 데이터가 부족하고 불안정 → 5-Fold 교차검증 사용.
데이터셋을 5개로 나누어,
매번 4개는 학습, 1개는 검증에 사용.
총 5회 반복하여 모든 데이터가 검증 세트로 한 번씩 사용됨.
이렇게 얻은 예측값을 Out-of-Fold(OOF) Predictions라고 함 → 모델 성능 추정에 활용.
각 fold의 검증 예측값을 oof라는 pandas DataFrame에 저장.
2️⃣ 모델 선택 (Model Selection)
트리 기반 모델들 중에서 선택 가능:
RandomForestModel
GradientBoostedTreesModel
CART
Distributed GBT
첫 단계에서는 Random Forest 사용.
여러 개의 의사결정 나무(Decision Tree)를 배깅(Bagging, 복원추출) 방식으로 학습.
과적합에 강하고 사용이 간단함.
3️⃣ 하이퍼파라미터 설정 (Hyperparameter Tuning)
데이터셋 크기가 작아 → 과적합 위험 ↑
주요 파라미터:
max_depth (트리 최대 깊이): 기본 16 → 줄이면 과적합 방지.
num_trees (트리 개수): 기본 300 → 늘리면 안정성 ↑.
TensorFlow Decision Forests에서 템플릿/직접 파라미터 지정으로 조정 가능.
4️⃣ 데이터 불균형 처리 (Handling Class Imbalance)
Class 1(양성, 질환 있음) = 전체의 17.5% → 심각한 불균형.
불균형 데이터 문제:
모델이 대다수 클래스(Class 0) 에 치우쳐 학습 → 소수 클래스(Class 1) 예측 성능 저하.
해결 방법:
Undersampling: 다수 클래스 샘플을 일부만 선택해 학습. (랜덤 부분집합 여러 번 시도)
Class Weighting (클래스 가중치): 소수 클래스에 더 큰 가중치 부여 → 모델이 더 주목하도록 만듦.
이 노트북에서는 Class Weighting 적용.
Keras의 model.fit(..., class_weight={0:1, 1:5}) 형태로 전달.
5️⃣ 모델 학습 (Train Random Forest)
각 Fold마다 모델 학습 + 성능 기록.
성능 지표(Metrics):
Accuracy (정확도)
Binary Crossentropy (이진 교차 엔트로피, 확률 기반 평가)
학습된 모델과 메트릭스를 저장.
6️⃣ 모델 시각화 (Model Visualization)
트리 기반 모델의 장점 → 시각화 가능.
랜덤포레스트 = 기본 300개의 트리 → 그중 임의의 트리 선택 가능.
models 딕셔너리에서 특정 모델을 고르고, 하나의 트리를 선택해 구조를 시각화.
✅ 전체 흐름 요약
K-Fold 교차검증 → 성능 안정적 추정 (OOF Predictions)
Random Forest 모델 선택 → 기본 분류 작업
하이퍼파라미터 튜닝 → max_depth 줄이고, num_trees 늘려 과적합 방지
데이터 불균형 처리 → Class Weighting 사용 (언더샘플링 보조)
모델 학습 및 평가 → Accuracy, Binary Crossentropy
모델 시각화 → 트리 구조 확인 가능
시각화한 트리 구조 모습
4. Lesson Learned
이번 프로젝트에서는 의료 데이터셋을 활용해 세 가지 질환 중 하나 이상이 있는지(Class 1) vs 질환 없음(Class 0) 을 예측하는 분류 모델을 만들었다. 데이터셋의 크기가 크지 않고, 클래스 불균형이 심하다는 점이 큰 도전 과제였다. 이 과정을 통해 배운 점들을 정리해본다.