Classifier & Metrics (ROC-AUC를 중점으로)

Joo·2023년 12월 29일

Deep Learning Keywords

목록 보기
3/5
post-thumbnail

Classifier & Metrics

AI모델이 발전하는 과정에서 일반적으로 처음으로 마주하는 테스크는 Classifier입니다. 그렇다면 분류기의 성능을 측정하는 방법과 그 방법들의 각각의 장단점을 알아보고자 합니다.

Accuracy(정확도)


Accuracy=올바른  예측  전체  예측  Accuracy = {올바른 \; 예측 \;수 \over 전체 \; 예측 \;수}

  • 가장 직관적인 평가지표라고 할 수 있습니다. 가장 간편한 지표입니다.
  • 문제점
    • Class Imbalance 문제
      : 클래스 간 데이터 수가 불균형할때 하나의 데이터로만 예측하는 모델도 성능이 좋다고 판단할 수 있습다.
    • 이상치에 민감
      : 정확도는 모든 예측을 동등하게 취급하기 때문에 데이터에 존재하는 이상치의 비율에 따라 실제 예상하는 정확도와 다를 수 있어. 안전한 Metric으로 보기 힘듭니다.

❓ 하나의 Class로 예측해서 99% 정확도를 가지는 모델(A)보다 여러 Class로 예측하지만 성능이 90%인 모델(B)이 있으면 A가 B보다 좋은게 아닌가요?

예를 들어 암이 있는 환자를 구분하는 모델을 만든다고 할때 99%가 정상환자의 데이터이고 1%가 암을 가진 환자라고 하면 A모델은 암을 가지고 있는 환자를 한명도 분류하지 못할 것입니다. 만약 B모델이 암을 가진 환자를 단 1명이라도 정확히 분류하면 A모델보다 가치가 큰 모델이라고 할 수 있습니다.


Precision & Recall & Specificity


Precision=True  Positives  True  Positives+False  PositivesPrecision={True \;Positives \over \;True \;Positives + False\; Positives }
Recall=True  PositivesTrue  Positives+False  NegativesRecall={True \;Positives \over True\; Positives + False\; Negatives}
Specificity=True  NegativesTrue  Negatives+False  PositivesSpecificity={True \;Negatives\over True\; Negatives + False \;Positives}

❓ False/True Negative/Positive가 먼가요?

예측을 4가지로 분류하여 예측한 값이 긍정인지 부정인지를 기준으로 Negative/ Positive를 구분합니다. 또한 해당 예측이 실제 값과 같으면 True 다르면 False로 구분할 수 있으며 이를 통해 모델의 예측을 4개로 분류하는 것입니다. 예를 들어 정상인 환자를 Positive라 할때 암 환자 분류기는 False Positive값을 줄이는 것이 가장 중요하다고 할 수있습니다.

Precision

  • Positive라 예측한 샘플 중 실제로 양성인 비율
  • False Positive를 줄이는 것에 중점을 둠

Recall (Positive ↔ Negative ⇒ Specificity)

  • 실제 Positive 샘플 중 모델이 양성으로 예측한 비율
  • False Negative를 줄이는 것에 중점을 둠

Specificity

  • 실제 음성 샘플 중 모델이 음성으로 예측한 비율.
  • False Positive를 줄이는 것에 중점을 둠

F1 Score


  • Precision과 Recall의 조화 평균입니다.

    F1  Score=2×Precision×RecallPrecision+RecallF1 \;Score={2×Precision×Recall \over Precision + Recall}
    • 직관적으로 F1 Score는 Precision과 Recall 둘 값이 모두 균형을 이뤄서 높은 값을 가질때 좋은 성능을 가짐을 알 수 있습니다.
    • FN & FP를 줄이고 싶을때 F1 Score를 사용할 수 있습니다.
    • 또한 Accuracy와 다르게 Precision과 Recall 중 더 작은 값에 Automatic하게 민감한 Metric로 동작할 수 있습니다.

  • 그렇다면 왜 조화평균은 두 값의 비율을 고려한다고 할 수 있을까?

    조화평균=n1x1+1x2++1xn=ni=1n1xi\text{조화평균} = \frac{n}{\frac{1}{x_1} + \frac{1}{x_2} + \ldots + \frac{1}{x_n}} = \frac{n}{\sum_{i=1}^{n} \frac{1}{x_i}}
    H=21a+1b=21a+r1a=2a1+r  where  a=rb  &  1rH ={2\over {1\over a} + {1\over b}} ={2\over {1\over a}+r{1\over a}}={2a\over 1+ r} \\\; \\where \; a = rb \; \& \; 1 \le r

    위와 같이 표현하면 조화 평균은 비율(r)이 1에 가까울 수록 a의 값이 클 수록 큰 값을 가짐을 확인하기 편합니다.


ROC-AUC


Receiver Operating Characteristic Curve - Area Under the Curve

TPR=Recall=True  PositivesTrue  Positives+False  NegativesTPR = Recall={True \;Positives \over True\; Positives + False\; Negatives}
FPR=False  PositivesTrue  Negatives+False  PositivesFPR={False \;Positives\over True\; Negatives + False \;Positives}

True Positives Rate(Y축)와 False Postivs Rate(X축)를 그린 그래프에서 커브의 아래쪽 면적을 의미합니다.

  • TPR : 모델이 Positive샘플들 중에서 맞춘 비율
  • FPR : 모델이 Negative샘플들 중에서 틀린 비율

  • 샘플 코드

    # 라이브러리 Import 
    from sklearn.datasets import make_classification
    from sklearn.linear_model import LogisticRegression
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import roc_curve, auc
    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_scores = model.predict_proba(X_test)[:, 1]
    
    # ROC Curve 계산
    fpr, tpr, thresholds = roc_curve(y_test, y_scores)
    roc_auc = auc(fpr, tpr)
    
    # ROC Curve 그리기
    plt.figure()
    plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
    plt.plot(fpr, thresholds, lw=2, label='thresholds')
    plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver Operating Characteristic Example')
    plt.legend(loc="lower right")
    plt.show()
  • ROC 그리는 방법

    • 테스트 데이터 셋을 모델의 입력으로 넣고 예측 확률을 계산합니다.
    • 이때 threshold값을 옮겨가며 TPR, FPR을 계산하고 이를 FPR의 오름차순으로 그래프를 그립니다.
  • 그래프 해석

    • threshold값이 작아지면 모델의 예측이 Positive로 편향되고 당연히 TPR/ FPR이 올라가게 됩니다.
  • 그래프 아래의 면적의 의미
    1. AUC = 1: 완벽한 분류입니다. 모델이 모든 양성 샘플과 음성 샘플을 완벽하게 구분합니다.

    2. **0.5 < AUC < 1**: 좋은 분류입니다. 값이 1에 가까울수록 모델의 성능이 더 좋다는 것을 의미합니다. 모델이 양성과 음성을 구분하는 데 있어서 일정 수준 이상의 성능을 보여줍니다.
    
    3. **AUC = 0.5**: 무작위 추측입니다. 모델의 성능이 무작위로 양성 또는 음성을 선택하는 것과 동일한 수준입니다. 즉, 모델이 유용한 예측을 제공하지 못한다는 것을 의미합니다.
    
    4. **AUC < 0.5**: 모델의 성능이 무작위 추측보다 나쁩니다. 이 경우 모델이 실제로 잘못된 예측을 하는 경향이 있음을 의미합니다.

  • ROC-AUC 직관적으로 이해하기
    이해를 돕기 위해서 label이 종류가 2개이며 feature의 종류가 1개인 총 6개의 데이터 샘플로 예시를 만들었습니다

    • theshold 값에 따라 TPR, FPR을 구하면 다음과 같습니다

      Threshold 0.5Threshold 1.5Threshold 2.5Threshold 3.5Threshold 4.5Threshold 5.5Threshold 6.5
      TPR1.001.001.000.670.670.330.00
      FPR1.000.670.330.330.000.000.00
    • threshold 값이 0.5일때는 모든 label을 postive라 예측하기 때문에 TPR, FPR이 1을 가집니다.

    • 점점 threshold가 커지면서 negative로 예측하는 경우가 생기고 이때 자연럽게 FPR과 TPR이 낮아집니다. 이때 Negative 샘플에 대한 오답률(FPR)을 낮추는 동시에 Positive 샘플의 정답률(TPR)을 가능한 크게 유지하는 모델이 좋은 모델이라 할 수 있습니다.

    • 위 조건에 가장 적합한 모델을 간단하게 판단하는 방법이 바로 ROC 커브의 아래 면적을 구하는 방법입니다.

  • 언제 사용하면 좋을까?

    1. 클래스 불균형이 있는 경우
      : 사기 탐지나 질병 진단과 같은 문제에서 양성 샘플(사기, 질병 양성)이 상대적으로 드물 경우, ROC-AUC는 모델이 어떻게 양성과 음성 샘플을 구분하는지 정확하게 평가하는 데 도움이 됩니다.

    2. 임계값의 변화에 강건한 성능 측정이 필요한 경우
      :특정 임계값에 대한 성능보다 모델의 전반적인 성능을 이해하고 싶을 때 유용합니다.

    3. 진단 검사와 같이 민감도와 특이도가 모두 중요한 경우
      : 의료 진단과 같은 상황에서는 양성 케이스를 놓치는 것(민감도)과 건강한 사람을 잘못 진단하는 것(특이도) 모두 중요합니다. ROC-AUC는 민감도(진짜 양성률)와 1-특이도(거짓 양성률) 사이의 관계를 종합적으로 평가합니다.

    4. 비교적 단순한 이진 분류 문제
      : ROC-AUC는 이진 분류 문제에서 가장 잘 작동합니다. 다중 클래스 분류 문제에서는 일반적으로 ROC-AUC를 각 클래스에 대해 별도로 계산하거나 다른 방법을 사용해야 합니다.

    그러나 모든 상황에서 ROC-AUC만을 사용하는 것은 권장되지 않습니다. 예를 들어, 거짓 양성과 거짓 음성 중 하나가 훨씬 더 큰 비용을 수반하는 경우, 또는 특정 임계값에서의 성능이 중요한 경우, ROC-AUC 외에 다른 성능 지표(예: 정밀도, 재현율, F1 점수)를 함께 고려해야 합니다.


어떤 값이 Positive여야 하는가? Labeling 문제


Positive와 Negative를 설정할 때는 주어진 문제와 목표에 따라 결정됩니다. 일반적으로 양성 클래스는 주요 관심이 있는 클래스이며, 음성 클래스는 그 외의 클래스입니다. 여러 요소를 고려하여 Positive와 Negative를 선택할 수 있습니다

  1. 비즈니스 목표 및 우선순위:
    분류 모델을 사용하는 목적에 따라 어떤 클래스를 양성으로 취급할지 결정할 수 있습니다. 어떤 클래스가 높은 우선순위를 가지는지 고려하고 해당 클래스를 양성으로 선택합니다.

  2. 클래스의 불균형성:
    데이터셋이 양성과 음성 클래스 간에 불균형이 있을 경우, 더 적은 수의 클래스를 양성으로 선택하는 것이 좋을 수 있습니다. 이렇게 하면 정확도가 높아지지만, 클래스 불균형으로 인한 문제를 고려해야 합니다.

  3. 비용과 이익:
    각각의 오류에 대한 비용이나 이익이 다를 수 있습니다. 양성과 음성의 오분류에 대한 비용을 고려하여 어떤 클래스를 양성으로 설정할지 결정할 수 있습니다.

  4. 도메인 지식:
    특정 도메인에서는 특정 클래스를 양성으로 설정하는 것이 더 의미 있을 수 있습니다. 도메인 전문가의 의견을 듣고 해당 클래스를 양성으로 선택할 수 있습니다.

  5. 모델 성능 관점:
    모델이 어떤 클래스를 양성으로 인식하는 것이 모델의 성능을 높이는 데 도움이 되는지 고려합니다. Precision, Recall, F1 Score 등의 metric을 통해 모델의 성능을 평가하고 적절한 클래스를 양성으로 설정할 수 있습니다.

글을 마치며

ROC-AUC와 F1 Score에 관련된 내용은 기술 면접에서 받았던 기억이 있다. 그당시 당황해서 ROC-AUC에 대해서 대답을 못하였고 사실 대답할 정도로 심도있게 이해하려 했던 경험이 없었던 것 같다.

profile
Don't let the AI snack on random internet bits...

0개의 댓글