무엇: 원자료를 Person-Period 데이터셋으로 만들고, Global/Local 모델을 같은 조건에서 실행하는 팀 공용 코드다.
왜: 각자가 Notebook을 마지막에 합치는 대신, 처음부터 같은 입력·분할·전처리·결과 형식을 사용해 PR만으로 연결하기 위해 만든다.
먼저 AGENTS.md와 ../plan/details/06-인터페이스.md를 읽는다.
| 폴더/파일 | 역할 | 담당자가 채울 부분 |
|---|---|---|
pipeline/ |
원자료 읽기, Person-Period, Global/Local, SAMPID split, 실행점 | YP 원문항을 표준 Feature로 바꾸는 source adapter 보완 |
preprocess/ |
Feature 계약 검증, Train-only 결측·희소범주·인코딩 | 이력형 Feature 누적·특수결측·분기 처리 |
model/ |
다섯 공통 모델의 학습·CV 튜닝 | XGBoost fold별 scale_pos_weight 처리, 실행 최적화 |
evaluation/ |
F1 등 공통 지표와 Permutation Importance | OOF 예측·SAMPID bootstrap 95% CI와 Global-vs-Local Δ 지표 |
config/ |
Feature·KECO·모델 설정 단일 원본 | 팀 합의가 있는 경우에만 갱신 |
requirements.txt |
첫 실행 시 설치할 패키지 | 팀의 실제 실행 환경 확인 후 버전 freeze |
원자료 zip은 Git에 넣지 않는다. 제공받은 YP2021_EXCEL_*.zip 경로를 그대로 전달한다.
python -m code.pipeline.run_pipeline \
--raw-zip "/경로/YP2021_EXCEL_0227.zip"이 명령은 다음 구조 산출물만 만든다.
원자료 → person_period.parquet → global/local_dataset.parquet → split_ids.csv
source adapter는 코드북으로 확인된 기준연도 미취업자 선정·Target·희망직업 이력을 구현한다. 구직·취업준비 변수는 표본 제한이 아닌 Feature로 남긴다. features.yaml의 42개 Feature 매핑은 2026-08-16 기준 전부 완료됐다(plan/details/12-Global-피처엔지니어링-요약.md 참고) — build_features(..., strict=True)가 이 매핑을 강제하므로, 없는 Feature를 0으로 채워 성능을 내는 상황 자체가 코드로 막혀 있다.
모든 Feature mapping을 마친 지금은 아래처럼 모델을 실행할 수 있다.
python -m code.pipeline.run_pipeline \
--raw-zip "/경로/YP2021_EXCEL_0227.zip" \
--run-modeling --model logistic_regression--tune은 Train 내부 StratifiedGroupKFold만 이용해 공통 탐색 범위를 실행한다. 계산량 때문에 Randomized Search가 필요하면 팀 공통 결정을 먼저 반영한다.
공통 모듈은 다섯 모델을 지원하지만, Global과 Local의 공식 비교에는 model_config.yaml의 official_comparison_models에 등록된 Logistic Regression과 XGBoost만 사용한다. Global의 실제 실행 순서는 14번 단계별 실행 흐름을 따르며, 사람은 단계 사이의 선택을 기록한다.
Stage 0 데이터·split 확인은 ../notebooks/global/00_modeling_check.ipynb에서 한다. 이 Notebook은 저장된 42개 Feature Global Dataset을 읽어 표본·SAMPID 중복·Target·baseline_year·결측률만 확인하며 모델을 학습하거나 결과를 해석하지 않는다.
Stage 1은 ../notebooks/global/01_first_model.ipynb에서 한다. 이 Notebook은 baseline_42features의 고정 Train만 읽어 Logistic Regression·XGBoost의 5-fold F1, OOF 지표와 그래프를 만들고 OOF 확률을 저장한다. 고정 Test Dataset·n_prior_periods·sample_weight는 사용하지 않는다.
Stage 2는 ../notebooks/global/02_feature_selection.ipynb에서 한다. Stage 1이 저장한 최적 파라미터를 재사용해 GridSearch를 다시 수행하지 않고, Global Train 내부에서 CV Permutation Importance·계수/gain 보조 자료·수치형 상관관계·VIF를 계산한다. 이 단계는 Feature 삭제·추천·최종 목록 생성이나 Test Dataset 사용을 하지 않는다.
Stage 3는 ../notebooks/global/03_second_model.ipynb에서 한다. 사람이 확정한 features.yaml의 global_stage2_selected_25만 선택한 뒤, 기존의 공통 Global CV 함수로 LR/XGBoost를 처음부터 다시 튜닝한다. Stage 1의 최적 파라미터는 재사용하지 않으며, 저장된 Stage 1 결과와 Train 내부 CV·OOF 수치만 비교한다.
Stage 3.5는 ../notebooks/global/03_5_final_tuning.ipynb에서 한다. stage_3/selected_features.csv의 사람이 확정한 25개를 그대로 사용하고, model_config.yaml의 final_hyperparameter_refinement에 정한 LR 28개 및 XGBoost A→B→C 제한 Grid만 한 번 탐색한다. Test를 읽지 않으며, refined Train OOF의 threshold 0.20~0.80 민감도는 선택 정보로만 저장하고 자동 채택하지 않는다.
AGENTS.md대원칙에 따른 기록. 분석 기준은 사용자가 제공한 프로토콜에서 가져왔으며, 구현 상태 설명은 AI가 작성했다.
| 구간 | 내용을 정한 주체 | 사람 검토 |
|---|---|---|
| 구조·실행 안내 | AI가 공통 코드 뼈대를 설명 | ⬜ 미검토 |
| Person-Period·분할·전처리·평가 기준 | 사용자 제공 YP2021 공통 전처리·모델링 프로토콜 v1.3 | ✅ 2026-08-14 검토 완료 |
| Global·Local 공식 LR/XGBoost 비교 대상과 Global 단계별 실행 순서 | 사람(Kim ByungKyu)이 직접 지시한 2026-08-20 모델링 흐름 | ✅ 2026-08-20 Kim ByungKyu |
| Stage 1 42개 Feature Train 내부 비교·OOF 보관 조건 | 사람(Kim ByungKyu)이 직접 지시한 2026-08-20 1차 모델링 조건 | ✅ 2026-08-20 Kim ByungKyu |
| Stage 2 Train 내부 Feature 분석·사람의 Feature 선택 경계 | 사람(Kim ByungKyu)이 직접 지시한 2026-08-20 요청 | ✅ 2026-08-20 Kim ByungKyu |
| Stage 3 선택 25개 Feature·재튜닝·1차/2차 비교 조건 | 사람(Kim ByungKyu)이 직접 지시한 2026-08-21 요청 | ✅ 2026-08-21 Kim ByungKyu |
| Stage 3.5 제한 refinement·OOF threshold 민감도·Test 미사용 경계 | 사람(Kim ByungKyu)이 직접 지시한 2026-08-21 요청 | ✅ 2026-08-21 Kim ByungKyu |
| OOF·bootstrap·저장 Dataset/split 점검·Stage 0 Notebook | 사용자 제공 모델링 준비 요구사항을 AI가 구현 | ⬜ 미검토 |
- 세션 로그:
작업기록/hanliyagi/20260814-yp2021-공통-파이프라인-뼈대.md