파이썬 머신러닝 완벽 가이드_ch3 평가_정밀도와 재현율

생계발자·2024년 4월 1일

파이썬 머신러닝 완벽 가이드

정밀도와 재현율은 Positive 데이터 세트의 예측 성능에 좀 더 초점을 맞춘 평가 지표

정밀도와 재현율은 다음과 같은 공식으로 계산된다.

정밀도 = TP / ( FP + TP)

재현율 = TP / ( FN + TP )

정밀도

  • 예측을 Positive로 한 대상 중에 예측과 실제 값이 Positive로 일치한 데이터의 비율

  • 즉, Positive 예측 성능을 더욱 정밀하게 측정하기 위한 평가지표로 양성 예측도라고도 불린다.

재현율

  • 실제 값이 Positive한 대상 중에 예측과 실제 값이 Positive로 일치한 데이터의 비율
  • 민감도 또는 TPR(True Postive Rate)라고도 불린다.

정밀도와 재현율 지표 중에 이진 분류 모델의 업무 특성에 따라 특정 평가 지표가 더 중요한 지표로 간주될 수 있다.

재현율이 중요 지표인 경우는 실제 Positive 양성 데이터를 Negative로 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우이다.

ex) 암 판단 모델, 보험, 금융 사기 적발 모델

정밀도가 중요 지표인 경우는 실제 Negative 음성인 데이터 예측을 Positive 양성으로 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우이다.

ex) 스팸메일 여부 판단 모델

즉 , 재현율과 정밀도 모두 TP를 높이는 데 동일하게 초점을 두지만, 재현율은 FN(실제 Positive, 예측 Negative)를 낮추는 데 초점 , 정밀도는 FP를 낮추는 데 초점을 둔다.

앞의 타이타닉 예제에 오차 행렬 및 정밀도, 재현율을 모두 구해서 예측성능을 평가해보자

사이킷런은 정밀도 계산을 위해 precision_score(), 재현율 계산을 위해 recall_score()를 API로 제공한다.

평가를 간편하게 하기 위해 confusion matrix, accuracy, precision, recall 등의 평가를 한꺼번에 호출하는 get_clf_eval() 함수를 만들어보자

from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix

def get_clf_eval(y_test, pred):
    confusion = confusion_matrix(y_test, pred)
    accuracy = accuracy_score(y_test, pred)
    precision = precision_score(y_test, pred)
    recall = recall_score(y_test, pred)
    print('오차 행렬')
    print(confusion)
    print('정확도: {0:.4f}, 정밀도:{1:.4f}, 재현율:{2:.4f}'.format(accuracy, precision, recall))

이제 로지스틱 회귀 기반으로 타이타닉 생존자를 예측하고 평가 수행

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

#원본 데이터를 재로딩, 데이터 가공, 학습 데이터/테스트 데이터 분할
titanic_df = pd.read_csv('titanic_train.csv')
y_titanic_df = titanic_df['Survived']
X_titanic_df = titanic_df.drop('Survived', axis=1)
x_titanic_df = transform_features(X_titanic_df)

X_train,X_test,y_train,y_test = train_test_split(X_titanic_df, y_titanic_df,
                                                test_size=0.2, random_state=11)

Ir_clf = LogisticRegression(solver='liblinear')

Ir_clf.fit(X_train,y_train)
pred = Ir_clf.predict(X_test)
get_clf_eval(y_test,pred)



[output]
오차 행렬
[[108  10]
 [ 14  47]]
정확도: 0.8659, 정밀도:0.8246, 재현율:0.7705
profile
생(계를 위한) 개발자

0개의 댓글