정확성만으로는 충분하지 않은 이유
기계 학습 모델을 평가하는 것은 생각보다 훨씬 더 복잡합니다. 실수 초보자들 사이에서 가장 흔한 것은 전적으로 의존하는 것입니다.정확성 (퍼센트 정확한 예측). 하나의 클래스가 데이터의 95%를 나타내는 불균형 데이터 세트의 경우 모델은 완전히 쓸모가 없음에도 불구하고 다수 클래스가 항상 95%의 정확도를 얻을 것으로 예측합니다. 모델을 올바르게 평가하려면 더 정교한 측정항목이 필요합니다.
이 기사에서는 분류 및 회귀에 사용할 수 있는 전체 측정항목을 살펴보겠습니다. 우리는 각각을 언제 사용해야 하는지 이해하고 교차 검증을 통해 강력한 평가 프레임워크를 구축할 것입니다.
이 기사에서 배울 내용
- 혼동 매트릭스: TP, TN, FP, FN
- 정밀도, 재현율 및 F1 점수
- ROC 곡선 및 AUC
- 회귀 지표: MSE, MAE, R²
- 교차 검증: 강력한 평가
- 문제에 적합한 측정항목을 선택하는 방법
혼란 매트릭스
La 혼동 행렬 이는 모든 분류 지표의 기초입니다. 문제가 있는 경우 이진법은 예측을 네 가지 범주로 구성합니다. 참양성(TP) — 올바르게 긍정적으로 예측됨; 참음성(TN) - 부정적으로 정확하게 예측됨; 거짓양성(FP) — 양성으로 잘못 예측됨(제1종 오류) 거짓 부정(FN) — 부정확하게 부정확하게 예측되었습니다(제2종 오류).
from sklearn.metrics import (
confusion_matrix, classification_report,
precision_score, recall_score, f1_score,
roc_auc_score, roc_curve, accuracy_score
)
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import numpy as np
# Dataset
data = load_breast_cancer()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# Modello
pipeline = Pipeline([
('scaler', StandardScaler()),
('clf', LogisticRegression(max_iter=10000, random_state=42))
])
pipeline.fit(X_train, y_train)
# Predizioni e probabilità'
y_pred = pipeline.predict(X_test)
y_proba = pipeline.predict_proba(X_test)[:, 1]
# Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
tn, fp, fn, tp = cm.ravel()
print("Confusion Matrix:")
print(f" TN={tn} FP={fp}")
print(f" FN={fn} TP={tp}")
# Metriche
print(f"\nAccuracy: {accuracy_score(y_test, y_pred):.3f}")
print(f"Precision: {precision_score(y_test, y_pred):.3f}")
print(f"Recall: {recall_score(y_test, y_pred):.3f}")
print(f"F1-Score: {f1_score(y_test, y_pred):.3f}")
print(f"ROC-AUC: {roc_auc_score(y_test, y_proba):.3f}")
# Report completo
print(f"\n{classification_report(y_test, y_pred, target_names=data.target_names)}")
정밀도, 재현율 및 F1 점수
정도 = TP / (TP + FP): 양성으로 예측된 모든 샘플 중 실제로 양성인 샘플은 몇 개입니까? 정밀도가 높다는 것은 거짓 긍정이 거의 없다는 것을 의미합니다. 거짓 긍정으로 인해 비용이 많이 드는 경우 매우 중요합니다(예: 승인 미수금: 연체 고객을 승인하고 싶지 않습니다).
상기하다 (감도) = TP / (TP + FN): 모든 양성 샘플 중 몇 개가 있습니까? 발견됐나요? 높은 재현율은 거짓음성이 거의 없다는 것을 의미합니다. 위음성이 위험한 경우 매우 중요합니다. (예: 종양 진단: 양성 사례를 놓치고 싶지 않습니다.)
F1-점수 = 2 * (정밀도 * 재현율) / (정밀도 + 재현율): 정밀도의 조화 평균 그리고 회상합니다. 두 측정항목 간의 균형이 필요할 때 유용합니다. 조화 평균은 값에 불이익을 줍니다. 극단적인 경우: 두 측정항목 중 하나가 매우 낮으면 F1도 낮아집니다.
정밀도-재현율 절충: 분류 임계값(0.5 이상)을 높이면 증가합니다. 정밀도는 높지만 재현율은 감소합니다. 낮추면 그 반대가 됩니다. 보편적으로 임계값은 없습니다. 최고: 특정 도메인의 거짓 긍정과 거짓 부정의 상대적 비용에 따라 달라집니다.
ROC 곡선 및 AUC
La ROC 곡선(수신기 작동 특성) 참양성 간의 절충점을 표시합니다. 분류 임계값에 따른 비율(재현율) 및 거짓 긍정 비율은 다양합니다. 그만큼'AUC(아래 면적 곡선) ROC를 단일 숫자로 요약합니다. 1.0은 완벽한 모델이고 0.5는 완벽한 모델입니다. 우연과 동일합니다(무작위 분류). AUC는 모델의 분리 능력을 측정합니다. 선택한 임계값에 관계없이 클래스.
from sklearn.metrics import precision_recall_curve, roc_curve, roc_auc_score
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import numpy as np
# Pipeline
pipeline = Pipeline([
('scaler', StandardScaler()),
('clf', RandomForestClassifier(n_estimators=100, random_state=42))
])
# --- CROSS-VALIDATION con più' metriche ---
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
metrics = ['accuracy', 'precision', 'recall', 'f1', 'roc_auc']
print("Cross-Validation Results:")
for metric in metrics:
scores = cross_val_score(pipeline, X, y, cv=cv, scoring=metric)
print(f" {metric:<12s}: {scores.mean():.3f} (+/- {scores.std():.3f})")
# --- THRESHOLD TUNING ---
pipeline.fit(X_train, y_train)
y_proba = pipeline.predict_proba(X_test)[:, 1]
# Precision-Recall per diverse soglie
precisions, recalls, thresholds = precision_recall_curve(y_test, y_proba)
# Trovare la soglia che massimizza F1
f1_scores = 2 * (precisions * recalls) / (precisions + recalls + 1e-10)
best_idx = np.argmax(f1_scores)
best_threshold = thresholds[best_idx] if best_idx < len(thresholds) else 0.5
print(f"\nMiglior threshold per F1: {best_threshold:.3f}")
print(f" Precision: {precisions[best_idx]:.3f}")
print(f" Recall: {recalls[best_idx]:.3f}")
print(f" F1: {f1_scores[best_idx]:.3f}")
회귀 측정항목
회귀 분석의 경우 메트릭은 예측 값과 실제 값 사이의 거리를 측정합니다. MSE(평균 제곱 오류) 큰 오류에 대해서는 2차적으로 페널티를 적용합니다. MAE(평균 절대 오차) 거래 모든 오류는 선형적으로 발생하며 이상값에 더 강력합니다. RMSE(루트 MSE) 같은 것들이 있어요 더 해석하기 쉬운 타겟의 측정 단위입니다. R² 비율을 나타낸다 모델에 의해 설명되는 분산: 1.0은 완벽하고 0은 항상 평균을 예측하는 것과 같습니다.
올바른 측정항목을 선택하는 방법
측정항목 선택은 도메인 및 오류 비용에 따라 달라집니다. 의학적 진단을 위해 리콜 이는 매우 중요합니다(사례를 놓치고 싶지는 않습니다). 스팸 필터링에서는 정확성이 중요합니다. 중요한 이메일을 잃어버리고 싶은 경우). 불균형 데이터 세트의 경우 F1-Score 및 AUC가 정확도보다 바람직합니다. 이상치가 있는 회귀의 경우 MAE가 MSE보다 낫습니다. 이해관계자들과 항상 논의한다. 어떤 유형의 오류가 가장 비용이 많이 드는지 이해하려면 도메인을 사용하세요.
핵심 사항
- 특히 불균형한 데이터 세트의 경우 정확성만으로는 충분하지 않습니다.
- 정밀도는 예측된 긍정의 정확성을 측정합니다. 회상은 완전성을 측정합니다.
- F1-Score는 조화 평균을 사용하여 정밀도와 재현율의 균형을 유지합니다.
- ROC-AUC는 임계값에 관계없이 분리 능력을 측정합니다.
- StratifiedKFold를 사용한 교차 검증은 평가의 표준입니다.
- 측정항목 선택은 도메인의 다양한 오류 유형에 대한 상대적 비용에 따라 달라집니다.







