오늘 실습에서는 다양한 분류 알고리즘을 적용하고 튜닝하는 과정에서 발생한 기술적 문제와 데이터 불균형 대응 전략을 정리합니다.
- 에러 메시지:
TypeError: can only concatenate str (not "numpy.int64") to str - 원인:
plot_tree함수의class_names매개변수에 숫자형 리스트([0, 1])가 전달될 경우, 문자열 합성 과정에서 에러 발생. - 해결:
model.classes_.astype(str)를 사용해 문자열로 변환하거나, 명시적으로['Died', 'Survived']와 같은 이름을 지정하여 해결.
- 에러 메시지:
ValueError: Number of labels=537 does not match number of samples=623 - 원인:
accuracy_score(y_true, y_pred)등에서 훈련 세트 정답(y_train)과 테스트 세트 예측값(y_pred)을 비교하거나, 서로 다른 스플릿 데이터를 혼용함. - 해결: 항상
y_test와 그에 대응하는x_test로 만든 예측값의 개수가 일치하는지 확인 후 전달.
- 에러 메시지:
NameError: name 'x' is not defined - 원인: 피처 행렬을 대문자
X로 저장했으나, 시각화 코드에서 소문자x.columns를 참조함. - 해결: 파이썬의 대소문자 구분(Case-sensitive) 특성에 따라 변수명을
X.columns로 일치시킴.
- 현상: 직원 퇴사 데이터(Attrition) 실습 시, 모델이 모두 "잔류"라고만 답해도 84%의 정확도가 나옴.
- 교훈: 불균형 데이터에서는 Accuracy만 믿으면 안 되며, 실제 우리가 찾아야 할 타겟의 **Recall(재현율)**을 반드시 확인해야 함.
- 실습 내용:
predict_proba()를 활용해 분류 기준을0.5에서0.3으로 하향 조정. - 결과:
- 재현율(Recall): 22% → 68%로 대폭 상승 (퇴사 징후 직원을 3배 더 많이 검출).
- 정밀도(Precision): 일부 하락 (오보 증가).
- 결론: 비즈니스 목표(인재 유실 방지 비용 vs 오보 대응 비용)에 따라 적절한 임계값을 찾는 것이 모델 튜닝의 핵심임.
-
KNN: 최적의
$K$ 값을 찾기 위해range반복문과 시각화를 활용함. -
Decision Tree:
max_depth에 따라 복잡도가 변하며,plot_tree를 통해 "야근 여부" 등이 중요한 분기점임을 직관적으로 확인. - SVM: **커널 트릭(RBF)**의 강력함을 확인했으나, KNN과 마찬가지로 스케일링이 성능에 결정적임을 인지함.
- 교차 검증(Cross-validation)을 통한 모델의 일반화 성능 확보.
- 로지스틱 회귀(Logistic Regression)와 비교 분석을 통한 베이스라인 설정.