없는 불량 17,272개를 지어냈다 — SMOTE와 리샘플링의 대가
"재현율이 6배가 됐습니다"라는 보고 뒤에는 헛경보 269건과, 조용히 부서진 확률이 있습니다. 불균형 데이터에서 리샘플링이 실제로 하는 일을 숫자로 따라가 봅니다.
출발점 — 재현율 0.091
CNC 정밀가공 라인의 최종검사 데이터가 있습니다. 학습 데이터에는 불량이 364개, 정상이 17,636개 — 불량률 2.02%의 전형적인 불균형 데이터입니다. 테스트 데이터 6,000행에는 불량이 121개 들어 있습니다. 랜덤포레스트를 그대로 학습시키면 성적표는 이렇습니다 — 정확도 0.9798, 재현율 0.091(불량 121개 중 11개 적발, 110개 놓침), 정밀도 0.500.
재현율 9%는 분명 곤란한 숫자입니다. 그리고 이 지점에서 거의 모든 튜토리얼이 같은 처방을 내립니다. "데이터가 불균형해서 그렇습니다. 비율을 맞추세요." 소수 클래스를 늘리거나(SMOTE), 다수 클래스를 버리거나(언더샘플링), 가중치를 주는(class_weight) 방법들입니다. 정말 그럴까요? 처방을 하나씩 써보고, 청구서까지 확인해 보겠습니다.
비교의 기준으로 PR-AUC를 함께 보겠습니다. 임계값과 무관하게 "모델이 불량을 얼마나 잘 줄 세우는가"를 재는 지표로, 기본 모델의 PR-AUC는 0.291입니다. 이 숫자를 기억해 두세요.
SMOTE — 없는 불량 17,272개를 지어내다
SMOTE(Synthetic Minority Over-sampling Technique)는 불균형 데이터의 대명사입니다. 동작은 단순합니다 — 불량 샘플 하나를 고르고, 가까운 불량 이웃 하나를 고른 뒤, 두 점을 잇는 직선 위의 무작위 지점에 새 불량을 찍습니다. 이렇게 학습 데이터의 불량 364개를 17,636개로 불립니다. 존재한 적 없는 불량 17,272개를 지어낸 것입니다.
결과는 화려합니다. 재현율 0.091 → 0.545. 여섯 배입니다. 121개 중 66개를 잡습니다. 블로그와 논문이 자랑하는 바로 그 숫자이고, 여기서 멈추면 해피엔딩입니다.
그런데 청구서가 있습니다. 헛경보 269건. 정밀도는 0.500에서 0.197로 떨어졌습니다. 6,000개 부품 중 335개에 경보가 울리고 그중 269개가 헛수고 — 검사원은 다섯 번 중 네 번을 헛걸음합니다. 두 번만 그러면 아무도 그 경보를 안 믿습니다. 그리고 결정적으로 PR-AUC는 0.291 → 0.222, 모든 처방 중 꼴찌로 떨어졌습니다. 반면 ROC-AUC는 0.905로 가장 높아서, ROC만 보고 보고서를 썼다면 "SMOTE가 최선"이라는 정반대 결론이 나왔을 것입니다.
이유는 SMOTE의 전제에 있습니다. 두 점을 직선으로 잇는다는 것은 "두 불량 사이는 전부 불량이다"라는 가정입니다. 그런데 실제 불량은 공구마모와 진동이 동시에 임계를 넘을 때 나타나는 비선형 구조입니다. 비선형 경계 위에서 직선을 그으면 그 직선은 정상 영역을 가로지르고, SMOTE는 거기에 "불량" 딱지를 붙여 심습니다. 더 근본적으로는 — SMOTE는 새로운 정보를 만들지 못합니다. 기존 364개의 좌표를 보간할 뿐입니다. 모델은 "불량을 17,636개나 봤다"고 착각하며 근거 없이 자신만만해집니다. 그 자신감의 대가는 뒤에서 확인합니다.
언더샘플링 — 재현율 0.843, 그리고 헛경보 602건
반대 방향의 처방도 있습니다. 언더샘플링은 정상 17,636개 중 17,272개를 버리고 364개만 남겨 1:1을 만듭니다. 결과: 재현율 0.843 — 121개 중 102개 적발, 기본 모델의 아홉 배입니다. 개선판인 BalancedRandomForest(나무마다 다른 정상 표본을 뽑는 방식)도 재현율 0.818로 99개를 잡습니다.
이번 청구서는 더 무겁습니다. 헛경보가 602건(BalancedRF는 491건). 기본 모델의 11건에서 55배가 됐고, 정밀도는 0.145까지 떨어졌습니다. 돈과 시간을 들여 모은 데이터 17,272개를 "비율이 마음에 안 들어서" 버린 대가입니다.
왜 재현율이 오르는지 잎사귀를 열어보면 이해가 됩니다. 학습 데이터가 1:1이니 아무것도 모르는 잎사귀조차 "불량 확률 50%"라고 말합니다. 확률 전체가 위로 밀려 올라가 0.5 임계값을 넘는 부품이 쏟아진 것뿐입니다. class_weight도, SMOTE도, 언더샘플링도 방법만 다를 뿐 하는 일은 같습니다 — 확률의 눈금을 위로 미는 것. 그리고 임계값과 무관한 줄 세우기 실력, PR-AUC로 다섯 모델을 정렬하면 아무것도 안 한 기본 모델이 0.291로 1위입니다. BalancedRF 0.268, class_weight 0.266, 언더샘플링 0.264, SMOTE 0.222 — 네 처방 모두 원본을 넘지 못했습니다.
반전 — 임계값 하나, 그리고 부서진 확률
여기까지의 비교에는 사실 반칙이 하나 있습니다. 다섯 모델을 전부 임계값 0.5로 비교했다는 것입니다. 0.5는 아무 근거 없는 기본값이고, 확률이 위로 밀린 리샘플링 모델들에게만 유리한 눈금입니다. 그래서 각 모델에게 검증셋에서 찾은 각자의 최적 임계값을 주고 다시 재보면 — 순위가 뒤집힙니다. 기본 모델의 최적 임계값은 0.5가 아니라 0.247이었고, 그 숫자 하나를 고치자 F1이 0.154(꼴찌)에서 0.361(1등)로 올라갑니다. SMOTE는 튜닝 후에도 0.292로 꼴찌입니다 — 지어낸 데이터가 남긴 손상은 임계값으로 복구되지 않습니다. 같은 재현율 0.273에 맞춰 비교해도 원본의 정밀도가 0.440, SMOTE는 0.295로, 같은 불량을 잡는 데 SMOTE는 경보를 훨씬 더 많이 냅니다.
더 조용한 대가는 확률입니다. 테스트셋의 실제 불량률은 0.0202입니다. 잘 만들어진 모델이라면 예측확률의 평균도 그 근처여야 합니다. 기본 모델의 평균 예측확률은 0.0198 — 실제의 1.0배, 놀랄 만큼 정직합니다. SMOTE는 0.0812(4.0배), 언더샘플링은 0.1977(9.8배)입니다. 언더샘플링 모델은 이 라인의 불량률이 20%라고 믿고 있는 것입니다. 불량 하나 놓칠 때 5만원의 손실이 난다고 하고 "이번 달 예상 손실"을 물으면, 기본 모델은 약 595만원(실제 605만원)이라 답하지만 언더샘플링 모델은 5,932만원을 부릅니다. 이 모델을 근거로 예산을 잡으면 10배를 태웁니다. 모델이 거짓말쟁이가 된 게 아니라, 정상이 절반인 가짜 세상을 보여주고 학습시킨 우리가 모델을 속인 것입니다. 리샘플링은 재현율을 주고 확률을 가져갑니다 — 그런데 재현율은 임계값만 옮겨도 공짜로 얻을 수 있었습니다.
진짜 병은 비율이 아니라 개수였다
그렇다면 질문을 근본으로 되돌립니다. 불균형은 정말 병이었을까요? 변수를 하나씩만 움직이는 두 실험으로 확인할 수 있습니다.
- 실험 A — 불량 개수만 줄이기. 정상 17,636개는 그대로 두고 불량을 364 → 40개로. 불량률은 2.02% → 0.23%로 불균형이 훨씬 심해집니다. 결과: PR-AUC 0.291 → 0.235. 단, 불량 250개까지는 성능이 유지됩니다(0.295) — 이 문제를 배우기에 250개면 이미 충분했다는 뜻입니다.
- 실험 B — 정상 개수만 줄이기. 불량 364개는 그대로 두고 정상을 17,636 → 364개로. 불량률이 50%가 되어 불균형이 완전히 사라집니다. 결과: PR-AUC 0.291 → 0.232, 예외 없이 한 방향으로 단조 감소합니다.
리샘플링 교리가 맞다면 A는 나빠지고 B는 좋아져야 합니다. 그런데 둘 다 나빠졌고, 불균형을 완전히 없앤 쪽이 오히려 가장 나쁩니다. 실험 B의 마지막 줄은 언더샘플링이 하는 일과 정확히 같습니다 — "처방"이라 불렀던 조작을 여기서는 "손상"으로 측정한 셈입니다. 문제는 불량의 비율이 2%라서가 아니라, 2%를 곱한 결과 불량의 절대 개수가 몇백 개밖에 안 남아서였습니다. 불량이 수천 개라면 불균형은 무시하고 임계값만 조정하면 되고, 불량이 수십 개뿐이라면 SMOTE가 아니라 불량 사례를 더 모으는 것이 답입니다. 지어낸 데이터는 없는 지식을 만들어주지 않습니다.
정리하면 불균형 데이터의 레시피는 이 순서입니다. ① 지표부터 바꾼다 — 정확도를 버리고 PR-AUC를 본다. ② 모델은 원본 분포로, 리샘플링 없이 학습한다. ③ 임계값을 검증셋에서 고른다. ④ 확률이 필요하면 보정한다(원본으로 학습했다면 대개 이미 맞습니다). ⑤ 그래도 부족하면 — 소수 사례를 더 모은다. 지어내지 말고.
이 글은 DataForge 교육 과정 원고에서 발췌·각색했습니다. 아래 시뮬레이터에서 임계값을 직접 움직여 보면, 리샘플링 없이도 재현율과 정밀도가 어떻게 거래되는지 눈으로 확인할 수 있습니다.
📊 평가지표 시뮬레이터에서 직접 확인하기 →