본문 바로가기
머신러닝/지도학습

[머신러닝-지도] 성능평가

by 황오독 2024. 12. 16.

* 어떻게 평가할 것인가?

* 분류 모델 평가 - 0인지 1인지를 예측하는 것
- 실제 값도 0과 1이고, 예측 값도 0과 1임
- 하지만 0을 1로 예측하거나 1을 0으로 예측할 수 있음
- 예측 값이 실제 값과 많이 같을 수록 좋은 모델이라 할 수 있음
- 정확히 예측한 비율로 모델 성능을 평가
=> 정확도를 높여라!!
* 회귀 모델 평가 - 회귀 모델이 정확한 값을 예측하기는 사실상 어려움
- 예측 값과 실제 값에 차이(=오차)가 존재할 것이라 예상함
- 예측 값이 실제 값에 가까울 수록 좋은 모델이라 할 수 있음
- 예측한 값과 실제 값의 차이(=오차)로 모델 성능을 평가
=> 오차를 줄여라!!

 

 

1. 회귀 모델 성능 평가

- 우리가 실제로 예측하고 싶은 값, Target, 목푯값
- 이 값과 비교해 우리 모델의 성능을 평가할 것임
- 우리가 관심을 갖는 오차는 이 값과 예측값의 차이이다.
- 이미 알고 있는, 이미 존재하고 있는 평균으로 예측한 값
- 최소한 이 평균값 보다는 실젯값에 가까운 예측값을 원함
- 우리 모델의 예측값이 평균값보다 오차를 얼마나 더 줄였는지가 궁금하다.
 
- 우리 모델로 새롭게 예측한 값
- 이 예측값이 얼마나 정확한지 알고 싶은 상황
- 최소한, 아무리 못해도 평균값 보다는 좋아야 할 것임
- 우리 모델이 평균값보다 얼마나 잘 예측했을지 궁금하다.

 

(2) 하나의 값

- 회귀모델의 성능은 실젯값과 예측값의 차이, 즉 오차의 크기로 평가한다.

- 그러므로 우선 우리 모델의 오차를 이야기 할 수 있어야 하는데,

실젯값 예측값 오차 (실젯값-예측값) - 오차가 2, -1, 2, -3이라고 표현하기 보다는,
오차 평균으로 하나의 값으로 표현해야 대화가 쉽다.
16 14 2
15 16 -1
22 20 2
25 28 -3

 

① 오차 합 구하기

- 오차 평균을 구하기 위해서는 오차 합을 구해야 한다.

- 오차 제곱의 합과 오차 절대값의 합을 사용할 수 있다.

 

② 오차 제곱의 합

- 오차 제곱(SSE)의 합을 구한 후 평균을 구하는 방법 : MSE

- 오차 제곱이므로 루트를 사용해 일반적인 값으로 표현하는 방법 : RMSE

 

③ 오차 절대값의 합

- 오차 절대값의 합을 구한 후 평균을 구하는 방법 : MAE

- 오차 비율을 표시하고 싶은 경우 : MAPE

 

(3) 회귀 평가 지표 정리

MSE Mean Squred Error
RMSE Root Mean Squred Error
MAE Mean Absolute Error
MAPE Mean Absolute Percentage Error

=> 위 값이 모두 작을 수록 모델 성능이 좋은 것임.

 

(4) 오차를 바라보는 다양한 관점

① SST : Sum Squared Total, 전체 오차 (최소한 평균보다는 성능이 좋아야 함, 우리에게 허용된 최소한의 오차)

② SSR : Sum Squared Regression, 전체 오차 중 회귀식이 잡아낸 오차

③ SSE = Sum Squared Error, 전체 오차 중에서 회귀식이 여전히 잡아내지 못한 오차

 

 

(5) 결정 계수 R2 (R-Squred)

- Coefficient of Determination

- MSE로 여전히 설명이 부족한 부분이 있다.

- 모델 성능을 잘 해석하기 위해서 만든 MSE의 표준화된 버전이 결정 계수이다.

- 전체 오차 중에서 회귀식이 잡아낸 오차 비율 (일반적으로 0~1 사이)

- 오차의 비 또는 설명력이라고도 부름

- R2 = 1이면 MSE = 0이고, 모델이 데이터를 완벽하게 학습한 것이다.

 

 

(6) 모델 평가하기

① 평가에 필요한 함수를 불러와 사용함

from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_absolute_percentage_error
from sklearn.metrics import r2_score

 

② 실젯값(y_test)과 예측값(y_pred)를 매개변수로 전달해 평가함

# 평가하기
# mean_absolute_error(실젯값, 예측값)
print(mean_absolute_error(y_test, y_pred)

 

- MSE, RMSE, MAE, MAPE는 오류(Error)이므로 작을수록 좋고,

- R2 Score는 클수록 좋다.

 

2. 분류 모델 성능 평가

(1) 얼마나 정확하게 예측하였는가에 대한 평가

  예측값
실젯값   0 1
0 3 1
1 2 4

 

① 정확도 (Accuaracy) : 1과 0을 정확히 예측한 비율 = 7/10

② 정밀도 (Precision) : 1이라 예측한 것 중에 정말 1인 비율 = 4/5

③ 재현율 (Recall) : 실제 1인 것을 1이라고 예측한 비율 = 4/6

 

(2) 혼동 행렬

- Confusion Matrics (오분류표)

  Predicted Value
Actual
Value
  Negative
0
Positive
1
Negative
0
True Negative
TN
False Positive
FP
Positive
1
False Negative
FN
True Positive
TP

* TN (True Negative, 진음성)

: 음성으로 잘 예측한 것 (음성을 음성으로 예측한 것)

* FP (False Positive, 위양성)

: 양성으로 잘 못 예측한 것 (음성을 양성으로 예측한 것)

* FN (False Negative, 위음성)

: 음성으로 잘 못 예측한 것 (양성을 음성으로 예측한 것)

* TP (True Positive, 진양성)

: 양성으로 잘 예측한 것 (양성을 양성이라고 예측한 것)

 

- 정밀도와 재현율은 기본적으로 Positive에 대해 이야기 함

- Negative에 대한 정밀도와 재현율도 의미를 가진다.

 

① Accuarcy (정확도) 

- 정분류율이라고 부르기도 함

- 전체 중에서 Positive와 Negative로 정확히 예측한 (TN + TP) 비율

- Negative를 Negative로 예측한 경우도 옳은 예측임을 고려하는 평가지표

- 가장 직관적으로 모델 성능을 확인할 수 있는 지표이다.

 

② Precision(정밀도)

- 예측관점

- Positive로 예측한 것 중에서 실제 Positive인 비율

- ex) 비가 내릴 것으로 예측한 날 중 실제 비가 내린 날의 비율

- ex) 암이라 예측한 환자 중 실제 암인 환자의 비율

 

③ Recall (재현율,민감도)

- 실제 관점

- 실제 Positive 중 Positive로 예측한 비율

- ex) 실제 비가 내린 날 중 비가 내릴 것으로 예측한 날의 비율

- ex) 실제 암인 환자 중에서 암이라고 예측한 환자의 비율

=> 재현율이 낮을 경우 발생하는 문제의 심각성이 예측율이 낮을 경우 발생하는 문제의 심각성보다 큼

- 암이 아닌데, 암이라고 예측한 경우는 불필요한 비용이 발생하게 되지만,

- 암인데 암이 아니라고 하였으니 심각한 결과를 초래할 수 있다.

 

④ Specificity(특이도)

- 실제 Negative 중에서 Negative로 예측한 비율

- ex) 실제 비가 내리지 않은 날 중 비가 내리지 않을 것으로 예측한 날의 비율

- ex) 실제 암이 아닌 환자 중에서 암이 아니라고 예측한 환자의 비율

 

⑤ F1-score

- 정밀도와 재현율의 조화 평균

- 분자가 같지만 분모가 다를 경우, 즉 관점이 다른 경우 조화 평균이 큰 의미를 가진다.

- 정밀도와 재현율이 적절하게 요구 될 때 사용한다.

- 즉 정밀도와 재현율의 균형을 나타냄

더보기
chatGPT의 빠삭한 설명

 

(3) 모델 평가하기

# 함수 불러오기
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

# 평가하기
# accuracy_score
print(accuracy_score(y_test, y_pred))
print(precision_score(y_test, y_pred, average=None))

# 다중 분류일 때 average=None
# 정밀도와 재현율 등은 average 매개변수로 평균을 사용할지 개별 값으로 표시할 지 지정
# classification_report 함수를 사용해 한 번에 여러 평가지표를 확인할 수 있음

 

'머신러닝 > 지도학습' 카테고리의 다른 글

[머신러닝-지도] 머신러닝 소개  (2) 2024.12.15