11 분 소요

Accuracy, Confusion Matrix, Precision, Recall, F1 Score, ROC-AUC


안녕하세요. 데이터 사이언티스트를 위한 정보를 공유하고 있습니다.

M1 Macbook Air를 사용하고 있으며, 블로그의 모든 글은 Mac을 기준으로 작성된 점 참고해주세요.


분류 성능 평가 지표(Evaluation Metric)

성능 평가 지표는 분류냐 회귀냐에 따라 여러 종류로 나뉩니다.

그중 다양한 분류 평가 지표에 대해 알아보겠습니다.

정확도(Accuracy) 외에 혼동행렬(ConfusionMatrix), 정밀도(Precision), 재현율(Recall), F1-score, ROC-AUC 등의 평가 지표가 있으며,

이 지표들은 특히나 이진 분류에서 더욱 중요하게 강조되는 지표입니다.


정확도(Accuracy)

정확도는 전체 데이터에 대해서 얼마나 정확하게 예측했는지 나타내는 지표입니다.

따라서 정확도는 다음과 같이 나타낼 수 있습니다.

정확도(Accuracy) = 예측 성공한 데이터 수 / 전체 데이터 수

정확도가 어떻게 반환되는지 타이타닉 예제로 살펴보겠습니다.

In:

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

import pandas as pd

titanic_df = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/titanic_train.csv")
# 캐글의 타이타닉 데이터 불러오기
titanic_df.drop(["PassengerId", "Name", "Ticket", "Cabin"], axis = 1, inplace = True)
# 생존 여부와 관련없다고 판단한 칼럼 제거

mean_Age = titanic_df["Age"].mean()
titanic_df["Age"].fillna(mean_Age, inplace = True)
titanic_df.dropna(inplace = True)
# 'Age' 피처만 전체 평균값으로 결측치를 채워주고, 나머지 결측치는 제거

titanic_df.reset_index(drop = True, inplace = True)

titanic_feature = titanic_df.drop("Survived", axis = 1)
titanic_target = titanic_df["Survived"]
# 피처 데이터와 타겟 데이터로 분리

titanic_feature = pd.get_dummies(titanic_feature)
# One-Hot encoding 진행

scaler = MinMaxScaler()
titanic_feature = pd.DataFrame(scaler.fit_transform(titanic_feature))
# 피처 전체를 MinMaxScaler로 스케일링

titanic_feature.head()

Out:

0 1 2 3 4 5 6 7 8 9
0 1.0 0.271174 0.125 0.0 0.014151 0.0 1.0 0.0 0.0 1.0
1 0.0 0.472229 0.125 0.0 0.139136 1.0 0.0 1.0 0.0 0.0
2 1.0 0.321438 0.000 0.0 0.015469 1.0 0.0 0.0 0.0 1.0
3 0.0 0.434531 0.125 0.0 0.103644 1.0 0.0 0.0 0.0 1.0
4 1.0 0.434531 0.000 0.0 0.015713 0.0 1.0 0.0 0.0 1.0

In:

X_train, X_test, y_train, y_test = train_test_split(titanic_feature, titanic_target,
                                                    test_size = 0.2, random_state = 5)

rf = RandomForestClassifier(random_state = 4)
# RandomForest 분류기를 rf라는 이름으로 생성
rf.fit(X_train, y_train)
y_pred = rf.predict(X_test)

accuracy_score(y_test, y_pred)

Out:

0.8370786516853933

약 83.7%의 예측 정확도를 확인하였습니다.

‘정확도’라고 하면 직관적으로는 모델의 성능을 굉장히 잘 검증하는 지표인 것처럼 느껴지는데

항상 그렇지는 않습니다.

예를 들어 날마다 눈이 오는지 안오는지 예측하는 모델이 있는데

이 모델이 매일 눈이 오지 않는다고만 예측을 한다고 가정해 봅시다.

그렇다면 실제로 눈이 오지 않는 날이 더 많기 때문에 모델의 예측 정확도는 높게 나올 것입니다.

하지만 눈이 오는 날은 단 한번도 맞추지 못하는 모델이겠죠?

모델의 예측 정확도만으로 과연 이 모델의 성능이 좋다고 말할 수 있을까요?

또 다른 예시를 들어 보겠습니다.

1000명의 사람 중에서 990명은 정상, 10명이 코로나 확진 환자입니다.

코로나 양성인지 음성인지 판별하는 모델이 있는데 이 모델이 무조건 음성으로 예측한다고 가정해 봅시다.

1000명을 정상인으로 판별하게 된다면, 이 모델은 1000개의 데이터 중에 990개의 데이터를 정확하게 예측한 모델인 것입니다.

그렇다면 정확도는 99%이겠죠.

이 정확도가 모델의 성능을 대변할 수 있는 지표일까요?

실제로 이런 상황이라면 코로나 환자를 양성으로 예측하는 모델이 더 가치있을 것입니다.

이처럼 상황에 따라 더 유의해야 할 지표가 있는 것이고,

여러 지표들에 대해 더 알아보도록 하겠습니다.


혼동행렬(Confusion Matrix)

위의 예제를 바탕으로 혼동행렬만 반환하여 보겠습니다.

In:

from sklearn.metrics import confusion_matrix

confusion_matrix(y_test, y_pred)

Out:

array([[107,  12],
       [ 17,  42]])

4개의 숫자가 배열로 반환된 모습인데 각각이 의미하는 바가 무엇인지에 대해 다음 혼동행렬 그림을 보며 설명하겠습니다.

confusionmatrix

가로축은 어떻게 예측했는지 분류되어 있고, 세로축은 실제 데이터가 분류되어 있습니다.

코드 예제에 따르면 생존 여부에 따라 0(no), 1(yes)로 분류가 되는데

가로축은 모델이 예측한 생존 여부, 세로축은 실제 생존 여부를 기준으로 분류되어 있는 것입니다.

그리고 하위항목으로 0을 Negative(음성), 1을 Positive(양성)라고 명시했는데

이진 분류에서 데이터가 만약 불균형하다면 일반적으로 데이터가 작은 클래스가 Positive로 지정됩니다.

In:

y_test.value_counts()

Out:

0    119
1     59
Name: Survived, dtype: int64

따라서 위 코드에서 확인할 수 있듯이

예제에서는 상대적으로 수가 적은, 생존한 사람들의 데이터가 Positive(1)로,

생존 못한 사람들의 데이터가 Negative(0)로 지정되겠죠.

4분면 각각에 들어가는 숫자의 의미에 대해 정리해 보겠습니다.

  • TN(True Negative): “Negative라고 예측한 것이 True”, 실제로 Negative인 데이터를 모델이 Negative라고 예측 성공(True)한 개수
  • FP(False Potive): “Positivie라고 예측한 것이 False”, 실제로 Negative인 데이터를 모델이 Positive라고 예측 실패(False)한 개수
  • FN(False Negative): “Negative라고 예측한 것이 False”, 실제로 Positive인 데이터를 모델이 Negative라고 예측 실패(False)한 개수
  • TP(True Positive): “Positive라고 예측한 것이 True”, 실제로 Positive인 데이터를 모델이 Positive라고 예측 성공(True)한 개수

타이타닉 예제에서 반환된 혼동행렬의 경우,

TN = 107, FP = 12, FN = 17, TP = 42 입니다.

앞에서 확인한 정확도(Accuracy)는 (예측 성공한 데이터 수 / 전체 데이터 수)로 계산된다고 하였는데

혼동행렬의 지표에 따르면

정확도(Accuracy) = (TN + TP) / (TN + FP + FN + TP)

로 나타나게 됩니다.

이외에도 앞으로 다루게 될 지표들은 혼동행렬의 4분면 값을 기반으로 계산될 것입니다.


정밀도(Precision)와 재현율(Recall)

정밀도와 재현율은 Positive 예측 성능에 초점을 둔 평가 지표입니다.

정밀도는 Positive로 예측한 데이터 중에 실제로 Positive인 데이터의 비율을 의미하며, 수식은 다음과 같습니다.

정밀도(Precision) = TP / (TP + FP)

재현율은 실제 Positive 데이터 중에서 Positive로 정확하게 예측한 데이터의 비율을 의미하며,

민감도(Sensitivity) 또는 TPR(True Positive Rate)라고도 불립니다.

수식은 다음과 같습니다.

재현율(Recall) = TP / (TP + FN)

위의 두 수식에서 확인할 수 있듯이

두 지표 모두 TP를 높이는 데 주안점을 두면서도

각각 정밀도는 FP를 낮추는 데, 재현율은 FN을 낮추는 데 초점을 두게 됩니다.

이러한 이유로 서로 보완적인 지표로 많이 사용됩니다.


두 지표는 모델의 목적에 따라 중요도가 상이합니다.

일반적으로 재현율이 중요한 경우가 더 많은데

위에서 이야기했던 코로나 검사 모델의 경우에도 재현율이 중요한 지표가 됩니다.

990명의 음성인 사람과 10명의 양성인 사람이 있을 때,

1000명 모두 음성으로 분류하는 모델이 있다고 가정했습니다.

이때 실제 코로나 양성인 사람 10명 중 모델이 정확하게 예측한 성공한 사람은 0명입니다.

즉 재현율은 0(0 / 0 + 10)일 것입니다.

이 모델의 목적은 양성 환자를 잘 예측하는 것일 텐데 그것을 잘 대표하는 지표 중 하나가 바로 재현율인 것입니다.

따라서 재현율은 “Positive를 얼마나 놓치지 않고 잘 예측하냐”를 의미한다고 받아들이시면 좋습니다.

금융 사기 탐지 모델, 암 환자 판별 모델 등의 경우(사기, 암 양성 -> Positive)

각각 사기, 암 양성 환자를 놓치지 않고 잘 예측해야 하므로 재현율 지표를 유의있게 봐야하겠죠?

한편 스팸 메일을 판단하는 모델의 경우(스팸 메일 -> Positive)에는 정밀도가 더 중요할 수 있습니다.

정상 메일에 스팸 메일이 포함되어 있는 경우 우리는 불편함을 겪기는 하지만 업무의 문제가 생기지는 않습니다.

하지만 정상 메일을 스팸 메일로 잘못 분류한다면 업무에 차질이 생기겠죠.

각각의 지표가 중요한 경우를 다시 정리하면,

“Positive를 Negative로 잘못 판단했을 때의 문제가 더 클 때, 재현율이 더 중요하고,

Negative를 Positive로 잘못 판단했을 때의 문제가 더 클 때, 정밀도가 더 중요합니다.”

물론 두 지표 모두 높을수록 성능이 좋다고 평가할 수 있고,

두 지표가 차이가 극심한 경우는 바람직하지 않습니다.

In:

from sklearn.metrics import recall_score, precision_score

print(f"재현율: {recall_score(y_test, y_pred):.4f}")
print(f"정밀도: {precision_score(y_test, y_pred):.4f}")

Out:

재현율: 0.7119
정밀도: 0.7778

타이타닉 예제의 모델의 재현율과 정밀도를 반환한 것인데

재현율은 약 0.7119, 정밀도는 약 0.7778로 두 지표가 크게 차이가 나지않는 모습입니다.


정밀도와 재현율 조정

임계값(Treshold)을 조정함으로써 정밀도와 재현율은 그 수치를 조절할 수 있습니다.

다만 두 지표는 상호 보완적인 관계이기 때문에

임계값을 조정하는 방법으로 어느 한쪽의 수치를 높이면, 다른 한쪽의 수치는 낮아질 가능성이 큽니다.

이를 정밀도와 재현율이 ‘트레이드오프(Trade-off) 관계에 있다’라고 표현합니다.

두 지표 간 트레이드오프의 의미를 ‘모델의 정밀도가 높으면 재현율은 낮다’라고 오해하시면 안됩니다.

임계점을 조정하여 강제로 모델의 정밀도를 높이는 경우 재현율은 낮아지기 쉽다는 의미입니다.

그렇다면 이 임계점이라는 것은 무엇일까요?

사이킷런의 분류 모델들은 특정 데이터가 어떠한 레이블에 속하는지 예측할 때 먼저 확률을 계산하고,

그 확률에 따라 분류 결과를 예측합니다.

이진 분류의 경우 Positive일 확률을 계산한다면

모델은 특정 데이터가 0.5보다 크면 Positive, 0.5보다 작으면 Negative라고 예측 결과를 반환하는 것입니다.

이때의 0.5가 바로 임계점입니다.

우리는 이 임계점을 조정할 수 있고, 그럼으로써 재현율과 정밀도를 컨트롤할 수 있는 것입니다.


먼저 모델이 확률을 먼저 구하고, 확률에 따라 분류하는 것을 직접 확인해 보겠습니다.

학습(fit)을 한 사이킷런의 모델들은 predict()라는 메소드로 예측을 합니다.

또한 predict_proba()라는 메소드도 있어서 이를 호출하면

데이터 각각의 Positive일 확률과 Negative일 확률을 결과값으로 반환합니다.

In:

y_pred_probability = pd.DataFrame(rf.predict_proba(X_test))
# 예측 확률
y_pred = pd.DataFrame(rf.predict(X_test))
# 실제 예측값

prediction = pd.concat([y_pred_probability, y_pred], axis = 1)
# 비교를 위해 병합

prediction.columns = ["Negative(0)", "Positive(1)", "y_pred"]
prediction

Out:

Negative(0) Positive(1) y_pred
0 1.0000 0.0000 0
1 0.5100 0.4900 0
2 0.4800 0.5200 1
3 0.9800 0.0200 0
4 0.9500 0.0500 0
... ... ... ...
173 0.8300 0.1700 0
174 1.0000 0.0000 0
175 0.8779 0.1221 0
176 0.8600 0.1400 0
177 0.9100 0.0900 0

178 rows × 3 columns

타이타닉 예제의 예측 확률과 예측 결과값을 한번에 반환하였습니다.

‘Negative(0)’는 데이터가 Negative(0)일 확률,

‘Positive(1)’는 데이터가 Positive(1)일 확률,

‘y_pred’는 확률을 토대로 모델이 예측한 값을 의미합니다.

보시다시피 ‘Negative(0)’의 관점에서는 0.5보다 크면 0, 0.5보다 작으면 1을 예측 결과값으로,

‘Positive(1)’의 관점에서는 0.5보다 크면 1, 0.5보다 작으면 0을 예측 결과값으로 반환한 것을 확인할 수 있습니다.


이번에는 임계값을 바꾸는 작업을 할 텐데요.

이를 위해 사이킷런의 Binarizer라는 클래스를 활용할 것입니다.

임계치(treshold) 파라미터를 넣은 Binarizer 객체를 만들고,

이 객체의 fit_transform() 메소드를 넘파이 ndarray에 적용하면

ndarray의 값들을 임계치보다 크면 1로, 임계치보다 작으면 0으로 변환합니다.

위의 타이타닉 예제에서 predict_proba로 부터 얻은 예측 확률 중(Negative(0), Positive(1))

Positive(1)에 해당되는 확률값을 기준으로 적용해보도록 하겠습니다.

임계점은 사이킷런 모델들의 예측 기준과 같이 0.5로 지정해 보겠습니다.

In:

from sklearn.preprocessing import Binarizer

import numpy as np

pred_proba_1 = np.array(prediction["Positive(1)"]).reshape(-1, 1)
# 데이터의 Positive일 확률을 구한 배열만 사용(prediction의 'Positive(1)' 칼럼)
# Binarizer 변환을 위해서는 2차원 배열로 변환해야함
# reshape(-1, 1): 데이터의 총량만큼의 행 x 1열의 형태의 배열로 변환
# 리스트에서 마지막 원소의 순번을 -1로 나타내기도 하는데, 같은 의미로 해석하면 됨

binarizer = Binarizer(threshold = 0.5)
# 임계점이 0.5인 Binarizer 생성
y_pred_40 = binarizer.fit_transform(pred_proba_1)
# 임계점보다 높으면 1, 낮으면 0으로 지정

print(f"재현율: {recall_score(y_test, y_pred_40):.4f}")
print(f"정밀도: {precision_score(y_test, y_pred_40):.4f}")

Out:

재현율: 0.7119
정밀도: 0.7778

임계점을 0.5로 지정하여 Binarizer를 사용한 결과,

재현율과 정밀도가 위에서 예측한 결과와 똑같이 반환되었습니다.

Binarizer의 특징을 명확히 알 수 있음과 동시에 사이킷런 분류 모델들의 predict()는 임계점 0.5 기준으로 분류된다는 것을 알 수 있습니다.

그렇다면 임계점을 달리하였을 때, 재현율과 정밀도가 어떻게 나오는지 확인해 보겠습니다.

In:

def get_precision_recall(y_test, pred_proba_1, thresholds):
  precisions = []
  recalls = []

  for threshold in thresholds:

    binarizer = Binarizer(threshold = threshold)
    # 임계점 지정하여 Binariazer() 객체 생성
    pred_proba = binarizer.fit_transform(pred_proba_1)
    # 임계점을 기준으로 데이터 변환

    precision = precision_score(y_test, pred_proba)
    recall = recall_score(y_test, pred_proba)

    precisions.append(precision)
    recalls.append(recall)

  results = pd.DataFrame(data = {"Precision": precisions,
                                 "Recall": recalls}, index = thresholds)
  
  return results

In:

thresholds = [0.4, 0.45, 0.5, 0.55, 0.6]

get_precision_recall(y_test, pred_proba_1, thresholds)

Out:

Precision Recall
0.40 0.703125 0.762712
0.45 0.724138 0.711864
0.50 0.777778 0.711864
0.55 0.803922 0.694915
0.60 0.836735 0.694915

임계점을 기준으로 Positive일 확률값에 따라 Positive인지 Negative인지 분류하는 모델에 대해서

임계점 별로 정밀도와 재현율을 반환하도록 함수를 만들었는데요.

임계점이 0.45일 때, 정밀도와 재현율이 가장 유사했고,

임계점이 0.45보다 작아질 때, 재현율이 커지는 반면 정밀도가 작아졌고,

임계점이 0.45보다 커질 때, 정밀도가 커지는 반면 재현율이 작아지는 모습을 확인할 수 있었습니다.

우리는 임계점을 조정하는 과정에서 정밀도와 재현율 간의 트레이드오프 관계도 확인할 수 있었고,

각각의 지표를 향상시키는 방법도 알게되었습니다.


이번에는 임계점에 따라 정밀도와 재현율이 어떻게 나오는지 시각화 해보겠습니다.

In:

from sklearn.metrics import precision_recall_curve

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

precisions, recalls, thresholds = precision_recall_curve(y_test, pred_proba_1)
# 정밀도, 재현율 곡선을 구성하는 지표들을 반환

plt.figure(figsize = (8, 6))
# figure 생성(그림판을 연다고 생각)
threshold_boundary = thresholds.shape[0]
# threshold의 구간이 몇 개로 나뉘어져 있는지 확인

plt.plot(thresholds, precisions[0:threshold_boundary], color = "red", label = "precision")
# x축이 threshold, y축이 precision인 그래프
plt.plot(thresholds, recalls[0:threshold_boundary], color = "blue", label = "recall")

start, end = plt.xlim()
# x축과 y축의 범위를 얻어 각각 start와 end로 반환
plt.xticks(np.round(np.arange(start, end, 0.1), 2))
# x축의 눈금을 start부터 end까지 0.1 간격으로 표시

plt.xlabel("Threshold value")
# x축명
plt.ylabel("Precision and Recall value")
# y축명
plt.legend()
# 범례 표시(데이터의 종류를 표시하기 위한 텍스트)
plt.grid()
# 그래프에 격자 표시하기
plt.show()
# 함수를 그래프에 나타나도록 함

​ Out:evaluation01_27_0

metrics 모듈에는 precision_recall_curve()라는 API가 있습니다.

이는 정밀도와 재현율 그래프를 그리기 위한 값들을 반환해주는 메소드입니다.

Binarizer를 사용했을 때 확인했듯이 그래프에서도 임계점이 약 0.45일 때

정밀도와 재현율이 거의 일치하는 모습을 보이며,

두 지표가 서로 트레이드오프 관계에 있다는 것도 확인할 수 있었습니다.


F1 Score

f1 score는 정밀도와 재현율을 결합한 지표이며

데이터(클래스)가 불균형한 경우에 주목하는 지표입니다.

두 가지의 지표의 맹점을 모두 잘 반영하기 위해 두 지표의 조화평균을 구하는데

이 조화평균이 바로 f1 score입니다.

정밀도와 재현율이 어느 한쪽으로 치우치지 않은 값일 때, f1-score는 높은 값을 가집니다.

In:

from sklearn.metrics import f1_score

def get_f1_score(y_test, pred_proba_1, thresholds):
  precisions = []
  recalls = []
  f1_scores = []

  for threshold in thresholds:

    binarizer = Binarizer(threshold = threshold)
    # 임계점 지정하여 Binariazer() 객체 생성
    pred_proba = binarizer.fit_transform(pred_proba_1)
    # 임계점을 기준으로 데이터 변환

    precision = precision_score(y_test, pred_proba)
    recall = recall_score(y_test, pred_proba)
    f1score = f1_score(y_test, pred_proba)

    precisions.append(precision)
    recalls.append(recall)
    f1_scores.append(f1score)

  results = pd.DataFrame(data = {"Precision": precisions,
                                 "Recall": recalls,
                                 "F1 score": f1_scores}, index = thresholds)
  
  return results

In:

thresholds = [0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7]

get_f1_score(y_test, pred_proba_1, thresholds)

Out:

Precision Recall F1 score
0.40 0.703125 0.762712 0.731707
0.45 0.724138 0.711864 0.717949
0.50 0.777778 0.711864 0.743363
0.55 0.803922 0.694915 0.745455
0.60 0.836735 0.694915 0.759259
0.65 0.847826 0.661017 0.742857
0.70 0.886364 0.661017 0.757282

임계점이 0.6일 때 가장 높은 f1 score를 확인할 수 있었고 recall 값이 떨어진 부분도 주목할 필요는 있습니다.


ROC Curve와 AUC Score

ROC curve는 머신러닝의 이진 분류 모델의 성능을 평가하는 중요한 지표 중 하나인데,

특이도에 따른 재현율의 변화를 곡선으로 나타낸 것입니다.

특이도(specificity)는 재현율과 대조되는 개념입니다.

따라서 실제 Negative 데이터 중에서 Negative로 정확하게 예측한 데이터의 비율을 의미하며,

TNR(True Negative Rate)라고도 불립니다.

ROC curve에서 가로축은 FPR(1 - TNR)이어서 왼쪽으로 갈수록, 세로축은 TPR이어서 위로 갈수록

재현율과 특이도 지표가 각각 높고, 성능이 좋은 모델일 것입니다.

In:

from sklearn.metrics import roc_curve

FPRs, TPRs, thresholds = roc_curve(y_test, pred_proba_1)
# ROC curve를 구성하는 지표들을 반환

plt.plot(FPRs, TPRs, label = "ROC Curve")
plt.plot([0, 1], [0, 1], 'k--')

plt.xlabel("FPR")
# x축명
plt.ylabel("TPR")
# y축명
plt.legend()
# 범례 표시(데이터의 종류를 표시하기 위한 텍스트)

Out:

evaluation01_34_1


그리고 이 ROC curve 밑의 면적이 바로 AUC score입니다.

넓을수록, 즉 1에 가까울수록 모델의 성능이 좋은 것입니다.

In:

from sklearn.metrics import roc_auc_score

roc_auc_score(y_test, pred_proba_1)

Out:

0.8807149978635522

약 0.88의 AUC score를 확인할 수 있었습니다.

다음은 임계점에 따른 모든 평가 지표를 한 번에 확인할 수 있도록 함수를 만들어보겠습니다.

In:

def get_metrics(y_test, pred_proba_1, thresholds):
  precisions = []
  recalls = []
  f1scores = []

  for threshold in thresholds:
    binarizer = Binarizer(threshold = threshold)
    y_pred = binarizer.fit_transform(pred_proba_1)

    precision = precision_score(y_test, y_pred)
    recall = recall_score(y_test, y_pred)
    f1score = f1_score(y_test, y_pred)

    precisions.append(precision)
    recalls.append(recall)
    f1scores.append(f1score)

  results = pd.DataFrame(data = {"Precision": precisions,
                                 "Recall": recalls,
                                 "F1 Score": f1scores},
                         index = thresholds)
  
  results["AUC Score"] = roc_auc_score(y_test, pred_proba_1)
  
  return results

In:

thresholds = [0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7]

get_metrics(y_test, pred_proba_1, thresholds)

Out:

Precision Recall F1 Score AUC Score
0.30 0.653846 0.864407 0.744526 0.880715
0.35 0.657534 0.813559 0.727273 0.880715
0.40 0.703125 0.762712 0.731707 0.880715
0.45 0.724138 0.711864 0.717949 0.880715
0.50 0.777778 0.711864 0.743363 0.880715
0.55 0.803922 0.694915 0.745455 0.880715
0.60 0.836735 0.694915 0.759259 0.880715
0.65 0.847826 0.661017 0.742857 0.880715
0.70 0.886364 0.661017 0.757282 0.880715

임계점 별로 정밀도, 재현율, F1 Score, AUC Score가 데이터 프레임으로 정리되어 반환되었습니다.


읽어주셔서 감사합니다.

정보 공유의 목적으로 만들어진 블로그입니다.

미흡한 점은 언제든 댓글로 지적해주시면 감사하겠습니다.


업데이트:

댓글남기기