새 프로젝트에서 "고객이 이탈할지 예측해줘"라는 요구를 받으면, ML 엔지니어가 가장 먼저 할 일은 코드 작성이 아니라 이게 무슨 종류의 문제인가를 판별하는 것이다. 문제 유형을 잘못 짚으면 그 뒤 알고리즘·지표 선택이 전부 어긋난다.
ML 알고리즘은 "무엇으로부터 배우는가"에 따라 세 갈래로 나뉜다.
| 학습 방식 | 학습 신호 | 대표 문제 | AWS 빌트인 예 |
|---|---|---|---|
| 지도 학습 (Supervised) | 정답 라벨 | 분류, 회귀 | XGBoost, Linear Learner |
| 비지도 학습 (Unsupervised) | 없음 (구조 발견) | 군집, 차원 축소, 이상탐지 | K-Means, PCA, RCF |
| 강화 학습 (Reinforcement) | 보상(reward) | 순차적 의사결정 | SageMaker RL |
판별은 단순하다.
💡 관련 이론: 지도 학습은 입력 X에서 출력 Y로의 함수 f(X)=Y를 근사하는 문제다. 라벨링 비용이 비싸기 때문에 실무에서는 적은 라벨로 학습하는 준지도 학습(semi-supervised)이나, 데이터 자체에서 라벨을 만들어내는 자기지도 학습(self-supervised, 대규모 언어모델의 학습 방식)이 중요해졌다. AWS SageMaker Ground Truth가 라벨링을 자동화·외주화하는 서비스인 이유가 이 라벨 비용 문제 때문이다.
지도 학습은 출력이 무엇이냐에 따라 다시 둘로 나뉜다.
| 구분 | 분류 (Classification) | 회귀 (Regression) | 군집 (Clustering) |
|---|---|---|---|
| 라벨 | 있음 | 있음 | 없음 |
| 출력 | 이산적 범주 | 연속적 숫자 | 그룹 번호 |
| 예 | 이탈/유지, 스팸/정상 | 내일 매출, 집값 | 고객 세그먼트 |
| 대표 지표 | Precision/Recall/F1/AUC | RMSE, MAE, R² | Silhouette, Inertia |
| XGBoost objective | binary:logistic | reg:squarederror | (해당 없음) |
# 분류: XGBoost로 이탈 예측 (출력 = 확률 → 이산 라벨)
estimator = sagemaker.estimator.Estimator(
image_uri=xgboost_image, role=role,
instance_count=1, instance_type="ml.m5.xlarge",
hyperparameters={
"objective": "binary:logistic", # 이진 분류
"num_round": 100, "max_depth": 5,
},
)
# 회귀였다면 objective만 바꾸면 된다
# "objective": "reg:squarederror" # 연속값 예측같은 XGBoost라도 objective 하이퍼파라미터 하나로 분류와 회귀가 갈린다. 문제 유형을 잘못 판별하면 여기서부터 어긋난다.
🔍 더 깊이: 분류라도 출력이 "확률"인지 "라벨"인지 구분해야 한다.
binary:logistic은 0~1 확률을 반환하고, 이를 라벨로 바꾸려면 **임계값(threshold)**이 필요하다. 기본 0.5지만, 이탈 고객을 놓치면 안 되는 비즈니스라면 임계값을 낮춰 더 많은 사람을 "이탈 위험"으로 분류한다. 임계값 조정이 바로 다음에 볼 정밀도-재현율 트레이드오프의 핵심이다.
분류 모델을 평가하려면 먼저 **혼동 행렬(confusion matrix)**을 이해해야 한다. 예측과 실제를 교차한 2x2 표다.
실제 양성(Positive) 실제 음성(Negative)
예측 양성 TP (참 양성) FP (거짓 양성)
예측 음성 FN (거짓 음성) TN (참 음성)
┌──────────── 정밀도 = TP / (TP + FP) ← 예측 양성 행 기준
│
TP FP ────┘
FN TN ────┐
│
└──────────── 재현율 = TP / (TP + FN) ← 실제 양성 열 기준
"이탈 예측" 예시로 보면 이렇게 읽는다.
| 칸 | 의미 | 이탈 예측에서 |
|---|---|---|
| TP | 양성을 양성으로 맞춤 | 이탈할 사람을 이탈로 예측 |
| FP | 음성을 양성으로 잘못 봄 | 유지할 사람에게 헛되이 쿠폰 발송 |
| FN | 양성을 놓침 | 이탈할 사람을 놓쳐 고객 이탈 |
| TN | 음성을 음성으로 맞춤 | 유지할 사람을 유지로 예측 |
모든 지표는 이 네 칸의 조합이다.
정확도(Accuracy) = (TP+TN) / 전체. 가장 직관적이지만 가장 위험하다. 사기 거래가 0.1%인 데이터에서 "전부 정상"이라 찍는 모델도 정확도 99.9%다. 이걸 불균형 데이터의 정확도 함정이라 한다.
그래서 양성 클래스에 초점을 둔 두 지표가 필요하다.
둘은 트레이드오프 관계다. 임계값을 낮추면 양성을 많이 예측해 재현율↑ 정밀도↓, 높이면 반대다.
| 비즈니스 상황 | 더 비싼 오류 | 더 중요한 지표 | 이유 |
|---|---|---|---|
| 암 진단 | FN(환자를 놓침) | 재현율 | 놓치면 생명과 직결 |
| 스팸 필터 | FP(정상을 스팸 처리) | 정밀도 | 중요 메일이 사라지면 안 됨 |
| 사기 탐지 | FN(사기를 놓침) | 재현율 우선, 정밀도 균형 | 손실 방지 vs 정상 고객 불편 |
| 광고 타깃팅 | FP(관심 없는 사람에 노출) | 정밀도 | 예산 낭비 |
| 설비 고장 예측 | FN(고장을 놓침) | 재현율 | 라인 정지 비용이 점검 비용보다 큼 |
지표를 고르는 한 줄 원칙: FN과 FP 중 비즈니스적으로 더 비싼 쪽을 줄이는 지표를 최우선한다.
📚 사례: COMPAS는 미국 법원이 쓰던 재범 예측 시스템이다. 2016년 ProPublica 보도에서 흑인 피고에 대해 "재범 위험 높음"으로 잘못 분류하는 거짓 양성(FP) 비율이 백인보다 약 2배 높다는 것이 드러났다. 전체 정확도는 인종 간 비슷했지만, FP/FN의 분포가 집단마다 달랐던 것이다. 정확도 한 숫자만 보면 놓치는 공정성 문제를 혼동 행렬 단위로 봐야 잡힌다는 교훈이다.
정밀도와 재현율을 둘 다 신경 쓰고 싶을 때 F1 점수를 쓴다. 둘의 조화평균이다.
F1 = 2 * (Precision * Recall) / (Precision + Recall)
조화평균을 쓰는 이유는 둘 중 하나라도 낮으면 F1이 크게 떨어지기 때문이다. 정밀도 0.9·재현율 0.1이면 산술평균은 0.5지만 F1은 0.18이다. "한쪽만 좋아서는 안 된다"를 강제한다.
**AUC(ROC 곡선 아래 면적)**는 임계값에 무관하게 모델의 분별력을 측정한다. ROC 곡선은 모든 임계값에서의 재현율(TPR)과 거짓 양성률(FPR)을 그린 것이고, 그 아래 면적이 AUC다.
| AUC 값 | 해석 |
|---|---|
| 1.0 | 완벽한 분류 |
| 0.7~0.9 | 실무에서 흔히 보는 쓸 만한 수준 |
| 0.5 | 무작위 추측과 동일 |
| < 0.5 | 거꾸로 예측하는 셈 (뒤집으면 오히려 낫다) |
어느 지표를 언제 보는가 — 시험 판별에 바로 쓰이는 표다.
| 상황 | 봐야 할 지표 | 이유 |
|---|---|---|
| 클래스가 균형 잡혀 있다 | Accuracy | 직관적이고 왜곡이 적음 |
| 극단적 불균형 | PR-AUC, F1, Recall | Accuracy·ROC-AUC가 낙관적으로 보임 |
| 임계값을 아직 안 정했다 | ROC-AUC | 임계값 무관 순위 능력 비교 |
| 임계값이 정해졌다 | Precision/Recall/F1 | 실제 운영 시점의 성능 |
| 오류의 비용이 비대칭 | 비싼 오류에 대응하는 지표 | 비즈니스 손실 최소화 |
💡 관련 이론: AUC는 "무작위로 양성 샘플 하나와 음성 샘플 하나를 뽑았을 때, 모델이 양성에 더 높은 점수를 줄 확률"로도 해석된다. 임계값을 정하기 전 모델 자체의 순위 매기기 능력을 보는 지표라, 임계값이 아직 정해지지 않은 모델 비교 단계에서 유용하다. 다만 극단적 불균형 데이터에서는 AUC가 낙관적으로 나올 수 있어 PR-AUC(정밀도-재현율 곡선)를 함께 본다.
회귀는 연속값이라 혼동 행렬이 없고 "예측이 실제와 얼마나 가까운가"를 잰다.
| 지표 | 계산 | 이상치 민감도 | 단위 | 언제 고르나 |
|---|---|---|---|---|
| MAE | 오차 절대값의 평균 | 낮음 (robust) | 원래 값과 같음 | 이상치가 많고 영향을 줄이고 싶을 때 |
| MSE | 오차 제곱의 평균 | 높음 | 제곱 단위 | 큰 오차를 강하게 벌하고 싶을 때 |
| RMSE | MSE의 제곱근 | 높음 | 원래 값과 같음 | MSE의 장점 + 해석 쉬움 |
| R² | 설명된 분산 비율 | 중간 | 무차원(0~1) | 모델이 변동을 얼마나 설명하나 |
⚠️ 함정: RMSE와 MAE는 "둘 다 낮을수록 좋다"는 점은 같지만 값의 크기를 직접 비교하면 안 된다. 같은 데이터에서 RMSE는 항상 MAE 이상이며, 둘의 격차가 크다면 소수의 큰 오차(이상치)가 존재한다는 신호다.
지표를 외우기보다 한 번 계산해보면 오래 간다. 사기 탐지 모델을 1,000건에 적용한 결과가 다음과 같다고 하자.
실제 사기(30건) 실제 정상(970건)
예측 사기 TP = 18 FP = 42
예측 정상 FN = 12 TN = 928
| 지표 | 계산 | 값 | 읽는 법 |
|---|---|---|---|
| Accuracy | (18+928)/1000 | 0.946 | 전부 정상으로 찍어도 0.97 — 의미 없음 |
| Precision | 18/(18+42) | 0.300 | 사기라 외친 것 중 30%만 진짜 |
| Recall | 18/(18+12) | 0.600 | 실제 사기의 60%만 잡음, 12건 놓침 |
| F1 | 2×0.3×0.6/(0.3+0.6) | 0.400 | 정밀도가 낮아 크게 끌려 내려감 |
클래스가 셋 이상이면 정밀도·재현율을 클래스마다 계산한 뒤 평균을 낸다. 평균 방식이 결론을 바꾼다.
| 평균 방식 | 계산 | 소수 클래스 반영 | 언제 |
|---|---|---|---|
| Macro | 클래스별 지표를 단순 평균 | 크게 반영(모든 클래스 동등) | 소수 클래스도 똑같이 중요할 때 |
| Weighted | 클래스 표본 수로 가중 평균 | 적게 반영 | 전체 성능을 대표시키고 싶을 때 |
| Micro | 전체 TP/FP/FN을 합쳐 한 번 계산 | 적게 반영 | 전체 예측 건수 기준 성능 |
⚠️ 함정: 클래스가 불균형한 다중 분류에서 weighted 평균만 보면 다수 클래스 성능에 가려 소수 클래스의 실패가 보이지 않는다. "소수 클래스를 잘 잡는지"가 목적이면 macro 평균이나 클래스별 지표를 따로 확인해야 한다.
| 잘못된 선택 | 결과 |
|---|---|
| 불균형 데이터에 Accuracy | 아무것도 못 잡는 모델을 "좋다"고 판정 |
| 암 진단에 Precision 최우선 | 확실한 환자만 양성으로 골라 다수를 놓침 |
| 스팸 필터에 Recall 최우선 | 정상 메일까지 대량 차단 |
| 회귀 문제에 Accuracy | 애초에 계산이 성립하지 않음 |
| 임계값이 정해졌는데 ROC-AUC만 봄 | 실제 운영 시점의 성능을 모름 |
다음 글에서는 이 문제들을 실제로 푸는 도구 — AWS의 ML 스택 전체 — 를 조감한다.
선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
과거 이탈 여부 라벨이 있는 데이터로 고객 이탈을 예측하려 한다. 이 문제의 학습 방식과 출력 형태는?
문제 2
사기 거래가 전체의 0.1%인 데이터에서 모델이 정확도 99.9%를 기록했다. 이 정확도를 신뢰할 수 없는 이유는?
문제 3
암 진단 분류 모델에서 무엇보다 우선해야 할 평가 지표와 그 이유로 옳은 것은?
문제 4
어떤 모델이 정밀도 0.9, 재현율 0.1을 기록했다. F1 점수가 산술평균 0.5보다 훨씬 낮은 0.18로 나오는 이유는?
문제 5
ROC-AUC 값이 0.5인 분류 모델에 대한 해석으로 옳은 것은?