본문 바로가기
C.W.K.
Stream
Lesson 04 of 04 · published

Threshold 튜닝과 비즈니스 비용

~30 min · threshold, cost-matrix

Level 0Scout
0 XP0/48 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

0.5는 기본값일 뿐 정답이 아니야

분류 확률이 0.5를 넘으면 양성으로 부르는 관습은 업무 비용에서 나온 규칙이 아니야. 거짓양성과 거짓음성의 피해, 실제 양성 비율, 팀이 처리할 수 있는 건수에 따라 옳은 문턱은 달라져. 모델 학습이 끝났다고 결정 설계까지 끝난 게 아니지. 문턱은 설계 문서에서 숫자와 근거로 선택해야 해.

비용표를 실제 단위로 써

거짓양성 한 건의 검토 시간과 고객 불편, 거짓음성 한 건의 손실, 참양성 행동의 비용과 이익을 원화나 사람 시간으로 적어. 각 후보 문턱의 혼동행렬에 단가를 곱하면 기대 비용을 계산할 수 있어. 단가가 불확실하면 낙관·기준·비관 시나리오를 만들고 어느 범위에서도 선택이 유지되는지 봐.

비용 최소 문턱

검증 자료에서 여러 문턱의 기대 비용을 계산해 가장 낮은 지점을 고르는 방식이야. 확률이 잘 보정되어 있고 검증 자료의 범주 비율이 운영과 비슷할수록 믿을 만해. 최고점 하나만 고르지 말고 근처 문턱에서 비용이 얼마나 민감한지 확인해. 평평한 구간이라면 설명과 운영이 쉬운 값을 고를 수 있어.

정밀도 하한에서 재현율 최대화

잘못된 경보를 일정 수준 이상 허용할 수 없을 때 ‘정밀도 0.7 이상’ 같은 제약을 먼저 두고 그 안에서 재현율이 가장 높은 문턱을 골라. 검토 결과의 70% 이상이 진짜여야 팀 신뢰가 유지되는 경우에 맞아. 표본이 적다면 추정 정밀도의 신뢰구간도 보고 여유 있는 문턱을 선택해야 해.

처리 능력에 맞춘 상위 K개

상담팀이 하루 200건만 처리할 수 있다면 모든 사례의 점수를 매기고 상위 200건을 보내는 방식이 자연스러워. 이것도 매일 달라지는 암묵적 문턱을 가진 순위 결정이야. 동점 처리, 하루 표본 수 변화, 특정 집단이 상위권을 독점하는 현상을 정해야 해. 처리하지 못한 고득점 사례를 다음 날 넘길지도 계약에 포함하고.

문턱은 독립 검증 자료에서 고정해

모델을 학습한 자료에서 문턱까지 고르면 잡음에 맞춰질 수 있어. 검증 자료로 문턱을 선택하고 얼린 시험 자료에서 최종 비용과 건수를 한 번 확인해. 재표본한 비율이 아니라 실제 운영 비율의 자료를 사용해야 하고, 확률 보정도 문턱 선택 전 별도 자료나 교차검증으로 해야 해.

배포 뒤에는 모델과 문턱을 함께 기록해

각 결정에 원래 확률, 적용 문턱, 모델 버전, 정책 버전, 최종 행동을 남겨. 양성 비율이나 비용, 처리 능력이 바뀌면 모델이 그대로여도 최선 문턱은 달라질 수 있어. 실제 정밀도·재현율·경보 건수를 의도한 운영점과 매주 비교하고, 변경은 승인과 되돌리기 절차를 거쳐야 해.

Code

기대 비용을 최소화하는 판단 문턱·python
import numpy as np

thresholds = np.linspace(0.01, 0.99, 99)
cost_fp, cost_fn = 5, 50
best_t, best_cost = 0.5, float("inf")
for t in thresholds:
    preds = (probs >= t).astype(int)
    fp = ((preds == 1) & (y_val == 0)).sum()
    fn = ((preds == 0) & (y_val == 1)).sum()
    cost = fp * cost_fp + fn * cost_fn
    if cost < best_cost:
        best_cost, best_t = cost, t
print(f"chosen threshold {best_t:.2f}  expected cost {best_cost}")
고정 정밀도에서의 재현율·python
from sklearn.metrics import precision_recall_curve

precision, recall, thresholds = precision_recall_curve(y_val, probs)
ok = precision[:-1] >= 0.70
if ok.any():
    idx = np.argmax(recall[:-1][ok])
    chosen = thresholds[ok][idx]
    print(f"threshold for precision≥0.70: {chosen:.3f} → recall {recall[:-1][ok][idx]:.3f}")

External links

Exercise

이진 분류기의 거짓양성·거짓음성 비용을 원화나 사람 시간으로 적어. 비용 최소 문턱과 정밀도 0.7 이상에서 재현율이 가장 높은 문턱을 계산하고 하나를 운영점으로 선택해 민감도와 이유를 문서화해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.