Decision Tree 개념, 전처리, 교차 검증
의사결정나무(Decision Tree)는 데이터를 예/아니오 질문을 통해 분류하거나
회귀 분석을 수행하는 지도학습 알고리즘입니다.
마치 스무고개처럼 데이터를 특정 기준에 따라 나눠가며 학습합니다.
특징:
- 분류(Classification)와 회귀(Regression)에 모두 사용 가능.
- 데이터의 불순도(Impurity)를 낮추는 방향으로 분할.
- 불순도 0: 완벽히 분류된 상태(좋은 질문).
- 불순도 0.5: 데이터가 50:50으로 섞인 상태(나쁜 질문).
사용 사례: 버섯 데이터 분류, iris 품종 분류.
의사결정나무는 과대적합(Overfitting)을 방지하기 위해 하이퍼파라미터를 조정해야 합니다:
max_depth: 트리의 최대 깊이. 깊을수록 모델 복잡도 증가 → 과대적합 위험.
max_leaf_nodes: 리프 노드의 최대 개수. 많을수록 과대적합 가능성 증가.
min_samples_split: 노드 분할을 위한 최소 샘플 수. 작을수록 과대적합 위험.
min_samples_leaf: 리프 노드가 가져야 할 최소 샘플 수. 작을수록 과대적합 위험.
트리 생성 전에 하이퍼파라미터를 설정해 모델 복잡도를 제한.
예: max_depth=3으로 설정하면 트리 깊이를 3으로 제한해 과대적합 방지.
의사결정나무를 효과적으로 사용하려면 데이터 전처리가 필수입니다.
데이터에 결측치(Missing Values)가 있는지 확인.
처리 방법: 삭제, 평균/최빈값 대체 등.
범주형 데이터를 수치형으로 변환:
Label Encoding: 범주를 숫자로 매핑.
- 예: capshape (x, f, k, b, s, c) → (0, 1, 2, 3, 4, 5).
- 코드: X1["capshape"] = X1["capshape"].map({"x":0, "f":1, "k":2, "b":3, "s":4, "c":5})
One-hot Encoding: 각 범주를 이진 벡터로 변환.
- 예: pd.get_dummies(X2)로 범주형 데이터를 0과 1로 구성된 열로 변환.
- 장점: 범주 간 순서가 없어 모델의 왜곡 방지.
정답(레이블)과 연관성이 높은 특성을 선택해 모델 성능 향상.
예: iris 데이터에서 petal length가 품종 분류에 큰 영향.
모델의 안정성을 높이고 과대적합을 줄이는 통계적 기법입니다.
K-fold Cross-validation:
1. 전체 데이터를 K개의 그룹으로 나눔.
2. K-1개 그룹으로 학습, 1개 그룹으로 평가.
3. 위 과정을 K번 반복해 모든 데이터가 평가에 사용되도록 함.4
4. 평가 점수의 평균을 계산해 모델 성능 측정.
장점:
- 모든 데이터를 학습과 평가에 활용해 안정적이고 정확한 성능 평가.
- 과대적합 감소, 일반화 성능 향상.
단점: 여러 번 학습/평가하므로 계산량이 많음.
코드 예시:
from sklearn.model_selection import cross_val_score
scores = cross_val_score(tree_model, X, y, cv=5) # 5-fold 교차 검증
print(scores.mean()) # 평균 정확도 출력
의사결정나무는 직관적이고 강력한 지도학습 알고리즘으로,
분류와 회귀에 모두 활용됩니다.
결측치 처리, 인코딩, 특성 선택과 같은 데이터 전처리와
사전 가지치기, 교차 검증을 통해 과대적합을 방지하고 일반화 성능을 높일 수 있습니다.
이를 통해 버섯 분류, 품종 예측 등 다양한 문제를 효과적으로 해결할 수 있습니다.