검증 지표는 완벽한데 실전에선 무너지는 모델, 정확도 99%인데 아무도 안 기뻐하는 회의실 — 금융 데이터 사이언스에서 흔한 이 장면들이 왜 생기는지 7가지 규칙으로 풀었습니다.
금융 데이터 사이언스, 왜 ML 잘하는 사람도 신용 심사에선 한 번씩 넘어질까요?
일반적인 머신러닝 파이프라인은 익숙하게 다루는 분들이 많아요. 피처 만들고, 모델 돌리고, AUC 0.001 더 짜내고. 그런데 그 실력 그대로 신용 심사 현장에 들어오면 이상한 일이 벌어집니다. 검증 셋에서는 멀쩡하던 모델이 배포하면 성능을 못 내고, 정확도 99%를 자랑했더니 회의실 분위기가 싸늘하고, 성능을 더 끌어올렸더니 리스크 부서가 배포를 막아버려요.
최근 한 신용 심사 데이터 사이언티스트가 정리한 글이 업계에서 화제였는데요. 제조업 엔지니어로 일하다 금융권으로 넘어온 분이 “책대로 했는데 왜 자꾸 틀릴까” 싶었던 지점들을 7가지로 묶었더라고요. 저도 금융 쪽 데이터를 만지면서 비슷하게 헤맸던 터라 공감하며 읽었고, 원문을 짚어가며 금융 데이터 사이언스가 일반 ML과 어디서 갈라지는지 제 해석을 더해 정리했습니다.
⚡ 이 글의 핵심만 먼저 보기 (Key Takeaways)
- 선택편향이 디폴트: 승인 고객 결과만 보이고 거절 고객 결과는 영원히 미관측 — 학습 데이터와 판단 대상이 다른 모집단입니다.
- 무작위 K-fold는 컨닝: 시간이 한 방향으로 흐르므로 금융 기본 검증은 OOT(out-of-time), 즉 학습보다 나중 기간으로 평가합니다.
- 순위가 아니라 절대 확률: “부도 확률 정확히 3.2%” 같은 보정된 PD가 있어야 가격·충당금·기대손실 계산이 됩니다.
- 비용이 수십 배 비대칭: 우량 고객 마진은 수천 엔, 부도 한 건은 LGD×EAD로 수십만 엔 — 정확도가 아니라 기대손익을 최적화합니다.
- 안정성이 한계 성능을 이긴다: GBM 시대에도 로지스틱 회귀가 표준으로 남은 이유는 단조성·재현성 때문입니다.
- 해석가능성은 의무: “왜 거절했는지” 설명 못 하면 불법이거나 배포 불가 — 블랙박스 자체가 리스크입니다.
- 당장 해볼 액션: 다음 검증부터 K-fold를 OOT로 바꿔보세요. 실전 성능 갭이 바로 드러납니다.
📌 목차
- 선택편향이 디폴트값인 세계
- 시간은 한 방향으로 흐르고 모델은 노화한다
- 순위가 아니라 “정확히 몇 %”가 필요하다
- 비용은 비대칭이고, 늦게 오고, 금액 단위다
- 안정성·해석가능성·규제: 성능보다 무거운 3가지
- 이런 분들께 적극 추천합니다
- 자주 묻는 질문 (FAQ)
1. 선택편향이 디폴트값인 세계
일반 ML은 보통 “데이터가 모집단을 대표한다”고 가정하고 출발해요. 그런데 신용 심사에서는 이 가정이 처음부터 깨져 있습니다. 우리가 가진 학습 데이터에는 큰 구멍이 하나 있거든요. 승인한 고객의 상환 결과만 보인다는 점이에요.
거절한 고객이 실제로 갚았을지 부도났을지는 영원히 알 수가 없습니다. 그분들에겐 애초에 카드가 발급되지 않았으니까요. 정작 모델이 판단해야 할 대상은 아직 승인되지 않은 신청자 전체인데, 학습한 건 이미 승인된 고객뿐이라 둘은 서로 다른 모집단이 됩니다.
신청자 전체
├─ 승인 (결과 관측됨)
│ ├─ 상환 → 정상 상환
│ └─ 부도 → 연체·부도
└─ 거절 (결과 관측 안 됨) → ??? 갚았을지 부도났을지 모름
① Reject Inference — 거절추론이 기본기가 되는 이유
거절했던 고객의 거절 후 데이터가 없으니, 모델은 자기가 거절한 영역을 영영 배우지 못해요. 그 결과 과거 심사 정책의 편향을 그대로 물려받습니다. 그래서 이 분야에서는 reject inference(거절추론)와 인과추론이 특별한 기법이 아니라 기본값이 됩니다. 일반 ML에선 어쩌다 쓰는 고급 기법이 여기선 안 쓰면 안 되는 출발점인 거죠.
💡 실제 활용 시나리오 예시:
한 카드사가 승인 고객 데이터만으로 만든 스코어카드를 신규 상품에 적용했더니, 컷오프 근처 신청자들의 실제 부도율이 예측치의 1.5배로 튀었어요. 거절 영역을 학습하지 못한 모델이 “안전하다”고 본 구간이 사실은 사각지대였던 거죠. reject inference로 거절 고객의 추정 라벨을 보강한 뒤에야 컷오프가 제자리를 찾았습니다.
2. 시간은 한 방향으로 흐르고 모델은 노화한다
데이터를 무작위로 섞어서 K-fold를 돌렸다면, 사실 미래를 살짝 컨닝한 셈이에요. 검증 셋에 과거와 미래 데이터가 뒤섞이니까요. 신용 데이터는 시간을 따라 흐릅니다. 2024년 가입자 데이터로 학습한 모델이 2026년 고객을 평가하는 구조예요.
그사이 경기도 바뀌고 금리도 오르고 고객 행동과 상품도 달라집니다. 분포가 이동(drift)하는 거죠. 무작위 K-fold는 실전에선 절대 누릴 수 없는 “미래 정보”를 검증에 슬쩍 끼워 넣어서, 지표를 실제보다 좋게 보이게 만들어요.
① OOT(Out-of-Time) — 학습보다 나중 기간으로 평가하기
그래서 금융의 기본 검증은 OOT(out-of-time)입니다. 학습 기간 이후의 데이터로만 평가해서, 실전에서 겪을 시간 갭을 검증 단계에서 미리 재현하는 방식이에요. 배포 후에는 분포가 얼마나 움직였는지, 고객이 시간에 따라 어떻게 변하는지 계속 모니터링해야 합니다. 모델은 배포하는 순간부터 노화가 시작됩니다.
💡 실제 활용 시나리오 예시:
K-fold AUC 0.82로 자신만만하게 배포한 모델이 3개월 만에 실측 0.74로 떨어진 사례가 있어요. 원인을 보니 학습·검증에 같은 시기 데이터가 섞여 있었고, 정작 배포 후엔 금리 인상기 신규 고객층이라 분포가 달랐던 거죠. OOT 검증으로 다시 재면 처음부터 0.75 언저리가 나왔을 테고, 기대치 거품을 미리 걷어낼 수 있었습니다.
3. 순위가 아니라 “정확히 몇 %”가 필요하다
일반 분류 문제는 보통 순위만 맞으면 됩니다. 누가 더 위험한지 줄만 잘 세우면 되고, AUC가 그 능력을 측정하죠. 그런데 신용은 거기서 멈출 수 없어요. 절대 확률, 즉 보정된 PD(calibrated PD)가 필요합니다.
① 판별력(Discrimination)과 보정(Calibration)은 다른 축
“이 고객의 부도 확률은 정확히 3.2%”라는 숫자가 있어야 가격을 매기고(risk-based pricing), 충당금을 쌓고(provisioning), 기대손실을 계산할 수 있어요. 순위만으로는 이 중 아무것도 못 합니다. 그래서 신용에서는 AUC는 훌륭한데 PD는 틀린 모델이 은근히 흔해요. 판별력과 보정은 별개의 축이라, 둘 다 챙겨야 합니다.
💡 실제 활용 시나리오 예시:
충당금 산정에 쓰는 모델이 AUC 0.80으로 멀쩡해 보였는데, 예측 부도율 평균은 2%인데 실제는 3.5%가 나왔어요. 순위는 잘 매겼지만 절대 수준이 어긋난 거죠. 이 0.5%p 차이가 수십억 단위 충당금 부족으로 이어져서, 감독 보고 직전에 캘리브레이션 재보정을 부랴부랴 돌린 적이 있었습니다.
4. 비용은 비대칭이고, 늦게 오고, 금액 단위다
정확도(accuracy)는 모든 오류를 똑같이 셉니다. 그런데 신용에서 오류의 무게는 전혀 같지 않아요. 우량 고객 한 명을 승인해서 버는 돈은 마진(수천 엔), 부도 한 건의 비용은 LGD × EAD(수십만 엔)입니다. 한쪽이 수십 배 무거워요. 그러니 우리가 최적화할 건 정확도가 아니라 기대수익과 기대손실입니다.
| 요소 | 의미 |
|---|---|
| PD | 부도 확률 (Probability of Default) |
| LGD | 부도 시 손실률 (Loss Given Default) |
| EAD | 부도 시 잔액 (Exposure at Default) |
① 기대손실(EL) = PD × LGD × EAD
기대수익은 (1 − PD) × 마진 − PD × LGD × EAD로 잡고, 부도 시 기대손실(EL)은 PD × LGD × EAD 세 요소의 곱으로 분해됩니다. 세 요소가 각각 다른 모델링 문제라, 스코어링의 핵심은 그중 PD예요. 게다가 정답이 한참 뒤에 옵니다. 오늘 승인한 고객의 부도 여부는 12~24개월 뒤에야 확정돼요. 빠른 피드백에 익숙한 ML 사고방식과 꽤 부딪히는 지점이죠.
💡 실제 활용 시나리오 예시:
정확도 기준으로 컷오프를 올렸더니 거절률이 늘면서 오분류 “건수”는 줄었는데, 정작 걸러낸 게 마진 좋은 우량 고객이라 분기 수익이 빠졌어요. 기대수익 식으로 다시 보니 “부도 1건 막기”보다 “우량 고객 20명 승인”이 이득인 구간이었던 거죠. 건수가 아니라 금액으로 최적화하니 컷오프가 정반대로 움직였습니다.
5. 안정성·해석가능성·규제: 성능보다 무거운 3가지
나머지 세 가지 차이는 결이 비슷해서 묶어서 볼게요. 한마디로 현업 신용 모델에선 한계 성능보다 운영의 무게가 더 크다는 이야기입니다. 데이터 분석 자체를 더 깊게 파고 싶다면 데이터 사이언티스트를 위한 분석 실전 가이드도 함께 보면 결이 이어집니다.
1) Stability — 안정성이 한계 성능을 이긴다
Kaggle 같은 대회라면 AUC를 0.001이라도 더 짜내는 게 미덕이에요. 그런데 현업에선 그게 손해일 때가 많습니다. 성능을 한 방울 더 얻으려다 불안정해진 모델, 그러니까 입력이 조금만 흔들려도 점수가 출렁이거나 소득이 높을수록 점수가 낮아지는 이상 구간이 생기는 모델은 운영에서 곧 비용이 돼요. 재현성과 단조성(monotonicity)이 소수점 성능보다 중요합니다. GBM 시대에도 로지스틱 회귀가 스코어링 표준으로 살아남은 이유가 바로 이거예요.
2) Explainability — 해석가능성은 선택이 아니라 의무
“왜 이 점수인가”를 설명할 수 없으면 불법이거나 배포 불가입니다. 거절 사유 통지(adverse action), 감독당국 설명, 내부 거버넌스가 모두 설명을 요구해요. 블랙박스는 그 자체로 리스크입니다. 그래서 현업은 WOE나 스코어카드처럼 사유가 자연스럽게 도출되는 구조를 선호하거나, 부스팅 모델을 쓰더라도 SHAP으로 설명가능성을 반드시 확보합니다.
3) Governance — 규제·거버넌스 오버헤드
모델 개발이 끝나도 배포까지 길어요. 모델 리스크 관리(MRM), 개발자와 검증자를 분리하는 독립 검증, 상세 문서화, 감사 추적, 그리고 Shadow mode로 상당 기간 병행 관찰한 뒤에야 실제 의사결정에 투입됩니다. 일본의 경우 할부판매법의 지불가능산정액 산정이 모델과 직결돼서 “모델이 곧 법적 근거”가 되기도 해요. 빠른 배포보다 안정성이 우선되는 구조죠.
💡 실제 활용 시나리오 예시:
AUC를 0.01 끌어올린 신모델을 배포 직전 리스크 부서가 막은 적이 있어요. 이유는 단조성 위반 — 특정 소득 구간에서 점수가 거꾸로 가는 게 발견됐거든요. 결국 SHAP으로 사유를 분해하고 Shadow mode로 3개월 병행 관찰한 뒤에야 통과됐습니다. “성능 0.01″이 “검증 3개월”로 돌아온 거죠.
6. 이런 분들께 적극 추천합니다
- 일반 ML은 익숙한데 금융·신용 도메인으로 막 넘어온 데이터 사이언티스트
- 신용 스코어링·부도 예측 모델을 만들고 검증하는 리스크 모델러
- 핀테크·캐피탈·카드사에서 심사 자동화를 설계하는 기획·개발자
- AUC는 좋은데 실전 성능이 안 나오는 원인을 찾고 있는 분
- 캘리브레이션, reject inference, OOT 검증 개념을 실무 맥락에서 잡고 싶은 분
- “AI가 다 해주지 않나”라는 질문에 답을 준비해야 하는 데이터 리더
7. 자주 묻는 질문 (FAQ)
Q. 이건 결국 생성형 AI가 다 해결해주지 않나요?
A. 오히려 반대예요. 생성형 AI는 코드와 분석 속도는 높여주지만, 반사실(counterfactual)·시간 순서·비대칭 비용·설명 의무·규제 같은 구조적 문제는 풀어주지 못합니다. 이런 환경일수록 “무엇을 어떻게 검증하고 감리할지” 판단력이 더 귀해져요. 무게중심이 모델 개발에서 문제 설정·검증으로 옮겨가는 거죠.
Q. K-fold를 아예 쓰면 안 되나요?
A. 금지는 아니지만, 시간 의존성이 있는 신용 데이터에선 무작위 분할이 검증을 과대평가하게 만듭니다. 기본은 OOT로 두고, 보조적으로 시간 순서를 지키는 분할(time-based split)을 쓰는 걸 권합니다. 적어도 “미래가 검증 셋에 새지 않게” 하는 게 핵심이에요.
Q. 부스팅 모델은 해석가능성 때문에 못 쓰는 건가요?
A. 못 쓰는 건 아니에요. 다만 그냥 배포는 어렵고, SHAP 같은 설명 도구로 사유를 분해하고 단조성 제약을 걸어 안정성을 확보하는 절차가 따라붙습니다. 설명 의무를 충족할 수 있다면 부스팅도 충분히 현업에서 씁니다.
✍️ 글을 마치며
금융 데이터 사이언스의 핵심을 원문 저자는 이렇게 정의해요. “관측되지 않는 반사실을, 시간이 흐르고 비용이 비대칭인 환경에서, 설명 가능하고 안정적으로 추정하는 일.” 7가지 차이가 결국 이 한 문장으로 수렴합니다. ML을 금융 데이터에 적용하는 게 아니라, 규칙 자체가 다른 분야인 거죠.
저는 당장 다음 검증부터 K-fold를 OOT로 바꿔보는 것을 가장 먼저 해볼 것 같아요. 가장 적은 노력으로 “검증 지표는 좋은데 실전은 왜 다를까”의 갭을 눈으로 확인할 수 있는 방법이거든요.
여러분은 어떤 부분이 가장 인상적이셨나요? 댓글로 자유롭게 의견 남겨주세요! 😊