[개발 공부] / Youden's J: Sensitivity와 Specificity가 만나는 임계값.md

Youden's J: Sensitivity와 Specificity가 만나는 임계값

조회

2026년 7월 14일 | 개발 공부


이상 거래 점수가 0.35를 넘으면 경보를 띄우는 모델에서 threshold를 0.55로 올리자 오탐은 줄었지만 놓친 거래가 늘었다. ROC curve에는 후보 점이 여러 개 있었고, 어느 점을 기준으로 삼아야 할지 설명이 막혔다. Youden's J statistic은 이런 이진 분류에서 Sensitivity와 Specificity의 합에서 1을 뺀 값으로, 양성과 음성을 함께 잘 회수하는 threshold 후보를 고르는 지표다. 나는 처음에 이것을 최적 임계값 공식처럼 받아들였는데, 실제로는 검증 데이터에서 출발점을 정리하는 도구에 더 가까웠다.

같은 검증 데이터에서 세 임계값의 sensitivity, specificity, Youden's J를 비교한 도식
같은 검증 데이터에서 threshold 0.35, 0.55, 0.75를 나란히 비교했다. J가 가장 큰 0.55도 운영 비용을 반영한 최종 답은 아니다.

ROC curve의 한 점을 고르는 숫자

계산은 단순하다. J = Sensitivity + Specificity - 1이다. Sensitivity는 실제 양성 가운데 맞힌 비율이고, Specificity는 실제 음성 가운데 맞힌 비율이다. 두 값을 같은 무게로 합치기 때문에 한쪽 클래스만 잘 맞혀서는 높은 값이 나오기 어렵다.

ROC 공간으로 보면 J는 대각선의 무작위 기준선보다 해당 점이 얼마나 위에 있는지를 나타낸다. 완벽하게 분리하면 1, 무작위와 비슷한 균형이면 0 근처다. 예측 방향이 체계적으로 뒤집히면 음수가 될 수도 있다. 그래서 J의 최댓값을 찾는 일은 ROC curve에서 대각선과 수직 거리가 가장 큰 점을 찾는 일로도 읽을 수 있다.

세 임계값을 숫자로 놓고 보면

그림의 threshold 0.35에서는 Sensitivity 0.84, Specificity 0.66이어서 J는 0.50이다. 0.55로 올리면 Sensitivity는 0.72로 내려가지만 Specificity가 0.82로 올라 J가 0.54가 된다. 0.75에서는 Specificity가 0.94까지 오르는 대신 Sensitivity가 0.48로 무너져 J도 0.42로 내려간다.

이 결과만 놓으면 0.55가 가장 균형 잡힌 후보다. 다만 이 문장의 주어는 어디까지나 현재 validation set과 양쪽 recall의 동일한 중요도다. 사기 거래 한 건을 놓치는 비용이 정상 거래 한 건을 검토하는 비용보다 훨씬 크다면, J가 조금 낮더라도 0.35를 택할 수 있다. 반대로 자동 차단처럼 오탐이 곧 고객 피해로 이어지면 더 높은 threshold가 필요할 수 있다.

Balanced Accuracy와 같은 재료, 다른 눈금

Youden's J를 정리하다가 가장 허무했던 부분은 Balanced Accuracy와의 관계였다. 이진 분류의 Balanced Accuracy는 (Sensitivity + Specificity) / 2다. 식을 정리하면 J = 2 × Balanced Accuracy - 1이 된다. 둘은 같은 두 값을 합치고 눈금만 다르게 바꾼 셈이다.

따라서 같은 threshold 후보들을 비교하면 J와 Balanced Accuracy의 순위는 항상 같다. 보고서에 둘을 나란히 적고 서로 다른 두 근거가 일치했다고 말하면 안 된다. 0.77의 Balanced Accuracy는 0.54의 J와 같은 정보를 담는다. 나는 하나를 주 지표로 고르고, 다른 하나는 해석을 돕는 변환 관계로만 남기는 편이 낫다고 본다.

F-beta와 갈라지는 질문

F-beta score는 Precision과 Recall을 묶는다. 그래서 “양성이라고 올린 경보가 얼마나 믿을 만한가”와 “실제 양성을 얼마나 잡았는가”를 함께 본다. 반면 Youden's J는 양성 Recall인 Sensitivity와 음성 Recall인 Specificity를 같은 무게로 본다. 후보 목록의 오염도를 직접 묻는 Precision은 식에 없다.

이 차이는 양성 비율이 매우 낮을 때 커진다. Sensitivity와 Specificity가 그대로여도 실제 배포 데이터에서 양성이 더 희귀해지면 Precision은 크게 떨어지고 경보 대부분이 오탐이 될 수 있다. J는 이 변화를 직접 드러내지 않는다. 그래서 희귀 장애 탐지나 의료 선별처럼 사람이 경보를 검토해야 하는 작업에서는 J 하나보다 Precision, Recall, 경보 건수, F-beta 또는 PR curve를 함께 봐야 한다.

가장 큰 J를 바로 운영 threshold로 쓰면

첫 번째 함정은 test set을 훑어 가장 큰 J를 고르는 것이다. threshold를 고르는 순간 test set이 튜닝 데이터가 된다. 나는 threshold 후보를 validation set에서 정하고, test set에는 그 값을 고정한 뒤 한 번만 평가하는 구분을 로그에 남긴다. 표본이 작다면 bootstrap이나 fold별 최적점의 분산도 같이 본다.

두 번째 함정은 score가 확률처럼 보인다는 이유로 0.55를 “55% 위험”이라고 해석하는 것이다. J는 순서와 threshold 결과를 평가할 뿐 probability calibration을 보장하지 않는다. 자동 승인이나 차단처럼 확률 의미가 필요하면 reliability diagram, Brier score, log loss를 별도로 확인해야 한다.

세 번째는 모든 오류 비용이 같다는 암묵적 가정이다. J 최대점은 Sensitivity와 Specificity를 대칭으로 다룬다. 실제 비용이 비대칭이면 false negative와 false positive의 단가를 둔 expected cost, 최소 Recall 조건, 하루 검토 가능한 경보 수 같은 제약을 먼저 세워야 한다. J는 그 제약 안에서 비교할 후보를 줄이는 역할이면 충분하다.

내가 평가 로그에 남기는 최소 항목

요즘은 숫자 하나보다 선택 과정을 재현할 수 있는지를 더 본다. 최소한 validation의 양성·음성 support, 비교한 threshold 범위, 선택점의 Sensitivity·Specificity·J, 같은 점의 Precision과 경보 건수, 그리고 test 고정 결과를 함께 남긴다. 비용 조건이 있다면 “J 최대”와 “운영 선택”을 별도 열로 분리한다.

이렇게 적어 두면 0.55를 왜 골랐는지 설명할 수 있고, 배포 후 양성 비율이나 검토 용량이 달라졌을 때 무엇을 다시 계산해야 하는지도 보인다. Youden's J는 균형점 후보를 찾는 좌표이지, 비즈니스 비용과 calibration까지 한 번에 해결하는 정답표는 아니다.

댓글

홈으로 돌아가기

검색 결과

"" 검색 결과입니다.