1. 혼동 행렬이란? 🤔
혼동 행렬(Confusion Maxtrix)은 모델이 예측 값(Prediction)과 실제 값(Actual)을 비교하여 모델의 성능을 분석하는 표입니다.
특히, 이진 분류(Binary Classification) 또는 다중 클래스(Multi-Class) 분류 문제에서 모델이 데이터를 얼마나 잘 예측했는지 시각적으로 보여줍니다.
2. 혼동 행렬의 구조 🧩
혼동 행렬은 이진 분류 문제에서 다음과 같은 형태로 나타납니다.
True Positive (TP) 🔵
- 실제로 양성인 데이터(Positive)를 모델이 양성(Positive)으로 정확히 예측한 경우
- 예: 암 환자를 암으로 진단
False Negative (FN) 🔴
- 실제로 양성인 데이터(Positive)를 모델이 음성(Negative)으로 잘못 예측한 경우
- 예: 암 환자를 건강하다고 잘못 진단
False Positive (FP) 🔴
- 실제로 음성인 데이터(Negative)를 모델이 양성(Positive)으로 잘못 예측한 경우
- 예: 건강한 사람을 암 환자로 잘못 진단
True Negative (TN) 🔵
- 실제로 음성인 데이터(Negative)를 모델이 음성(Negative)으로 정확히 예측한 경우
- 예: 건강한 사람을 정확히 건강하다고 예측
3. 성능 지표 📊
1️⃣ 정확도(Accuracy)
모델이 전체 데이터에서 얼마나 많은 예측을 맞췄는지
$$\text{Accuracy} = \frac{\text{TP} + \text{TN} }{ \text{TP} + \text{TN} + \text{FP} + \text{FN}}$$
예시: 암 진단 모델에서
- TP: 암 환자를 암으로 진단 (정확히 맞춤)
- TN: 건강한 사람을 건강하다고 예측 (정확히 맞춤)
- FP: 건강한 사람을 암 환자로 잘못 진단
- FN: 암 환자를 건강하다고 잘못 진단
만약 TP = 50, TN = 30, FP = 10, FN = 10이라면 정확도는
$$\text{Accuracy} = \frac{50 + 30}{50 + 30 + 10 + 10} = \frac{80}{100} = 80\%$$
장점: 직관적이고 계산이 간단합니다.
단점: 데이터가 불균형할 경우 정확도는 실제 성능을 왜곡할 수 있습니다.
- 예: 모든 데이터를 한 쪽 클래스(A)로만 예측해도 정확도가 높게 나올 수 있습니다.
2️⃣ 정밀도 (Precision)
모델이 양성(Positive)으로 예측한 데이터 중에서 실제로 양성인 데이터의 비율
$$\text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}}$$
예시: 스팸 필터 모델에서
- TP: 스팸 이메일을 스팸으로 정확히 분류
- FP: 정상 이메일을 스팸으로 잘못 분류
만약 TP = 40, FP = 10이라면 정밀도는
$$\text{Precision} = \frac{40}{40 + 10} = 80\%$$
의미: 정밀도가 높다는 것은 모델이 양성으로 예측한 값이 신뢰할 만하다는 것을 의미합니다.
3️⃣ 재현율 (Recall)
실제 양성(Positive) 중에서 모델이 얼마나 많이 맞췄는지
$$\text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}}$$
예시: 암 진단 모델에서
- TP: 암 환자를 암으로 정확히 진단
- FN: 암 환자를 건강하다고 잘못 진단
만약 TP = 45, FN = 5라면 재현율은
$$\text{Recall} = \frac{45}{45 + 5} = 90\%$$
의미: 재현율이 높다는 것은 모델이 실제 양성을 놓치지 않는다는 것을 의미합니다.
4️⃣ F1 Score
정밀도와 재현율의 조화 평균(Harmonic Mean)을 계산하여 두 지표의 균형을 나타냄
$$\text{F}_1 = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$$
예시: 정밀도(Precision) = 80%이고 재현율(Recall) = 60%라면 F1 Score는
$$ \text{F}_1 = 2 \times \frac{0.8 \times0.6}{0.8 + 0.6} = 0.69(69\%)$$
의미: 정밀도와 재현율이 균형 있게 높을 때 F1 Score도 높습니다.
5️⃣ 특이도 (Specificity)
실제 음성(Negative) 중에서 모델이 음성으로 정확히 예측한 비율
$$\text{Specificity} = \frac{\text{TN}}{\text{TN} + \text{FP}}$$
예시: 보안 시스템에서
- TP: 침입 시도를 침입으로 정확히 탐지
- FP: 정상 활동을 침입으로 잘못 탐지
만약 TN = 85, FP = 15라면 특이도는
$$\text{Specificity} = \frac{85}{85 + 15} = 85\%$$
의미: 특이도가 높다는 것은 모델이 실제 음성을 놓치지 않고 정확히 예측한다는 것을 의미합니다.
4. 시각화 🎨
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
# 1. 임의의 데이터셋 생성
X, y = make_classification(n_samples=1000, n_features=20, 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)
# 2. 간단한 랜덤 포레스트 모델 학습
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
# 3. 예측값 생성
y_pred = model.predict(X_test)
# 4. 혼동 행렬 계산
cm = confusion_matrix(y_test, y_pred)
# 5. 혼동 행렬 시각화
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=["Class 0", "Class 1"])
disp.plot(cmap="Blues", values_format="d")
plt.title("Confusion Matrix")
plt.show()
1. 데이터 생성 및 모델 학습
- make_classification 으로 가상의 데이터를 생성합니다.
- RandomForestClassifier 로 간단한 분류 모델을 학습합니다.
2. 혼동 행렬 계산
- confusion_matrix 를 사용하여 예측 값(y_pred)과 실제 값(y_test)의 혼동 행렬을 생성합니다.
3. 시각화
- Confusion_matrixDisplay 를 사용해 혼동 행렬을 히트맵 형태로 시각화합니다.
- cmap="blues"로 파란색 계역의 색상을 설정하고, values_format="d"로 정수 형식으로 표시합니다.
- 정확도
$$\text{Accuracy} = \frac{\text{TP} + \text{TN} }{ \text{TP} + \text{TN} + \text{FP} + \text{FN}} = \frac{128 + 129}{128+129+16+27} = \frac{257}{300} = 85.67\%$$
- 정밀도
$$\text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} = \frac{128}{128+16} = 88.89\%$$
- 재현율
$$\text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}} = \frac{128}{128+27} = \frac{128}{155} = 82.58\%$$
- 특이도 (Class 0)
$$\text{Specificity} = \frac{\text{TN}}{\text{TN} + \text{FP}} = \frac{129}{129 + 16} = \frac{129}{145} = 89.03%$$
- F1 Score
$$\text{F}_1 = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} = 2 \times \frac{0.8889 \times 0.8258}{0.8889 + 0.8258} = 2 \times \frac{0.7337}{1.7147} = 85.42\%$$