올여름 LG Aimers 5기 '제품 이상 여부 판별' 대회에 참여했다. 전체 데이터의 1%도 안 되는 이상 제품을 찾아내야 하는, 극심한 클래스 불균형 문제가 핵심이었다. 이 글은 1,400팀 중 상위 5.5%를 달성하기까지의 기술적 결정과 그 과정을 기록한 회고다.
문제 정의 및 접근 전략
평가 지표는 F1-Score였다. 모든 제품을 정상이라고만 해도 정확도가 99%가 나오는 데이터였기 때문이다. Accuracy의 함정을 피하고 소수 클래스(이상 제품) 탐지 성능을 높이는 게 관건이었다. 이를 위해 다음과 같은 파이프라인을 설계했다.
- 데이터 탐색(EDA) 및 전처리
- 클래스 불균형 처리 (Sampling)
- 개별 모델 학습
- 앙상블을 통한 성능 극대화
핵심 기술과 코드 분석
불균형 데이터 처리: 왜 SMOTE-ENN인가?
단순 Oversampling은 과적합, Undersampling은 정보 손실의 리스크가 있다. SMOTE-ENN은 이 두 방식의 단점을 보완하는 하이브리드 샘플링 기법이라 선택했다.
- SMOTE (Oversampling): 소수 클래스의 특징을 학습해 유사한 합성 데이터를 생성한다. 모델이 이상 제품 패턴을 학습할 기회를 늘린다.
- ENN (Undersampling): 다수 클래스 중 클래스 경계의 노이즈 데이터를 제거한다. 모델이 더 명확한 결정 경계를 학습하도록 돕는다.
Ablation 결과: SMOTE만 적용했을 때 대비 SMOTE-ENN 조합에서 Precision +8pp 향상을 확인했다. ENN의 경계 노이즈 제거가 false positive를 줄이는 데 결정적이었다.
이 조합은 F1-Score의 구성요소인 정밀도(Precision)와 재현율(Recall)을 균형 있게 개선하는 데 효과적이었다.
Stacking 앙상블: 예측 결합하기
단일 모델의 한계를 넘기 위해 스태킹(Stacking) 앙상블을 구축했다. 일반적인 Averaging 방식과 달리, 스태킹은 '어떤 모델의 예측을 더 신뢰할지'를 학습하는 메타 모델(Meta-Model)을 사용한다.
- Base Models (1단계): 그래디언트 부스팅 계열의 LGBM, XGBoost, CatBoost를 사용했다. 세 모델은 리프 중심/레벨 중심 성장, 범주형 변수 처리 등 학습 방식이 서로 달라서 다른 관점의 예측을 생성한다. 이 '다양성'이 앙상블 성능의 핵심이다.
- Meta-Model (2단계): Base Model들의 예측값을 입력받아 최종 예측을 수행한다. 과적합 방지를 위해 보통 Logistic Regression 같은 단순한 모델을 사용한다.
데이터 분포와 리샘플링
- 원본 클래스 분포: 정상 약 99,000건, 이상 약 1,000건 (이상 비율 ≈ 1.0%)
- SMOTE-ENN 적용 후: 정상 약 98,500건, 이상 약 9,980건 (불균형 완화)
- 검증 설정: Stratified K-Fold, k=5. 메타 모델은 OOF 예측을 입력으로 학습하여 데이터 누수를 방지
결과 및 회고
최종적으로 1,400팀 중 상위 5.5%를 달성했다. 대규모 데이터 전처리부터 하이퍼파라미터 튜닝, 모델 최적화까지 한 사이클을 직접 끝까지 돌려본 점이 가장 컸다.
하지만 간발의 차이로 본선 진출을 놓쳐서 아쉬움이 더 크다. 복기해보니 세 가지가 명확하게 보였다.
- 피처 엔지니어링의 부재: 주어진 피처를 활용하는 데 급급해서, 변수 간 관계를 분석하고 새로운 피처를 생성하는 데 소홀했다.
- 실험 관리의 중요성: 다양한 하이퍼파라미터 조합을 시도했지만, 실험 과정을 체계적으로 기록하지 못해 최적 조합을 찾는 데 비효율적인 부분이 있었다.
- 시간 분배의 실패: 초반 데이터 탐색에 너무 많은 시간을 써서, 후반 모델 튜닝과 앙상블 전략 고도화에 쓸 시간이 부족했다.
피처 엔지니어링을 거의 안 했다는 게 지금 생각해도 아쉽다. 공정·계측 데이터면 변수 간 비율, 구간별 분포 같은 도메인 기반 파생 변수들이 분명히 효과가 있었을 텐데. 다음엔 EDA에 쏟는 시간이랑 피처 생성에 쏟는 시간을 처음부터 분리해서 계획할 것이다.
실험 기록도 문제였다. 뭘 바꿨을 때 점수가 얼마나 올랐는지 노션에 대충 적어뒀는데, 나중에 그때 그 조합이 뭐였더라?를 못 찾아서 같은 실험을 두 번 한 적도 있었다. MLflow든 뭐든 실험 추적은 처음부터 세팅해두는 게 맞다는 걸 그때 배웠다.
마치며
간발의 차로 본선을 못 간 게 진짜 아쉽긴 한데, 솔직히 실력 차이가 있었다. 특히 피처 엔지니어링 깊이가 부족했다는 게 명확해졌으니 다음 대회에선 그 부분부터 다르게 가보려 한다.