여러가지공부/머신러닝(Machine Learning)

Classification 모델 성능 검증: Accuracy, Precision/Recall, ROC-AUC(예제 실습, 파이썬)

끄적끄적아무거나 2023. 4. 3. 08:34
반응형

 

목차

     

     

     

     

     

    Classification 모델 성능 검증: Accuracy

     

     

     

    머신러닝에서 Accuracy, Precision/Recall, ROC-AUC는 분류 문제의 성능을 평가하는 지표들입니다. 이러한 지표들은 모델의 예측 결과를 실제값과 비교하여 얼마나 잘 예측하는지 측정합니다.

     

     

     

    Accuracy (정확도)란 전체 데이터 중에서 모델이 올바르게 분류한 데이터의 비율입니다. 정확도는 가장 직관적인 지표이지만, 클래스 간 데이터의 분포가 불균형할 경우 잘못된 성능 평가를 할 수 있습니다.

     

    간단히 말해 실제 데이터 수에서 바르게 예측한 비율입니다.

     

    정확도 = (올바르게 분류된 데이터 수) / (전체 데이터 수)

     

    Accuracy 예제

     

    Accuracy를 이해하기 위한 간단한 예제를 드리겠습니다. 이진 분류 문제를 가정해 보겠습니다. 모델이 고양이와 강아지의 이미지를 분류한다고 가정하고, 아래와 같은 예측 결과를 얻었다고 가정해 봅시다.

     

    • 실제 레이블: 고양이, 강아지, 고양이, 고양이, 강아지
    • 모델 예측: 고양이, 강아지, 강아지, 고양이, 강아지


    이 경우 정확도를 계산하기 위해 올바르게 분류된 데이터 수를 전체 데이터 수로 나눕니다. 여기서는 4개의 이미지가 올바르게 분류되었으므로 정확도는 다음과 같이 계산됩니다.

     

    • 정확도 = (올바르게 분류된 데이터 수) / (전체 데이터 수) = 4 / 5 = 0.8 (80%)

     

    이 예제에서 모델의 정확도는 80%입니다. 이는 모델이 전체 이미지 중 80%를 올바르게 분류했다는 것을 의미합니다. 이처럼 정확도는 간단하고 직관적으로 이해하기 쉬운 성능 지표입니다. 하지만 클래스 간 데이터의 분포가 불균형할 경우, 정확도만으로는 모델의 성능을 완전히 평가하기 어려울 수 있습니다. 이럴 때는 정밀도, 재현율, ROC-AUC 등 다른 평가 지표를 함께 사용하는 것이 좋습니다.

     

     

     

     

    Classification 모델 성능 검증: Precision/Recall

     

    정밀도(Precision)는 모델이 Positive로 예측한 데이터 중에서 실제로 Positive인 데이터의 비율입니다. 

    재현율(Recall)은 실제 Positive인 데이터 중에서 모델이 Positive로 예측한 데이터의 비율입니다.

     

    이 두 지표는 서로 trade-off 관계에 있어, 한쪽이 높아지면 다른 쪽이 낮아지는 경향이 있습니다. 정밀도와 재현율은 클래스 간 데이터의 분포가 불균형한 경우에도 성능을 잘 평가할 수 있습니다.

     

    • 정밀도 = (True Positive) / (True Positive + False Positive)
    • 재현율 = (True Positive) / (True Positive + False Negative)

     

    여기서 True/False는 예측이 맞는지 아닌지입니다. Positive/Negative 는 예측한 클래스입니다.

     

    간단히 말하면 정밀도는 찾을려는 클래스 예측 데이터 중에 실제 맞춘 비율이고 재현율은 실제 찾을려는 클래스 데이터 중에 맞춘비율입니다. 

     

    Precision/Recall 예제

     

    이메일 스팸 필터를 머신러닝으로 구현한 경우를 가정합니다. 스팸 필터는 각 이메일을 스팸(Spam) 또는 정상 메일로 분류합니다.

    다음과 같은 결과가 나왔다고 가정해봅시다:

     

    • True Positive (TP): 100개 (실제 스팸인데 스팸으로 예측한 경우)
    • False Positive (FP): 30개 (실제 정상 메일인데 스팸으로 예측한 경우)
    • True Negative (TN): 850개 (실제 정상 메일인데 정상 메일로 예측한 경우)
    • False Negative (FN): 20개 (실제 스팸인데 정상 메일로 예측한 경우)
    • Positive = TP + FN : 120개 (실제 스탬인 경우)
    • Negative = FP + TN : 880개 (실제 정상 메일인 경우)

     

     

    이때 Precision과 Recall은 다음과 같이 계산됩니다:

     

    • Precision = TP / (TP + FP) = 100 / (100 + 30) = 100 / 130 ≈ 0.77
    • Recall = TP / (TP + FN) = 100 / (100 + 20) = 100 / 120 ≈ 0.83


    이 예제에서 정밀도(Precision)는 약 0.77로, 스팸으로 예측된 메일 중 실제로 스팸인 메일의 비율이 77%임을 나타냅니다. 재현율(Recall)은 약 0.83로, 실제 스팸 메일 중 스팸으로 성공적으로 분류된 메일의 비율이 83%임을 나타냅니다.


    스팸 필터의 경우 정밀도가 낮으면 정상 메일을 스팸으로 분류하는 경우가 많아 사용자가 중요한 메일을 놓칠 수 있습니다. 반면, 재현율이 낮으면 스팸 메일을 정상 메일로 분류하는 경우가 많아 스팸 메일이 사용자의 메일함에 계속 노출될 수 있습니다. 따라서 스팸 필터의 성능을 평가할 때는 정밀도와 재현율을 함께 고려하는 것이 중요합니다.

     

     

     

     

     

     

    Classification 모델 성능 검증: ROC-AUC

     

     

    ROC-AUC (Receiver Operating Characteristic - Area Under the Curve)에서  ROC는 재현율과 특이도(False Positive Rate) 간의 관계를 그래프로 나타낸 것입니다.

    AUC는 ROC 곡선 아래의 면적을 의미하며, 값이 1에 가까울수록 모델의 성능이 좋다고 평가할 수 있습니다. ROC-AUC는 여러 임계값(threshold)에 대한 모델의 성능을 종합적으로 평가하는 지표로, 불균형한 데이터셋에서도 성능 평가에 적합합니다.

     

     

    AUC는 간단하게 말하자면 찾을려는 클래스를 실제로 맞게 예측한 비율(TPR)이 1이고 찾지 않는 클래스의 예측이 틀리는 경우의 비율이(FPR) 0인 경우 최상의 결과 인 것이다.

     

     

    ROC-AUC예제

     

    • True Positive (TP): 100개 (실제 스팸인데 스팸으로 예측한 경우)
    • False Positive (FP): 30개 (실제 정상 메일인데 스팸으로 예측한 경우)
    • True Negative (TN): 850개 (실제 정상 메일인데 정상 메일로 예측한 경우)
    • False Negative (FN): 20개 (실제 스팸인데 정상 메일로 예측한 경우)
    • Positive = TP + FN : 120개 (실제 스탬인 경우)
    • Negative = FP + TN : 880개 (실제 정상 메일인 경우)

     

    FPR = 30/880 = 0.034

    TPR = 100/120 = 0.833

     

     

    위 경우에 대한 ROC-AUC 파이썬 코드로 확인해보겠습니다. 

     

    예제 코드>>

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.metrics import roc_curve, roc_auc_score
    
    # 주어진 TP, FP, TN, FN 값
    TP = 100
    FP = 30
    TN = 850
    FN = 20
    
    # 예측 확률과 실제 레이블 생성
    y_probs = np.concatenate([np.ones(TP), np.zeros(FP), np.zeros(TN), np.ones(FN)])
    y_true = np.concatenate([np.ones(TP + FN), np.zeros(FP + TN)])
    
    # ROC-AUC 계산 및 곡선 생성
    fpr, tpr, _ = roc_curve(y_true, y_probs)
    roc_auc = roc_auc_score(y_true, y_probs)
    
    # ROC 곡선 그리기
    plt.plot(fpr, tpr, label=f"ROC-AUC: {roc_auc:.3f}")
    plt.plot([0, 1], [0, 1], linestyle='--', color='r', label="Random Classifier")
    plt.xlabel("False Positive Rate")
    plt.ylabel("True Positive Rate")
    plt.title("ROC-AUC Curve")
    plt.legend()
    plt.show()

     

     

    결과>>

     

     

     

     

     

     

     

     

     

    반응형