Artificial Intelligence/Machine Learning

지도학습(분류) - 분류평가지표

DaTALK 2021. 12. 4.

1. 서론

--- 지도학습(분류) 개념 소개 포스팅 (하단 링크 참조) ---

https://dataworld.tistory.com/44

 

지도학습(분류)

1. 서론 ML 기법 중 '분류' 기법에 대해 알아본다. (ML 기법 중 '회귀' 기법에 관한 포스팅은 아래 여러 포스팅 참조!) -- 단순선형회귀 -- https://dataworld.tistory.com/42 지도학습 (회귀) - 단순선형회귀 1...

dataworld.tistory.com

--- 지도학습 '의사결정나무' 소개 포스팅 (하단 링크 참조) ---

https://dataworld.tistory.com/46

 

지도학습(분류) - 의사결정나무

1. 서론 * 의사결정나무기법은 지도학습 중 '분류문제'에 해당하는 기법이다. * (앞서) 지도학습 분류기법의 개념에 관해 먼저 숙지하자. (하단 포스팅 참조) https://dataworld.tistory.com/44 지도학습(분

dataworld.tistory.com

 

 

* 분류 모델의 성능을 평가하기 위해 몇 가지 분류평가지표를 사용하여야 한다.

 

2. 혼동행렬(Confusion Matrix)

 

 

* Positive는 0, Negative는 1로도 표현 가능함

 

* True Positive: 실제 Positive인 값을 Positive라고 예측 (정답)

* True Negative: 실제 Negative인 값을 Negative라고 예측 (정답)

* False Positive: 실제 Negative인 값을 Positive라고 예측 (오답) - 1형 오류

* False Negative: 실제 Positive인 값을 Negative라고 예측 (오답) - 2형 오류

 

[1] 정확도(Accuracy)

= 전체 데이터 중에서 제대로 분류된 데이터의 비율로, 모델이 얼마나 정확하게 분류하는 지 나타냄

* 일반적으로 분류 모델의 주요 평가 방법으로 사용됨

* 그러나, 클래스 비율이 불균형할 경우 평가 지표의 신뢰성을 잃을 가능성이 있다.

* 정확도 = 실제 정답인 비율 / 전체

- 즉 정확도가 높다는 건 해당 모델이 잘 맞췄다는 뜻

 

[2] 정밀도(Precision)

= 모델이 Positive라고 분류한 데이터 중에서 실제로 Positive인 데이터의 비율

* Negative가 중요한 경우

* 즉, 실제로 Negative인 데이터를 Positive라고 판단하면 안되는 경우 사용되는 지표

- 즉 FP가 중요

 

* 예) 스팸 메일 판결을 위한 분류 문제

- 해당 메일이 스팸일 경우 P, 스팸이 아닌 일반 메일일 경우 N

- 일반 메일을 스팸메일(P)로 잘못 예측했을 경우 중요한 메일을 전달받지 못하는 상황이 발생할 수 있다. 이럴 경우 정밀도 수치를 살펴보는게 중요하다.

 

[3] 재현율(Recall, TPR)

= 실제로 Positive인 데이터 중에서 모델이 Positive로 분류한 데이터의 비율

* Positive가 중요한 경우

* 즉, 실제로 Positive인 데이터를 Negative라고 판단하면 안되는 경우 사용되는 지표

- 즉 FN이 중요

 

* 예) 악성종양 여부 판결을 위한 검사

- 악성종양일 경우 P, 양성종양일경우 (악성종양이 아닌 경우) N

- 악성종양을 양성종양인 N으로 잘못 예측했을 경우 제 때 치료를 받지 못하게 되어 생명 위급 가능성, 즉 이 때는 재현율을 따지는 것이 중요하다.

 

[4] 정리

 

 

** 분류 목적에 따라 다양한 지표를 계산하여 평가하기

- 분류 결과를 전체적으로 보고 싶다면? -> 혼동행렬

- 정답을 얼마나 잘 맞췄는지? -> 정확도

- FP 또는 FN의 중요도가 높다면? -> 정밀도 & 재현율

 

[5] 실습 (+정확도, 정밀도, 재현율 출력)

 

{1} import & 데이터 준비

* 내장된 함수 load_breast_cancer 사용
- X는 feature 데이터로 30개의 환자 데이터가 들어가 있으며, Y는 label 데이터로 0은 음성(악성) & 1은 양성(정상)을 뜻한다

* train_test_split를 사용하여 훈련용 데이터와 학습용 데이터를 분리한다.

 

 

import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn import tree
from sklearn.metrics import confusion_matrix
from sklearn.utils.multiclass import unique_labels

X, Y = load_breast_cancer(return_X_y = True)
X = np.array(X)
Y = np.array(Y)

train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state = 42)

 

{2} ML 모델 학습 및 예측 (의사결정나무모델 사용)

* 의사결정나무모델로 ML 모델을 정함 (해당 실습에 한해서) - DecisionTreeClassifier() 사용

* fit함수로 학습 (train data) & predict함수로 예측 (test data)

 

DTmodel = DecisionTreeClassifier()
DTmodel.fit(train_X, train_Y)

y_pred = DTmodel.predict(test_X)

 

{3} confusion matrix 계산

* 혼동행렬은 결과, 즉 클래스 데이터인 Y를 가지고 계산하기에 Y에 관해 예측한 값인 y_pred와 실제 Y값인 test_Y값을 입력한다.

- 즉, test data에 관해서 표현한다.

 

cm = confusion_matrix(test_Y, y_pred)

 

{4} confusion matrix 시각화 - heatmap 사용

 

fig = plt.figure(figsize=(5,5))
ax = sns.heatmap(cm, annot=True)
ax.set(title='Confusion Matrix',
            ylabel='True label',
            xlabel='Predicted label')
fig.savefig("decistion_tree.png")

 

confusion matrix

 

{5} 정확도, 정밀도, 재현율 구하기

* 정확도 구하기 (총 두 가지 방법)

- DTmodel의 내장된 score함수를 사용 (실제 X & Y data 인자로 집어넣기)

- accuracy_score 자체 함수 사용 (실제 Y data & ML모델을 집어넣고 산출한 예측값 인자)

- train data에 대한 정확도, test data에 대한 정확도 각각 구할 수 있음

- (중요) Dtmodel.score & accuracy_score 함수 결괏값은 동일

 

DTmodel.score(train_X, train_Y)
# or
accuracy_score(Y_true, Y_pred)

 

* 정밀도, 재현율 계산하기

- 정밀도는 precision_score, 재현율은 recall_score 함수 사용

 

precision_score(train_Y, y_pred_train)

recall_score(train_Y, y_pred_train)

 

 

 

 

- 출처 - 2021 NIPA/AI 기본/응용 교육과정

댓글