스파르타클럽 내일배움캠프 QA/QC 5기 05/06 TIL

2026. 5. 6. 20:21내일배움캠프 TIL

1. 오늘의 목표

  • 기존 모델(2차/3차) 문제점 분석 및 새 베이스라인 구축
  • 1차 모델 전체 파이프라인 구성 (DBSCAN + SMOTE + Optuna + Stacking)
  • 성능 개선을 위한 피처 엔지니어링 + 모델 확장
  • 2차 모델 (극단값 수동 제거 기반) 구축
  • 발표 자료(PPT) 초안 작성

2. 기존 모델 문제점 분석

2차 모델 (2차베이스모델_최지호_제조.ipynb)

  • 27개 변수 중 19개만 수동 선택 → Log_X_Index, Log_Y_Index 등 주요 변수 누락
  • XGBoost 파라미터 오타: n_estimator(→ n_estimators), sub_sample(→ subsample)
  • 존재하지 않는 파라미터 사용: num_boost_around
  • F1-Weighted만 사용 → 소수 클래스 성능 파악 불가
  • 파생변수 X_Range 변수명 혼동 (실제로는 Luminosity Range)

3차 모델 (3차베이스모델_최지호_제조.ipynb)

  • 일부 오타 수정, DBSCAN/SMOTE 파이프라인 추가로 개선
  • 그러나 Optuna 튜닝 함수 내 n_estimator 오타 여전히 존재
  • DBSCAN 탐색 시 테스트셋 F1으로 평가 → Data Leakage 문제
  • 셀 20에 베이스 모델 + 튜닝 + 앙상블이 모두 포함 → 디버깅 어려움

3. 새 베이스라인 모델 구축

핵심 설계 원칙

  • 원본 27개 변수 전체 사용 (수동 선택 X)
  • LabelEncoder로 문자열 레이블 → 숫자 변환 (XGBoost 호환)
  • F1-Macro를 주 평가지표로 설정

XGBoost ValueError 해결

  • XGBoost는 문자열 레이블을 직접 받지 못함
  • LabelEncoder로 0~6 숫자 변환 필수
  • Colab에서 셀 수정 후에는 런타임 재시작 필요 (이전 메모리 변수 간섭 방지)

F1 Score vs 예측 신뢰도

  • F1 Score: 모델 전체의 분류 성능 (Precision × Recall 조화 평균)
  • 예측 신뢰도: 개별 샘플의 예측 확률 → predict_proba() 사용
  • F1-Macro: 모든 클래스를 동등하게 평가 → 클래스 불균형 시 필수
  • F1-Weighted: 샘플 수 비례 가중 → 다수 클래스에 쏠림

4. 1차 모델 전체 파이프라인

파이프라인 흐름

로우 데이터(27개) → 피처 엔지니어링(+12개) → RobustScaler
→ DBSCAN 이상치 제거(CV 기준) → SMOTE 오버샘플링
→ Optuna 튜닝(5개 모델 × 150 trials)
→ Soft Voting + Stacking 앙상블 → 최종 평가

주요 구성 요소

피처 엔지니어링 (12개 파생변수)

  • 기하학적: Width, Height, Area_Ratio, Aspect_Ratio, Perimeter_Area_Ratio
  • 밝기: Luminosity_Range, Mean_Luminosity
  • 위치: X_Center, Relative_X
  • 인덱스 조합: Edge_Square_Ratio, XY_Index_Product, Edge_XY_Sum
  • 다중공선성 제거: TypeOfSteel_A400, Y_Maximum 삭제

전처리

  • RobustScaler: 이상치에 강건 (중앙값/IQR 기반 스케일링)
  • SMOTE: imblearn Pipeline 내 적용 → CV 폴드마다 train에만 적용

모델 5종

  • RandomForest, ExtraTrees, XGBoost, LightGBM, GradientBoosting

Stacking 앙상블

  • Base: 5개 모델 → Meta: LightGBM (lr=0.05, n=200)
  • 단순 Voting보다 성능이 높은 경우가 많음

5. 극단값 분석 및 2차 모델

박스플롯 기반 극단값 탐지

  • 27개 원본 변수 + 12개 파생변수에 대해 박스플롯 시각화
  • 스케일이 다르므로 큰 스케일(12개) / 작은 스케일(13개) / 바이너리(2개) / 파생변수(12개)로 그룹 분리

IQR 일괄 제거의 문제점

  • IQR 1.5배 기준: 전체 33.3% 제거, K_Scratch 84.7% 손실
  • IQR 3.0배 기준: 여전히 K_Scratch 대량 손실
  • K_Scratch는 원래 대형 결함 → 크기 변수에서 "정상적으로 큰 값"이 이상치로 분류됨
  • 결론: 통계적 일괄 제거 대신 수동 제거가 필요

극단값 분석 결과

  • 행 391 (K_Scratch): Pixels_Areas 152,655 / X_Perimeter 10,449 / Y_Perimeter 18,152
    • 5개 변수에서 동시에 최극단값 (같은 샘플 1건)
    • 일반 결함(면적 중앙값 174)의 약 900배
  • 행 1863 (Other_Faults): Aspect_Ratio 83.25 (2위 37.06의 2배 이상)
    • 높이 3, 폭 333으로 비정상적 형태

2차 모델

  • 단 2건만 수동 제거 → 1,939건으로 데이터셋 구성
  • K_Scratch 390건 유지 (0.3% 손실), Other_Faults 672건 유지 (0.1% 손실)
  • DBSCAN 자동 제거 대비 클래스 보존 효과 압도적
  • 나머지 파이프라인(피처 엔지니어링 → RobustScaler → SMOTE → Optuna → Stacking)은 동일 적용

6. 오분류 문제

Pastry / Bumps / Other_Faults 오분류 원인

  • 세 클래스가 피처 공간에서 겹치는 영역이 많음
  • Pastry/Bumps: 둘 다 표면 돌출형 → 크기/밝기 특성 유사
  • Other_Faults: "기타"로 다양한 패턴 혼재 → 경계 모호

해결 방향

  1. 클래스별 샘플 가중치 세분화
  2. 오분류 패턴 분석 후 타겟 피처 추가
  3. 계층적 분류 (1단계 대분류 → 2단계 세부 분류)
  4. 임계치 최적화 (클래스별 threshold tuning)

7. 로컬 환경 이슈

!pip install 미작동

  • !pip은 Colab 전용 매직 커맨드
  • VS Code / 로컬 Jupyter에서는 %pip install 또는 subprocess 사용
# 방법 1
%pip install imbalanced-learn xgboost lightgbm optuna

# 방법 2
import subprocess, sys
subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'imbalanced-learn'])

8. 발표 자료 (PPT) 작성

발표 구성 (10분, 과정 중심)

  1. 프로젝트 개요
  2. 데이터 탐색 (EDA)
  3. 1차 모델 (베이스라인 → 파이프라인)
  4. 1차 모델 한계점
  5. 2차 모델 (이상치 수동 제거 기반)
  6. 1차 vs 2차 비교
  7. 결론 및 향후 계획

결과 보고서 PPT 필수 항목 (템플릿 기준)

  • 01 프로젝트 개요 (주제, 선정 배경, 분석 목표)
  • 02 팀 구성 및 역할 (역할 분담 + 튜터 피드백)
  • 03 수행 절차 및 방법 (일정, 데이터 수집/전처리, 분석 도구)
  • 04 수행 경과 (핵심 섹션)
  • 05 자체 평가 의견 (완성도 + 느낀 점)

04 수행 경과 세부 구성 (최종 v3)

  1. EDA (탐색적 데이터 분석)
  2. 피처 엔지니어링
  3. 이상치 처리
  4. 데이터 분할 및 전처리
  5. 단일 및 앙상블 모델 구축/튜닝
  6. 계층 분류 (1차 대분류 → 2차 세부 분류)
  7. 임계치 최적화
  8. AUC-ROC 분석
  9. 피드백 반영 및 트러블 슈팅

Pretendard 폰트 고정, 빨간색(#E8192C) 디자인 계열


9. 오늘 배운 핵심 개념 정리

Data Leakage 방지

  • DBSCAN 하이퍼파라미터 탐색 시 테스트셋으로 평가하면 과적합 위험
  • 반드시 Cross Validation으로만 평가
  • SMOTE도 CV 폴드 내 train에만 적용 → imblearn Pipeline 사용

IQR 이상치 제거 vs 수동 제거

  • IQR 일괄 제거: 간편하지만 도메인 특성을 무시 → 특정 클래스 대량 손실 가능
  • 수동 제거: 박스플롯으로 확인 후 극단적인 값만 선별 → 클래스 보존에 유리
  • 이 데이터에서는 2건 수동 제거가 DBSCAN 자동 제거보다 압도적으로 효과적

Stacking vs Voting

  • Voting: 각 모델의 예측을 단순 평균/다수결
  • Stacking: 각 모델의 예측을 새로운 피처로 사용하여 메타 모델이 추가 학습

계층적 분류 (Hierarchical Classification)

  • 유사한 결함 간 오분류를 줄이기 위해 2단계로 분류
  • 1차: 7개 → 3그룹 (표면형/선형/오염형)
  • 2차: 그룹 내 세부 분류

10. 다음 할 일

  • [ ] 1차 모델 Colab 실행 및 결과 수치 확인
  • [ ] 2차 모델 실행 및 1차 대비 성능 비교
  • [ ] 계층 분류 코드 구현 및 실행
  • [ ] 임계치 최적화 코드 구현
  • [ ] AUC-ROC 커브 생성 코드 작성
  • [ ] PPT에 결과 수치 및 이미지 삽입
  • [ ] Classification Report / Confusion Matrix 결과 공유 후 추가 개선