머신러닝 모델의 평가

John
7 min readMar 8, 2020

--

머신러닝은 데이터 가공/변환, 모델 학습/예측, 평가의 프로세스로 이루어져있다.

그 중에서도 평가 지표는 “분류"인지 “회귀"인지에 따라 여러 종류로 나뉘게 되는데, 회귀의 경우는 대부분 실제값과 예측값의 오차 평균값에 기반하게 된다.

지금은 분류의 5가지 평가 지표를 살펴보고자 한다.

1. 정확도 (Accurancy)

가장 직관적으로 사용할 수 있는 지표다.
다만 문제점은 데이터의 label이 불균형할 경우 성능을 왜곡할 수 있는 문제점을 가지고 있다.

사이킷런에서 import accuracy_score을 입력하면 사용 가능하다.
(아래 예시는 label encoding 및 data preprocessing이 이미 완료된 상태다)

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 원본 데이터를 재로딩, 데이터 가공, 학습데이터/테스트 데이터 분할.
titanic_df = pd.read_csv('/Users/dreamus/Downloads/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=0)
# 위에서 생성한 Dummy Classifier를 이용하여 학습/예측/평가 수행.
myclf = MyDummyClassifier()
myclf.fit(X_train ,y_train)
mypredictions = myclf.predict(X_test)
print('Dummy Classifier의 정확도는: {0:.4f}'.format(accuracy_score(y_test , mypredictions)))

위 코드는 단순 성별로 생존자를 예측했고 정확도는 약 78%나왔다.

이처럼 단순한 알고리즘으로 예측을 하더라도 높은 수치가 나올 수 있기에 정확도를 평가 지표로 사용할 때에는 매우 신중하게 사용해야한다.

2. 오차 행렬 (Confusion Matrix)

이진 분류에서 성능 지표로 잘 활용되는 오차 행렬은 학습된 분류 모델이 예측을 수행하며, 얼마나 헷갈리는지(confused) 함께 보여주는 지표다. 즉, 이진 분류의 예측 오류가 얼마인지와 더불어 어떠한 유형의 예측 오류가 발생하고 있는지를 함께 나타내는 지표이다.

여기서 앞 문자 True/False는 예측값과 실제값이 ‘같은지/틀린지'를 의미하며, 뒤 문자 Negative/Positive는 결과 값이 부정(0)인지 긍정(1)인지를 의미한다.

TN : 예측값 N, 실제값 N
FP : 예측값P, 실제값 N
FN : 예측값N, 실제값P
TP : 예측값P, 실제값P

정확도는 오차 행렬상에서 새롭게 정의될 수 있다.

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

-> 전체에서 예측값이 동일한 개수

마찬가지로 사이킷런에서는 confusion_matrix()를 사용하여 쉽게 오차 행렬을 구할 수 있다

from sklearn.metrics import confusion_matrixconfusion_matrix(y_test,Mypred)

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

정밀도와 재현율은 positive 데이터의 예측 성능에 초점을 맞춘 평가 지표다.

정밀도 = TP / (FP + TP)
재현율 = TP / (FN + TP)

정밀도는 Positive로 예측한 대상들이 실제로 positive인 비율을 나타내며, 양성 예측도라고 불리기도 한다.

재현율은 예측과 실제값이 positive로 일치한 비율을 나타내며, 민감도 또는 TPR(True Positive Rate)로 불린다.

이 지표들은 특정 업무에 따라 중요한 지표가 될 수 있다.

재현율이 상대적으로 더 중요한 지표인 경우 실제 positive 양성인 데이터 예측을 negative로 잘못 판단하게 되면 업무상 큰 영향이 발생할 때
(Ex. 암 환자에게 암이 아니라고 예측 -> 맞는데 아니다.)

정밀도가 상대적으로 더 중요한 지표인 경우 실제 Negative 음성인 데이터 예측을 Positive 양성으로 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우
(Ex. 금융 사기가 아닌데 맞다고 예측 -> 아닌데 맞다)

from sklearn.metrics import precision_score, recall_scoreprecision = precision_score(y_test, Mypred)
recall = recall_score(y_test, Mypred)

4. F1 스코어(Score)

F1 스코어는 정밀도와 재현율을 결합한 지표이다.
이는 정밀도와 재현율이 어느 한쪽으로 치우치지 않는 수치를 나타낼 때 상대적으로 높은 값을 가진다.

최대값은 1이다.

사이킷런은 F1 스코어를 구하기 위해 f1_score 함수를 제공한다.

from sklearn.metrics import f1_score
f1 = f1_score(y_test,Mypred)

5. ROC 곡선과 AUC

ROC 곡선과 이에 기반한 AUC 스코어는 이진 분류의 에측 성능 측정에서 중요하게 사용되는 지표다.

ROC 곡선은 2차대전 때 통신 장비 성능 평가를 위해 고안된 수치라고 하며, 일반적으로 의학 분야에서 많이 사용되지만 머신러닝의 이진 분류 모델의 예측 성능을 측정할 때 사용되는 중요한 지표다.

ROC 곡선은 FPR(X)와 TPR(Y)의 관계를 그린 곡선이다.

FPR : False Positive Rate (FP / (FP + TN) = 1-TNR = 1-특이성
TPR : True Positive Rate (재현율)

그림과 같이 직선에서 거리가 멀어질 수록 성능이 뛰어난 것으로 해석할 수 있고 결론적으로 곡선 아래의 면적인 AUC(Area Under Curve)가 클수록 좋다고 볼 수 있다.

from sklearn.metrics import roc_auc_score
roc_auc = roc_auc_score(y_test,Mypred)

참고

--

--

John
John

Written by John

기술적인 성장을 희망합니다

No responses yet