스파르타클럽 내일배움캠프 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단계 세부 분류)
- 임계치 최적화 (클래스별 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분, 과정 중심)
- 프로젝트 개요
- 데이터 탐색 (EDA)
- 1차 모델 (베이스라인 → 파이프라인)
- 1차 모델 한계점
- 2차 모델 (이상치 수동 제거 기반)
- 1차 vs 2차 비교
- 결론 및 향후 계획
결과 보고서 PPT 필수 항목 (템플릿 기준)
- 01 프로젝트 개요 (주제, 선정 배경, 분석 목표)
- 02 팀 구성 및 역할 (역할 분담 + 튜터 피드백)
- 03 수행 절차 및 방법 (일정, 데이터 수집/전처리, 분석 도구)
- 04 수행 경과 (핵심 섹션)
- 05 자체 평가 의견 (완성도 + 느낀 점)
04 수행 경과 세부 구성 (최종 v3)
- EDA (탐색적 데이터 분석)
- 피처 엔지니어링
- 이상치 처리
- 데이터 분할 및 전처리
- 단일 및 앙상블 모델 구축/튜닝
- 계층 분류 (1차 대분류 → 2차 세부 분류)
- 임계치 최적화
- AUC-ROC 분석
- 피드백 반영 및 트러블 슈팅
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 결과 공유 후 추가 개선
'내일배움캠프 TIL' 카테고리의 다른 글
| 스파르타클럽 내일배움캠프 QA/QC 5기 05/08 TIL (0) | 2026.05.08 |
|---|---|
| 스파르타클럽 내일배움캠프 QA/QC 5기 05/07 TIL (0) | 2026.05.07 |
| 스파르타클럽 내일배움캠프 QA/QC 5기 05/04 TIL (0) | 2026.05.04 |
| 스파르타클럽 내일배움캠프 QA/QC 5기 04/23 TIL (1) | 2026.04.23 |
| 스파르타클럽 내일배움캠프 QA/QC 5기 04/22 TIL (0) | 2026.04.22 |