분류 성능 지표(confusion matrix)

혜쿰·2023년 11월 19일
0
post-thumbnail

분류 성능 지표 중 하나인 혼동 행렬(Confusion Matrix)은 모델의 예측 결과를 실제 클래스와 비교하여 분류 모델의 성능을 평가하는 데 사용된다. 이는 이진 분류와 다중 클래스 분류에서 모두 적용된다.

1. 이진 분류의 혼동 행렬

예측 클래스 0 (Negative)예측 클래스 1 (Positive)
실제 클래스 0 (Negative)True Negative (TN)False Positive (FP)
실제 클래스 1 (Positive)False Negative (FN)True Positive (TP)
  • True Positive (TP): 모델이 클래스 1을 정확하게 예측한 샘플 수 (정답)
  • True Negative (TN): 모델이 클래스 0을 정확하게 예측한 샘플 수 (정답)
  • False Positive (FP): 모델이 클래스 0인데 클래스 1로 잘못 예측한 샘플 수 (오답)
  • False Negative (FN): 모델이 클래스 1인데 클래스 0으로 잘못 예측한 샘플 수 (오답)

1-1) Accuracy (정확도)

정확도(Accuracy)란, 전체 샘플 중 올바르게 분류된 샘플의 비율로, 다음과 같이 계산된다.

Accuracy=TP+TNTP+TN+FP+FN(전체)Accuracy = {{TP + TN}\over{TP+TN+FP+FN(전체)}}

1-2) 정밀도(Precision)

정밀도(Precision)란, 모델이 양성이라고 분류한 경우 중 실제로 양성인 비율로, 다음과 같이 계산된다.

Precision=TPTP+FPPrecision = {{TP}\over{TP+FP}}

양성으로 예측한 것 중 실제로 양성인 경우를 정밀하게 측정하는 지표이다.

1-3) 재현율(Recall)

재현율(Recall) 은 또는 민감도(Sensitivity) 또는 참 긍정 비율(True Positive Rate)이라고도 불리며, 실제 양성 중 모델이 양성으로 예측한 비율이다. 재현율은 다음과 같이 계산된다.

Recall=TPTP+FNRecall = {TP\over{TP+FN}}

실제로 양성인 경우 중 모델이 양성으로 정확하게 예측한 비율을 측정한다.

정밀도와 재현율은 서로 상충 관계에 있다. 정밀도를 높이면 재현율이 낮아지고, 재현율을 높이면 정밀도가 낮아질 수 있다. 모델의 목적과 상황에 맞게 이 두 지표를 적절하게 평가해야 한다.

TPR 과 FPR

재현율은 TPR이라고도 하고, FPR은 1-TPR이다. 이것은 ROC 곡선에서 쓰이기 때문에 짚고 넘어가야한다. 밑에서 ROC 곡선에 대해서 자세이 알아보겠다.

1-4) Specificity(특이도)

Specificity(특이도)란, 음성 클래스를 정확하게 예측한 비율로, 다음과 같이 계산된다.

Specificity=TNTN+FPSpecificity = {TN\over{TN+FP}}

1-5) F1-Score

F1-Score란, 정밀도와 재현율의 조화 평균으로, 정밀도와 재현율이 모두 높을수록 높은 값을 가진다. 이는 불균형한 클래스 분포에서 모델의 성능을 평가하는 좋은 지표이다.

F1Score=2×Precision×RecallPrecision+RecallF1Score = 2 × {{Precision×Recall}\over{Precision+Recall}}

1-6) Kappa 통계량(Cohen's Kappa)

Kappa 통계량(Cohen's Kappa)이란, 모델의 예측 정확도를 무작위 예측에 대한 예측 정확도와 비교하여 측정한다. 이는 무작위 예측에 대한 예측 정확도를 뺀 후 무작위 예측의 가능한 정확도 중 예측한 정확도의 비율을 나타내는 지표이다.

Kappa=ObservedAccuracyExpectedAccuracy1ExpectedAccuracyKappa = {{Observed Accuracy−Expected Accuracy}\over{1-Expected Accuracy}}

Kappa 통계량은 -1에서 1 사이의 값을 가지며, 1에 가까울수록 모델의 예측이 완벽에 가깝다고 해석된다. 0에 가까울수록 모델의 예측이 무작위 예측과 유사하다고 할 수 있다. Kappa 통계량은 주로 불균형한 클래스 또는 라벨이 있는 분류 모델의 성능을 평가하는 데 사용된다.




혼동 행렬을 통해 이러한 지표들을 분석하고 모델의 성능을 평가함으로써, 모델의 예측이 얼마나 정확한지, 특히 양성 및 음성 클래스에 대한 예측이 어떻게 되는지를 확인할 수 있다.

🔎 코드 예제

아래의 예제 코드는 sklearn 라이브러리를 사용하여 모델의 정확도, 정밀도, 재현율, 특이도, F1 Score, Kappa 통계량을 구하는 방법을 보여준다. 코드에서는 가상의 분류 모델을 사용하여 이진 분류를 수행하고, classification_report 함수를 사용하여 주요 통계량을 계산한다.

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

# 가상의 분류 데이터 생성
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.2, random_state=42)

# 로지스틱 회귀 모델 훈련
model = LogisticRegression()
model.fit(X_train, y_train)

# 모델 예측
y_pred = model.predict(X_test)

# 분류 보고서 생성
report = classification_report(y_test, y_pred)
print(report)

위 코드는 가상의 분류 데이터를 생성하고, 로지스틱 회귀 모델을 사용하여 이진 분류를 수행한다. 그런 다음 classification_report 함수를 사용하여 실제값과 예측값 사이의 주요 분류 지표를 출력힌다.

  1. make_classification을 사용하여 더미 데이터를 생성한다.
  2. train_test_split을 사용하여 데이터를 훈련 및 테스트 세트로 나눈다.
  3. LogisticRegression을 사용하여 모델을 초기화하고 훈련한다.
  4. predict 함수를 사용하여 테스트 데이터에 대한 예측값을 생성한다.
  5. classification_report 함수를 사용하여 정밀도, 재현율, F1 점수 등의 주요 분류 지표를 출력한다. 출력은 다음 사진과 같다.


참고) 다중 클래스 분류의 혼동 행렬

다중 클래스 분류의 경우, 혼동 행렬은 각 클래스 간의 예측 결과를 나타내는 정방 행렬이다.

예를 들어, 3개의 클래스(A, B, C)가 있다고 가정하면,

예측 클래스 A예측 클래스 B예측 클래스 C
실제 클래스 AA를 A로 예측한 수 (True A, True Negative for B and C)A를 B로 잘못 예측한 수 (False Positive for B)A를 C로 잘못 예측한 수 (False Positive for C)
실제 클래스 BB를 A로 잘못 예측한 수 (False Negative for A)B를 B로 예측한 수 (True B, True Negative for A and C)B를 C로 잘못 예측한 수 (False Positive for C)
실제 클래스 CC를 A로 잘못 예측한 수 (False Negative for A)C를 B로 잘못 예측한 수 (False Negative for B)C를 C로 예측한 수 (True C, True Negative for A and B)

혼동 행렬을 통해 모델이 어떻게 예측했는지를 파악할 수 있으며, 이를 통해 정확도, 정밀도, 재현율 등의 다양한 성능 지표를 계산할 수 있다.



2. ROC curve

ROC(Receiver Operating Characteristic) 곡선이란, 이진 분류 모델의 성능을 시각적으로 평가하는 데 사용되는 그래픽 표현이다. 이 곡선은 민감도(재현율)에 대한 1 - 특이도 그래프이다.

ROC 곡선은 다양한 분류 임계값에서 분류 모델의 성능을 보여준다. 분류 모델은 이진 분류를 수행하므로, 특정 임계값에서는 민감도와 특이도가 서로 다를 수 있다. ROC 곡선은 이러한 민감도와 특이도 사이의 관계를 보여준다.

ROC 곡선이 x축에는 거짓 양성 비율(False Positive Rate, FPR), y축에는 참 양성 비율(True Positive Rate, TPR, 또는 재현율)을 나타낸다.

  • 참 양성 비율(TPR)은 실제 참인 케이스 중에서 모델이 참으로 예측한 비율을 의미한다. 위에서 언급한 재현율과 같다.
    TPR=TPTP+FNTPR = {TP\over{TP+FN}}
  • 거짓 양성 비율(FPR)은 실제 거짓인 케이스 중에서 모델이 참으로 잘못 예측한 비율을 의미한다.
    FPR=FPFP+TN=1TPRFPR = {FP\over{FP+TN}} = {1-TPR}

ROC 곡선은 왼쪽 위 모서리로 갈수록 성능이 좋다고 평가된다. 왼쪽 위에 가까울수록 모델이 높은 TPR(재현율)을 유지하면서 낮은 FPR(거짓 양성 비율)을 갖는 것을 의미한다.

2-1) AUC

AUC란, ROC 곡선 아래의 면적을 측정하여 모델의 분류 성능을 요약하는 역할을 하는 수치이다. AUC 값은 0에서 1 사이의 값을 가지며, 일반적으로 1에 가까울수록 모델의 성능이 좋다고 판단된다.

AUC가 1에 가까울수록 모델은 완벽하게 분류하는 경우에 가깝다.
AUC가 0.5에 가까울수록 모델의 분류 성능이 랜덤 수준에 가깝다 (진짜 양성과 거짓 양성의 비율이 비슷).
일반적으로, AUC가 0.5보다 크면 모델은 어떤 양성 샘플이 음성 샘플보다 더 높은 점수를 받을 확률이 더 높다.

🔎 코드 예시

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt

# 예제 데이터 생성
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.2, random_state=42)

# 로지스틱 회귀 모델 훈련
model = LogisticRegression()
model.fit(X_train, y_train)

# 예측 확률 계산
y_probs = model.predict_proba(X_test)[:, 1]

# ROC 곡선 계산
fpr, tpr, thresholds = roc_curve(y_test, y_probs)

# AUC 계산
auc = roc_auc_score(y_test, y_probs)
print(f"AUC: {auc}")

# ROC 곡선 그리기
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, label=f'AUC = {auc:.2f}')
plt.plot([0, 1], [0, 1], linestyle='--', color='r', label='Random Guess')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend()
plt.show()

이 코드는 make_classification 함수를 사용하여 가상의 분류 데이터를 생성하고, 로지스틱 회귀 모델을 사용하여 이진 분류를 수행한다. 그런 다음 roc_curve 함수를 사용하여 ROC 곡선의 FPR 및 TPR을 계산하고, roc_auc_score 함수를 사용하여 AUC 값을 계산한다. 최종적으로 matplotlib을 사용하여 ROC 곡선을 그린다.


데이터의 양이 적어서 완전한 곡선은 아니지만 ROC curve는 대게 이런 형태이다.

💡 모델 작성 순서

init Model -> train Model -> score Model -> Evaluate Model
모델 작성 순서에는 모델 작성과 훈련, 평가를 다음과 같은 순서로 진행하는 것이 일반적이다.

  1. Initialize Model: 모델을 초기화하고 필요한 모든 매개변수를 설정한다. 이 단계에서는 모델의 구조를 정의하거나 모델 객체를 생성하는 단계이다.

  2. Train Model: 초기화된 모델을 훈련 데이터에 맞추기 위해 훈련시킨다. 이 단계에서 모델은 주어진 데이터에 맞게 가중치를 조정하고 손실을 최소화하려고 한다.

  3. Score Model: 훈련된 모델을 사용하여 테스트 데이터나 새로운 데이터에 대한 예측을 수행한다. 이 단계에서 모델이 얼마나 좋은 성능을 보이는지를 확인하는 데 사용된다.

  4. Evaluate Model: 모델의 성능을 평가하고 다양한 지표(예: 정확도, 정밀도, 재현율 등)를 사용하여 모델의 예측을 평가한다. 이 단계에서는 모델의 강점과 약점을 파악하고 개선할 수 있는 방향을 결정할 수 있다.

이러한 단계는 일반적으로 기계 학습 및 딥 러닝 모델 작성에서 사용되는 일반적인 프로세스이다. 하지만 상황에 따라 모델링 과정에 추가 단계가 있을 수 있다.
오늘 배운 분류 성능 지표, ROC 곡선, AUC 는 Evaluate Model단계에서 쓰인다.







roc 이미지 출처

0개의 댓글

관련 채용 정보