본문 바로가기
Data Science/Machine Learning

회귀 평가 지표 개념 A-Z 및 활용방법 이해하기

by Queen2 2022. 10. 19.
728x90
반응형

머신러닝을 공부하신 분들이라면 회귀 평가지표 MAE, MSE, RMSE를 한번쯤 다 들어보셨을텐데요

개념은 무수히 많이 들었지만 남들이 물어봤는데 각 지표의 의미가 헷갈린다면

이번에 꼭 한번 정리하고 넘어가시길 바래요! 😉

 

평가지표를 알아봄에 앞서서, 왜 평가 지표가 필요한지 부터 고민해봅시다.

모델을 만들고 예측값까지 나왔는데 이게 잘된건지, 엉터리 값이 나왔는지 판단할 수 있는 성적표가 있어야겠죠?

그렇다면 예측을 했으니 실제값과 비교해서 얼마나 잘 했는지 ==>  (예측값-실제값)  = 잔차 = residual 을 중심으로

잘했는지 못했는지 보기 위해서 나온 지표들이 바로 아래의 MSE, RMSE, MAE 지표입니다!!

 


 

요약한 영어라서 더 낯설게 느껴질 수도 있는데요

각 단어를 풀어 써서 아래의 식과 대입해서 생각해보면 이해가 쉬워집니다

저는 이 이름을 뒤에서 부터 읽으면 식을 연상하기가 훨씬 쉬웠는데요

 

  • MSE (Mean + Squared + Error)
  • RMSE (Root + Mean + Squared + Error)
  • MAE (Mean+Absolute+Error)
  • MAPE (Mean + Absolute + Percentage(자차가 실제값에서 차지하는 비율) + Error)

 

예를 들어서 MSE는 Error (잔차)를 Squared(제곱)한 값들을 Mean(평균)을 냈구나 생각하면 됩니다

 

 

사실 형태는 조금씩 다르지만 회귀예측이 얼마나 잘 됐는지 볼께! 라는 목적은 같죠

그러면 각 지표가 어떤 차이가 있는지 보겠습니다

 

MSE, RMSE - 잔차들을 평균낸다는 개념이 강한만큼 이상치(Outlier)에 대해 더 민감함
- 루트 처리가 된만큼 RMSE가 해석하기는 더 용이함
- RMSE가 보편적으로 사용됨
- MSE 는 분산과 편향이 평가에 반영됨 특징을 지님 *
MAE - 전체 잔차들의 중간값을 구한다는 개념이 강해 이상치에 대해 덜 민감함
MAPE - MAE 대비 정규화되어 있음

 

**MSE = 분산 + 편향**2 으로도 표현이 가능한데요. 어떻게 이런 표현이 가능한지 아래 식을 통해 도출가능합니다

Source : Wikepedia

 

 


개념을 봤으니 이를 실제 어떻게 구현할 수 있는지 알아보겠습니다.

 

👍 회귀지표 구현 방법

사이킷런에서는 이러한 예측에 대한 평가지표를 활용할 수 있는 방식을 3가지를 제공합니다

 

1) 각 예측모델에 포함된 score 메서드

2) cross_val_score혹은 GridSearchCV에 사용가능한 scoring 파라미터 설정

3) sklearn.metrics

(자세한 설명은 https://scikit-learn.org/stable/modules/model_evaluation.html 를 참고바랍니다)

 

1번은 모델을 다 다루기는 어렵기 때문에 3번부터 일단 보겠습니다.

 

1. MAE 구현방법

sklearn.metrics.mean_absolute_error(y_true, y_pred, *, sample_weight=None, multioutput='uniform_average')

y_true에 타겟값, y_pred에 예측값을 넣습니다

>>> from sklearn.metrics import mean_absolute_error
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> mean_absolute_error(y_true, y_pred)
0.5

2. MSE 구현방법

sklearn.metrics.mean_squared_error(y_true, y_pred, *, sample_weight=None, multioutput='uniform_average', squared=True)
>>> from sklearn.metrics import mean_squared_error
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> mean_squared_error(y_true, y_pred)
0.375

 

3. RMSE 구현방법

 

RMSE는 위의 MSE 를 응용한 버전으로 사용이 가능합니다.

>>> mean_squared_error(y_true, y_pred)**0.5
>>>> np.sqrt(mean_squared_error(y_true, y_pred))

두 방식 중 어느 것을 사용해도 사실 상관 없습니다! 단지 MSE의 값에 루트를 씌워주는거니까요

 

4. MAPE 구현방법

sklearn.metrics.mean_absolute_percentage_error(y_true, y_pred, *, sample_weight=None, multioutput='uniform_average')
>>> from sklearn.metrics import mean_absolute_percentage_error
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> mean_absolute_percentage_error(y_true, y_pred)
0.3273...

 

 


2번째 방식인 교차검증 파라미터 Scoring 을 보겠습니다.

 

sklearn.model_selection.cross_val_score

sklearn.model_selection.cross_val_score(estimator, X, y=None, *, groups=None, scoring=None, cv=None, n_jobs=None, verbose=0, fit_params=None, pre_dispatch='2*n_jobs', error_score=nan)

cross_val_score 교차검증을 기본으로 한 모델의 적용 결과값을 효과적으로 볼 수 있는 기능인데요

이 파라미터들 중에 scoring에 아래 평가지표별 해당하는 파라미터를 입력하면 됩니다

 

평가지표 Scoring 파라미터명
MAE neg_mean_absolute_error
MSE neg_mean_squared_error
RMSE neg_root_mean_squared_error
MAPE neg_mean_absolute_percentage_error

 

여기서 파라미터명 앞에 neg 라는 이름이 붙어있는데요, 즉 값이 음수로 반환된다는 애기입니다.

따라서 점수를 볼때 -1을 곱해줘야 우리가 찾는 점수를 볼 수 있습니다.

 

 

 

References:

https://scikit-learn.org/stable/modules/model_evaluation.html

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html#sklearn.metrics.mean_squared_error

https://www.kaggle.com/discussions/getting-started/52081

 

 

 

728x90
반응형

댓글