분류 결정 임계값을 어디에 둘 것인가 — 비용과 불균형의 의사결정

분류 모델의 기본 임계값 0.5가 왜 항상 최적이 아닌지, 임계값 조정이 정밀도·재현율에 미치는 영향과 산업별 결정 기준을 정리한다.

2026-08-13 · 최초 발행 2025-05-23

기본값 0.5는 왜 항상 최적이 아닌가

로지스틱 회귀, 랜덤 포레스트, 신경망 같은 대부분의 이진 분류 모델은 0~1 사이의 확률값을 출력하고, 기본적으로 0.5 이상이면 Positive 클래스(1)로, 미만이면 Negative 클래스(0)로 분류한다. 이 분류 결정 임계값(Classification Threshold)은 확률 기반 예측에서 특정 클래스로 분류하기 위한 최소 확률 기준값이며, 임계값을 조정하면 모델 자체를 재학습시키지 않고도 예측 결과를 바꿀 수 있다.

하지만 비즈니스 요구사항과 데이터 특성에 따라 기본값 0.5가 최적이 아닌 경우가 많다. 한 클래스의 샘플이 다른 클래스보다 현저히 많은 클래스 불균형 문제, False Positive와 False Negative의 비용이 크게 다른 오분류 비용의 비대칭, 재현율(Recall)과 정밀도(Precision) 간 트레이드오프 조정 필요성이 임계값 조정을 요구하는 대표적 상황이다.

임계값을 올리고 내릴 때 지표가 움직이는 방향

임계값을 높이면 정밀도(Precision)는 올라가고 재현율(Recall)은 내려간다. 반대로 임계값을 낮추면 정밀도는 내려가고 재현율은 올라간다.

임계값 증가Positive 예측 감소False Positive 감소True Positive 감소정밀도 증가재현율 감소임계값 감소Positive 예측 증가False Positive 증가True Positive 증가정밀도 감소재현율 증가

암 진단 모델로 보는 높은 임계값과 낮은 임계값의 선택

암 진단 모델을 예로 들면, 높은 임계값(0.8)을 설정한 경우 암이라고 진단할 때의 정확도(정밀도)는 높아지지만 실제 암 환자를 놓칠 가능성(낮은 재현율)이 커진다. 후속 검사 비용이 적고 접근성이 높을 때 적합한 설정이다. 반대로 낮은 임계값(0.2)을 설정하면 대부분의 실제 암 환자를 식별할 수 있는(높은 재현율) 대신 건강한 환자도 암 의심으로 분류하는 오류(낮은 정밀도)가 늘어난다. 암을 놓치는 비용이 매우 큰 초기 스크리닝 상황에 적합하다.

ROC와 PR 곡선, 비용 함수로 최적점 찾기

ROC 곡선과 AUC

ROC 곡선은 다양한 임계값에서의 True Positive Rate(민감도)와 False Positive Rate(1-특이도)의 관계를 보여준다. 최적 임계값은 ROC 곡선에서 좌상단 모서리(0,1)에 가장 가까운 지점으로 선택할 수 있다.

정밀도-재현율 곡선(PR Curve)

클래스 불균형이 심한 경우 ROC 곡선보다 PR 곡선이 더 유용하다. F1 점수(정밀도와 재현율의 조화평균)가 최대가 되는 지점의 임계값을 선택할 수 있다.

비용 함수 최적화

비즈니스 맥락에서 각 유형의 오분류(False Positive, False Negative)에 비용을 할당하고, 총 비용을 최소화하는 임계값을 선택하는 방법이다.

파이썬으로 F1 최적 임계값 찾기

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve, f1_score

# 예시 데이터: 실제 레이블과 모델의 예측 확률
y_true = [0, 0, 1, 1, 1, 0, 1, 0, 1, 0]
y_pred_proba = [0.1, 0.3, 0.6, 0.7, 0.8, 0.4, 0.55, 0.2, 0.9, 0.3]

# 정밀도-재현율 곡선
precision, recall, thresholds = precision_recall_curve(y_true, y_pred_proba)

# F1 점수를 기준으로 최적 임계값 찾기
f1_scores = []
for thresh in thresholds:
    y_pred = [1 if prob > thresh else 0 for prob in y_pred_proba]
    f1_scores.append(f1_score(y_true, y_pred))

optimal_idx = np.argmax(f1_scores)
optimal_threshold = thresholds[optimal_idx]
print(f"최적 임계값: {optimal_threshold:.2f}, F1 점수: {f1_scores[optimal_idx]:.2f}")

# 결과 시각화
plt.figure(figsize=(10, 6))
plt.plot(thresholds, f1_scores[:-1], 'b-', label='F1 점수')
plt.axvline(x=optimal_threshold, color='r', linestyle='--', label=f'최적 임계값: {optimal_threshold:.2f}')
plt.xlabel('임계값')
plt.ylabel('F1 점수')
plt.title('임계값에 따른 F1 점수 변화')
plt.legend()
plt.show()

금융·의료·마케팅에서 임계값을 다르게 쓰는 이유

금융 산업의 사기 탐지에서는 False Positive 비용이 False Negative 비용보다 작기 때문에 매우 낮은 임계값으로 대부분의 사기를 감지하려 한다. 대출 승인에서는 업계 기준과 리스크 허용 범위에 따라 다양한 임계값을 설정한다.

의료 산업에서 초기 스크리닝은 낮은 임계값으로 질병 가능성이 있는 모든 환자를 포착하려 하고, 수술 결정은 높은 임계값으로 불필요한 수술 리스크를 줄인다.

마케팅에서 광범위한 캠페인은 낮은 임계값으로 더 많은 잠재 고객을 포함시키고, 프리미엄 제안은 높은 임계값으로 반응할 가능성이 높은 고객만 타겟팅한다.

임계값 조정 시 놓치기 쉬운 것들

임계값은 학습 데이터가 아닌 검증 데이터에서 결정해야 하고, 데이터 분포가 변하면 주기적으로 재평가해야 한다. 통계적 최적화만으로는 충분하지 않고 비즈니스 맥락을 함께 고려해야 하며, 임계값 조정은 모델 성능 개선을 대체하는 것이 아니라 보완하는 수단이라는 점을 구분해야 한다. 분류 결정 임계값은 단순한 기술적 파라미터가 아니라 비즈니스 전략과 직결되는 의사결정 요소이며, 오분류의 비즈니스 영향과 리스크 허용 범위, 자원 제약을 종합적으로 고려해 정해야 한다.

분류임계값정밀도재현율머신러닝분류모델의사결정