티스토리 뷰
머신러닝 기초학습 5: 모델 평가와 일반화 — 과적합을 피하고 진짜 실력을 확인하는 법
“모델이 훈련 데이터에서 99% 정확도!”
처음엔 신나죠. 그런데 새로운 데이터에서는 65%로 떨어진다면?
그건 모델이 똑똑한 게 아니라 외운 것입니다.
이번 글에서는 머신러닝의 마지막 관문이자 가장 중요한 주제,
모델 평가(Evaluation) 와 일반화(Generalization) 에 대해 이야기합니다.
즉, “모델이 진짜로 잘하는지”를 수학적으로 검증하는 법입니다.
1. 왜 평가가 중요한가?
훈련 성능만 보면 좋은 모델처럼 보이지만,
그건 시험지를 외운 학생과 다를 바 없습니다.
머신러닝의 목표는 “본 적 없는 데이터에서도 좋은 성능을 내는 것”
즉, 일반화(generalization) 입니다.
이를 확인하기 위해 데이터를 세 부분으로 나눕니다.
구분 용도 설명
| Train Set | 학습 | 모델이 패턴을 배우는 데이터 |
| Validation Set | 검증 | 모델 튜닝(하이퍼파라미터 선택) |
| Test Set | 평가 | 최종 성능 측정용, 절대 사용 금지 |
2. 과적합 vs 과소적합
구분 설명 비유
| 과적합 (Overfitting) | 훈련 데이터에만 과하게 맞춤 | 기출만 외운 학생 |
| 과소적합 (Underfitting) | 패턴을 충분히 못 배움 | 공부 안 한 학생 |
균형점을 찾는 것이 핵심입니다.
3. 교차검증 (Cross Validation)
“데이터를 나눠서 여러 번 평가해 평균을 낸다.”
하나의 테스트셋만으로는 운이 작용할 수 있습니다.
그래서 K-Fold Cross Validation 을 사용합니다.
Fold 설명
| 데이터를 K조각으로 나눔 | |
| K-1개로 학습, 1개로 검증 | |
| 이를 K번 반복해 평균 성능 계산 |
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
X, y = load_iris(return_X_y=True)
model = LogisticRegression(max_iter=300)
scores = cross_val_score(model, X, y, cv=5)
print("평균 정확도:", scores.mean())
4. 평가 지표 (Metrics)
4.1 분류(Classification)
지표 의미 공식
| Accuracy | 전체 중 맞춘 비율 | (TP + TN) / (전체) |
| Precision | 예측 중 실제 정답 비율 | TP / (TP + FP) |
| Recall (재현율) | 실제 정답 중 맞춘 비율 | TP / (TP + FN) |
| F1 Score | Precision & Recall의 조화평균 | 2PR / (P+R) |
👉 Accuracy는 데이터 불균형일 때 신뢰하기 어렵습니다.
예: 사기 1%, 정상 99% 데이터에서 ‘전부 정상’이라고만 해도 99% 정확도!
4.2 ROC & AUC
- ROC Curve: 모델의 민감도(True Positive Rate) vs 거짓양성률(False Positive Rate)
- AUC (Area Under Curve): ROC 곡선 아래 면적 (1에 가까울수록 좋음)
from sklearn.metrics import roc_auc_score
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
X, y = make_classification(n_samples=1000, n_classes=2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
probs = model.predict_proba(X_test)[:,1]
print("AUC:", roc_auc_score(y_test, probs))
4.3 회귀(Regression)
지표 의미 낮을수록 좋음
| MSE (Mean Squared Error) | 오차 제곱의 평균 | ✅ |
| RMSE (Root MSE) | MSE의 제곱근, 단위 복원 | ✅ |
| MAE (Mean Absolute Error) | 절댓값 오차 평균 | ✅ |
| R² (결정계수) | 1이면 완벽한 예측 | ❌ (높을수록 좋음) |
from sklearn.metrics import mean_squared_error, r2_score
y_true = [3, 5, 2.5, 7]
y_pred = [2.8, 4.9, 3.0, 6.8]
print("MSE:", mean_squared_error(y_true, y_pred))
print("R²:", r2_score(y_true, y_pred))
5. 혼동 행렬 (Confusion Matrix)
“모델의 판단을 한눈에 보는 표.”
실제 / 예측 긍정(1) 부정(0)
| 긍정(1) | True Positive (TP) | False Negative (FN) |
| 부정(0) | False Positive (FP) | True Negative (TN) |
from sklearn.metrics import confusion_matrix
y_true = [1,0,1,1,0,0,1]
y_pred = [1,0,1,0,0,1,1]
print(confusion_matrix(y_true, y_pred))
6. 정규화 (Regularization) — 과적합 방지의 핵심
“모델이 복잡해질수록 벌점을 주자.”
종류 설명 효과
| L1 정규화 | 가중치의 절댓값을 벌점으로 | 일부 피처 제거 (희소화) |
| L2 정규화 | 가중치의 제곱을 벌점으로 | 과적합 억제 (가중치 작게) |
로지스틱 회귀, 선형회귀, SVM 등 거의 모든 모델에 내장되어 있습니다.
7. Dropout, Early Stopping (딥러닝용)
기법 의미
| Dropout | 학습 중 일부 뉴런을 무작위로 끔 → 과적합 방지 |
| Early Stopping | 검증 손실이 오르기 시작하면 학습 조기 종료 |
8. Bias–Variance Tradeoff
“단순하면 편향(bias)이 크고, 복잡하면 분산(variance)이 크다.”
모델 복잡도 Bias Variance 예시
| 너무 단순 | ↑ | ↓ | 선형회귀 (Underfitting) |
| 너무 복잡 | ↓ | ↑ | 딥러닝 과적합 |
| 적절한 균형 | ✅ | ✅ | 정규화된 모델 |
일반화 성능이 가장 좋은 지점은 이 두 요소가 교차하는 구간입니다.
9. 모델 선택 (Model Selection)
- Baseline 설정: 단순한 모델(로지스틱/선형회귀)부터 시작
- 교차검증: 성능 안정성 확인
- 정규화/드롭아웃 적용: 과적합 억제
- 앙상블: 여러 모델 평균 (랜덤포레스트, 부스팅)
- 테스트셋으로 최종 점검: 단 한 번만!
10. 실전 예제 — 교차검증 + 정규화 + 평가
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
X, y = load_breast_cancer(return_X_y=True)
model = LogisticRegression(max_iter=300, penalty='l2', C=1.0)
scores = cross_val_score(model, X, y, cv=5, scoring='f1')
print("평균 F1 점수:", scores.mean())
11. 핵심 정리
개념 설명
| 일반화(Generalization) | 새 데이터에 대한 성능 |
| 교차검증(CV) | 데이터 분할 반복으로 신뢰성 확보 |
| 정규화(Regularization) | 과적합 억제 |
| 평가지표(Metrics) | 문제 유형에 맞게 선택 |
| Bias–Variance Tradeoff | 단순함과 복잡함의 균형 |
🧭 결론
좋은 머신러닝 모델은 단순히 높은 정확도를 자랑하지 않습니다.
그보다는 “새로운 상황에서도 무너지지 않는 모델”이어야 합니다.
정확도 95%보다, 일반화된 85%가 낫다.
이게 머신러닝의 철학입니다.
📘 다음 글 예고
👉 머신러닝 기초학습 6: 하이퍼파라미터 튜닝과 모델 최적화 — 그리드서치, 랜덤서치, 베이지안 최적화의 세계
모델을 1~2% 더 끌어올리는 “튜닝의 기술”로 넘어가 봅시다.
하이퍼파라미터 탐색, 교차검증, 자동 최적화(AutoML)까지 다룹니다.
머신러닝,AI기초,모델평가,일반화,교차검증,정규화,과적합,평가지표,ROC,AUC
'study > ML' 카테고리의 다른 글
| 머신러닝 기초학습 7: 피처 중요도와 모델 해석 — 모델이 ‘왜 그렇게 예측했는가’를 이해하기 (0) | 2025.11.04 |
|---|---|
| 머신러닝 기초학습 6: 하이퍼파라미터 튜닝과 모델 최적화 — 모델의 ‘감’을 숫자로 조정하는 기술 (0) | 2025.11.03 |
| 머신러닝 기초학습 4: 데이터 전처리와 피처 엔지니어링 — 모델이 이해할 수 있는 데이터로 바꾸는 기술 (0) | 2025.10.29 |
| 머신러닝 기초학습 3 (개정판): 비전공자도 이해하는 머신러닝 핵심 용어 사전 (0) | 2025.10.28 |
| 머신러닝 기초학습 2: 대표 ML 알고리즘—학습과 추론의 ‘방식’까지 이해하기 (0) | 2025.10.28 |
- Total
- Today
- Yesterday
- Docker
- 딥러닝
- Express
- llm
- 개발블로그
- REACT
- CI/CD
- kotlin
- fastapi
- ai철학
- 백엔드개발
- 웹개발
- PostgreSQL
- node.js
- Prisma
- nextJS
- Next.js
- LangChain
- NestJS
- Redis
- flax
- SEO최적화
- JAX
- 쿠버네티스
- 압박면접
- seo 최적화 10개
- DevOps
- rag
- Python
- JWT
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
