FDS 모델을 학습하기 전에 한 컬럼의 고유값부터 세어봤다.

AI-Hub 71925 데이터셋의 전자금융공동망 구간에는 4,434,106건의 거래가 있었지만, 거래금액48개 값만 사용하고 있었다. 그중 100만 원 이하 구간은 4,388,368건, 전체의 98.97%를 차지했고 이상거래 label은 한 건도 없었다.

low = df[df["거래금액"] <= 1_000_000]
 
len(low) / len(df)          # 0.9897
low["이상거래여부"].sum()   # 0
df["거래금액"].nunique()    # 48

제공된 train/validation split에서 거래금액 하나로 계산한 ROC-AUC는 0.9969였다. 고객의 과거 행동이나 거래 순서, 계좌의 변화를 배우지 않아도 높은 점수를 만들 수 있는 구조였다. 모델이 해야 할 일은 48개 금액에 담긴 template을 복원하는 것에 가까웠다.

이 결과를 본 뒤 질문을 바꿨다. 어떤 모델이 더 높은 점수를 내는지 비교하기 전에, 이 데이터가 더 나은 사기 탐지 모델과 더 나은 shortcut 탐지기를 구분할 수 있는지부터 확인해야 했다.

모델을 비교하기 전에 데이터부터 셌다

검증 대상은 AI-Hub의 금융거래 및 사용자 패턴 합성데이터에서 확보해 구성할 수 있었던 train과 validation 파일 6,386,977건이다. 데이터셋 페이지에 표시된 전체 label 데이터의 약 90%다.

구간검증 건수이상거래비율
전자금융공동망4,434,10617,1750.39%
카드1,952,87172,0083.69%

처음부터 복잡한 모델을 만들지 않았다. 고유값 수, 값과 구간별 positive rate, 두 class의 분포 겹침, 중복 행, 제공된 split의 유지 여부처럼 모델 없이도 확인할 수 있는 항목부터 봤다. 이런 검사는 모델 구조를 논하기 전에 label이 단순한 규칙으로 노출돼 있는지를 보여준다.

전자금융공동망의 거래금액에서는 같은 신호가 반복됐다.

  • 48개 금액 중 상위 10개가 전체 행의 98.05%를 차지했다.
  • 거래금액의 99.91%가 1,000원 단위였다.
  • 정상과 이상거래의 금액 분포가 겹치는 정도는 0.0065에 불과했다.
  • 거래금액=4,000,000 하나가 전체 이상거래의 30.05%를 포함했고, 이 값의 positive rate는 전체 평균의 88.13배였다.

금액이 반올림돼 있거나 이상거래와 상관관계를 갖는 것 자체는 실제 금융 데이터에서도 가능하다. 하지만 전체의 98.97%를 차지하는 구간에 이상거래가 전혀 없다는 조건까지 합쳐지면, 이 컬럼은 연속적인 행동 특성보다 label을 읽는 codebook에 가까워진다.

높은 점수는 데이터가 학습된다는 뜻일 뿐이었다

이 결과를 “실제 사기 탐지에서 거래금액은 쓸모없다”로 해석하면 안 된다. 거래금액은 현실의 이상거래를 찾을 때도 중요한 정보가 될 수 있다. 여기서 확인한 것은 더 좁다. 공개된 합성데이터에서는 소수의 금액 template만으로 label 대부분을 복원할 수 있다는 사실이다.

Benchmark 점수에는 보통 한 단계 더 큰 의미를 부여한다. 더 높은 점수를 낸 모델이 더 유용한 이상거래 규칙을 배웠다고 해석한다. 하지만 이 데이터에서는 점수가 높아진 이유가 합성 과정에서 반복된 template을 더 잘 복원했기 때문일 수 있다.

카드 구간에서도 보조 근거가 나왔지만 전자금융공동망만큼 결정적이지는 않았다. 거래금액 하나의 ROC-AUC는 0.9519였고, 가장 자주 등장한 승인금액 10개가 전체의 86.01%를 차지했다. Train에서 고른 통합승인금액 >= 318,000 규칙은 validation F1 0.7204를 기록했다. 몇몇 category 값도 label을 강하게 드러냈다.

조건 하나만 사용Positive rate전체 이상거래 중 포함 비율
일시불할부구분코드=B97.77%33.18%
승인거래코드=190.85%23.01%
가맹점누적매출금액_구간화=322.92%58.18%

마지막 조건 하나가 카드 이상거래의 절반 이상을 포함하고, positive rate는 전체 평균의 6.22배였다. 카드 데이터가 48개 금액 문제와 완전히 같다는 뜻은 아니다. 복잡한 모델의 점수를 해석하기 전에 single-feature baseline을 반드시 확인해야 한다는 증거다.

더 강한 baseline으로 다시 돌리자 내 주장 하나가 틀렸다

첫 audit harness에서는 외부 의존성 없이 실행할 수 있는 Naive Bayes를 no-ID 기준 모델로 사용했다. 거래금액만 쓴 모델이 이 기준에 지나치게 가까웠다. “단순 금액 규칙이 전체 모델에 맞먹는다”는 설명과 잘 맞는 결과였다.

하지만 기준 모델이 너무 약했다.

고정된 LightGBM baseline으로 sensitivity test를 다시 실행하자, 거래금액 모델과 전체 모델의 상대 성능 gate는 두 AI-Hub 구간에서 모두 FAIL에서 PASS로 바뀌었다.

구간LightGBM no-ID PR-AUC금액만 사용한 PR-AUC비율상대 성능 gate
카드0.99350.66400.6683PASS
전자금융공동망0.61610.46000.7466PASS

그래서 “금액 규칙이 강한 모델과 같은 성능을 낸다”는 주장을 최종 근거에서 뺐다. 더 강한 baseline이 반박한 문장을 계속 남겨두면 데이터 검증이 아니라 정해둔 결론을 옹호하는 일이 된다.

전자금융공동망의 핵심 판단은 이 비교에 의존하지 않았다. 48개 고유 금액, 98.97%의 zero-positive 구간, 금액 하나의 ROC-AUC 0.9969, 분포 overlap 0.0065, 단일 금액 shortcut은 모델을 선택하지 않아도 그대로 남았다. Baseline을 다시 검증하면서 사용할 수 있는 근거는 줄었지만, 그 과정을 통과한 결론은 더 분명해졌다.

배포된 평가 코드는 원래 split을 다시 섞었다

데이터와 함께 배포된 이상거래 탐지 모델의 source package도 확인했다. 카드와 전자금융공동망 스크립트 모두 제공된 train, validation, test 파일을 불러와 하나로 합친 뒤 전처리하고, random stratified split을 새로 만들었다.

df = pd.concat([train_df, valid_df, test_df], ignore_index=True)
 
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.1,
    random_state=42,
    stratify=y,
)

Category factorization도 새 split을 만들기 전 전체 데이터에 적용됐다. 이 평가 방식에서는 원래 split이 보존하려던 시간 변화나 보지 못한 entity에 대한 일반화를 측정할 수 없다. 같은 template과 entity가 random split 양쪽에 들어갈 수 있다.

전자금융공동망에서는 label을 제외한 feature가 완전히 같은 중복 행도 60,538건, 전체의 1.365%였다. 무작위로 다시 나누면 동일한 feature template이 train과 evaluation에 함께 배치될 가능성이 생기므로 이 중복은 더 중요해진다.

이 절차에서 높은 점수를 낸 모델은 공개된 행을 학습할 수 있다는 사실은 보여준다. 그 점수가 실제 환경에서 행동 기반 이상거래를 찾는 능력을 의미한다는 증거는 되지 않는다.

검증 규칙 자체가 너무 엄격한지도 확인했다

어떤 FDS 데이터든 전부 실패시키는 protocol은 쓸모가 없다. AI-Hub 결과를 본 뒤 그 데이터에만 맞춰 기준을 고르는 대신, 같은 고정 검사를 기존 공개 데이터셋 두 개와 synthetic control 하나에도 적용했다.

데이터셋판정금액만 사용한 ROC-AUC고유 금액 수상위 10개 금액 비율
K-Claims-Synth v0.2PASS0.538799,2270.11%
ULB Credit Card FraudWARN0.719632,76716.29%
BAF BaseWARN0.5939994,9710.00%
AI-Hub 카드FAIL0.95191,93186.01%
AI-Hub 전자금융공동망FAIL0.99694898.05%

ULB와 BAF는 넓은 single-feature subgroup 때문에 WARN을 받았지만, 금액 template의 집중도나 분포 겹침에서는 FAIL하지 않았다. 같은 규칙이 PASS, WARN, FAIL을 구분했고, AI-Hub 전자금융공동망의 48개 금액 구조는 비교 데이터에서도 뚜렷한 이상치로 남았다.

모델 성능이 아니라 데이터 사용 범위를 결정했다

검증한 전자금융공동망 공개 데이터는 현재 구조로 행동 기반 FDS 모델의 순위를 매기는 benchmark에 적합하지 않다. Label 대부분이 48개 금액 template으로 복원되고, 배포된 평가 경로는 제공된 split의 경계까지 없앤다.

그렇다고 파일 자체가 쓸모없다는 뜻은 아니다. 대용량 적재, schema 처리, class imbalance 학습, trivial baseline의 중요성을 보여주는 실습에는 사용할 수 있다. 다만 shortcut 구조를 제거하거나 다시 설계하기 전에는 높은 F1이나 AUC만으로 어떤 모델이 실제 사기 행동을 더 잘 배웠다고 주장할 수 없다.

이 검증에도 범위가 있다. 확보한 train과 validation만 대상으로 했으며 AI-Hub 페이지에 표시된 모든 label 행을 확인한 것은 아니다. 생성기 구현이 공개되지 않아, 공개 데이터에서 관찰한 구조를 보고할 뿐 생성 과정 내부의 의도나 특정 bug를 단정하지 않는다. LightGBM도 tuning 경쟁이 아니라 처음 결론이 baseline 선택에 민감한지 확인하기 위한 고정 sensitivity test다.

이 작업의 실무적 결과는 모델을 하나 더 만든 것이 아니라, 몇 주간의 최적화가 잘못된 질문에 정밀한 답을 내는 일을 막았다는 데 있다. 실행 코드, 고정 threshold, source file hash, sensitivity 결과, 데이터셋별 report는 fraud-dataset-validity에 공개했다. 원본은 AI-Hub 데이터셋 71925다.