TIL(Today I Learned)
1️⃣실전 자동화 프로젝트 (9)
오늘 한 것
제조 품질 데이터(A_31 / TO_31 두 제품군)의 피처 선택 파이프라인을 새로 구현했다.
핵심은 테스트를 봉인한 채, 훈련 데이터 안에서만 피처를 고르고, 봉인했던 테스트로 딱 한 번 평가하는
구조를 7단계로 정리한 것이다.
- 테스트 봉인 — 평가용 데이터를 선택 과정에서 완전히 격리 (Nested CV로 5번 회전)
- 타깃 섞기 — 피처를 무작위로 섞은 가짜(shadow) 피처를 만들어 노이즈 기준선으로 사용
- 반복 확인 — 50회 반복해 shadow를 꾸준히 이기는지 FDR 보정 이항검정으로 판정
- 쌍둥이 정리 — 상관 높은 피처는 덴드로그램으로 묶어 군집당 대표 1개만

- 성능 곡선 — 피처를 하나씩 늘리며 성능을 재고, 더 넣어도 안 오르면 멈춤
- 재학습 — 확정된 피처로 훈련 데이터 재학습
- 봉인 평가 — 테스트로 단 한 번 평가

여기에 분류(Y_Class)와 회귀(Y_Quality)를 스위치 하나로 함께 지원하도록 만들었다.
어제에 비해 개선된 것
어제까지는 상관 덴드로그램 → permutation → SHAP → "positive_ratio ≥ 0.6" 기준으로 피처를 골랐다.
문제는 이 0.6이라는 임계값이 통계적 근거가 없는 경험적 숫자였다는 점이다.
| 항목 | 어제 | 오늘 |
|---|---|---|
| 통과 기준 | positive_ratio ≥ 0.6 (임의 임계값) |
FDR 보정 이항검정 (통계적 판정) |
| 평가 방식 | A_31은 단일 분할 1회 | A_31·TO_31 모두 Nested CV |
| 대상 | 분류만 | 분류 + 회귀 |
| perc(기준선) | 눈대중 | Nested-CV 성능이 자동 선택 |
가장 큰 진전은 "몇 퍼센트 이상이면 통과"라는 임의 규칙을, "이 피처가 노이즈보다 통계적으로 유의하게
나은가"를 직접 검정하는 방식으로 바꾼 것이다.
정직하게 남기는 한계
블로그에 좋은 숫자만 적고 싶지만, 사실은 혼합 결과다.
| 태스크 | 어제 | 오늘 |
|---|---|---|
| A_31 분류 (macro-F1) | 0.676 (단일 분할) | 0.678 ± 0.055 (nested) |
| TO_31 분류 (macro-F1) | 0.624 ± 0.049 | 0.596 ± 0.095 |
A_31은 비슷하거나 조금 나아졌지만, TO_31 분류는 오히려 떨어졌다. 엄격한 통계 검정이 피처를 적게
남기면서, 표본이 작고 불균형한 TO_31에서는 오히려 과소적합이 생긴 것이다. 또 속도 문제로 Boruta 내부
중요도는 SHAP/permutation이 아니라 gain을 썼는데, 이 부분은 어제 방식이 더 이상에 가까웠다.
즉 이번 작업은 성능이 아니라 방법론의 엄밀성·일관성·범위가 개선된 것이다.
💡 느낀점
정직하게 평가하면 숫자는 대체로 낮아진다. 하지만 그 낮아진 숫자가 진짜 성능이다. 통계적으로 더 엄밀한 방법이 항상 더 좋은 결과를 주는 것은 아니다. 특히 표본이 작으면 엄격하게 진행한 것이이 곧 과소적합으로 돌아온다. 개선은 하나의 숫자가 아니라 여러 축의 트레이드오프였다. 한 축을 올리면 다른 축이 내려갔다. 실측 성능은 분리해서 봐야 한다는 것을 이번에 몸으로 배웠다.
오늘 진행한 선택 기준 위에 어제의 강점(SHAP 기반 중요도, 넉넉한 피처 수)을 얹어, 엄밀함과 성능을 동시에 올려볼 예정이다.
'최종 프로젝트' 카테고리의 다른 글
| Chapter.9 최종 실전 자동화 프로젝트 (12) (1) | 2026.07.13 |
|---|---|
| Chapter.9 최종 실전 자동화 프로젝트 (11) (0) | 2026.07.10 |
| Chapter.9 최종 실전 자동화 프로젝트 (9) (0) | 2026.07.08 |
| Chapter.9 최종 실전 자동화 프로젝트 (8) (0) | 2026.07.07 |
| Chapter.9 최종 실전 자동화 프로젝트 (7) (0) | 2026.07.02 |