-
회귀분석 평가지표 종류(특징, 장단점, 파이썬 코드)Data Science/데이터마이닝 2022. 6. 23. 22:07반응형
대학원생일때까지만 해도 평가지표는 단순히 모델의 성능을 나타내는 것이라고 생각했었는데.
회사에서 평가지표란 프로젝트의 성공 및 적용 여부를 표현할 수 있어야 하며,
관리자(팀장,임원 등)들을 설득시킬 수 있어야 했다.
본 글에서는 회귀분석에서는 평가지표들을 간단히 짚어보며
수식, 특징, 파이썬 코드와 더불어서 간단한 사족을 붙이려 한다.
각 평가지표의 수식의 경우 다양한 블로그 및 사이트에서 다루므로 생략한다.
0. 목록
- R Squared(R2, 결정계수)
- Adjusted R Squared(Adjusted R2, 조정된 결정계수)
- MAE(Mean Absolute Error, 평균절대오차)
- MSE(Mean Squared Error, 평균제곱오차)
- RMSE(Root Mean Squared Error, 평균제곱근오차)
- MAPE(Mean Absolute Percentage Error, 평균절대비율오차)
- MPE(Mean Percentage Error, 평균비율오차)
- SMAPE(Symmetric Mean Absolute Percentage Error, 대칭평균절대비율오차)
- Spec in Ratio
1. R Squared(R2, 결정계수)
회귀 모델에서 종속변수의 분산 중 독립변수로 설명되는 비율을 나타내는 지표.
0부터 1사이의 값을 가지며, 1은 100%의 설명력을 가진다는 의미.
음수의 값이 나오기도 하는데 이는 모든 값을 종속변수의 평균값으로 예측했을 경우보다 설명력이 낮다는 의미.
독립변수의 수가 증가하면 R Squared도 증가한다는 특징이 있음.
즉, 종속변수에대한 설명력이 없는 독립변수가 추가되어도 R Squared은 증가 할 수 있음.
가장 대표적인 평가지표이지만, 단독으로 사용하지 않고 타 평가지표와 같이 사용하는 것을 추천.
0~1 사이의 값을 가지기 때문에 어느정도 퍼센트(%)적인 성격을 띄어 보고시에 용이함.
from sklearn.metrics import r2_score r2_score(y_true, y_pred) # 예측모델 결과의 r2와 조금 다르다면 아래의 파라미터를 추가해 볼 것 # r2_score(y_true, y_pred, multioutput='variance_weighted')
2. Adjusted R Squared(Adjusted R2, 조정된 결정계수)
R Squared에서 독립변수 증가에 따른 일방적인 설명력 상승을 보완하기 위해 제안됨.
def adjusted_r_squared(r2_score,X_test): return 1 - (1-r2_score)*(len(X_test)-1)/(len(X_test)-X_test.shape[1]-1) # r2_score : 모델에서 예측 된 r2 // model.score(X_test, y_true) # X_test : 테스트 데이터 셋의 독립변수셋(X) adjusted_r_squared(r2_score,X_test)
3. MAE(Mean Absolute Error, 평균절대오차)
오차(예측값 - 평균값)의 절댓값에 대한 평균을 나타내는 지표.
양수의 값을 가진다.
MAE의 값이 실제 종속변수의 단위와 동일하여 직관적이다.
종속변수의 단위가 시간일 경우 MAE : 7은 모델의 예측값이 평균적으로 7시간의 오차를 가진다는 의미.
스케일에 의존적이다.
MAE가 나타내는 값은 종속변수의 단위와 동일하다.
동일한 MAE 7이여도 종속변수의 범위가 10~100인 데이터와 100,000~200,000인 데이터에서 그 의미는 상이하다.
데이터에 대한 도메인 지식이 없다면 MAE가 가지는 의미를 파악하기 힘들다.(ex: 그래서 MAE 7이 얼마나 좋은건데?)
절대값을 취하기 때문에 모델의 예측 경향성(과대/과소 예측)을 알 수 없다.
예측 경향성이란, 모델이 실제 종속변수보다 과대평가(overestimates)를 하는지 과소평가(underestimates)를 하는지에 대한 경향성이다.
배달음식 도착 예측 모델이 있다고 가정하고 글쓴이의 입장에서는, 예측시간보다 실제로 빨리 온다면 이득을 본 기분이지만 예측시간보다 늦게 온다면 손해를 보는 느낌일 것이다.
이럴 경우 오차의 +/-가 가치가 다르다고 할 수 있다.
from sklearn.metrics import mean_absolute_error mean_absolute_error(y_true, y_pred)
4. MSE(Mean Squared Error, 평균제곱오차)
오차(예측값 - 평균값)의 제곱 대한 평균을 나타내는 지표.
양수의 값을 가진다.
스케일에 의존적이다.
1미만의 오차에 대해서는 제곱을 취할 경우 값이 작아진다.
1이상의 오차에서는 값이 클 수록 제곱 값은 더욱 커진다.
큰 오차에 대해서 많은 가중치를 취하기 때문에 이상치에 취약하다.
절대값을 취하기 때문에 모델의 예측 경향성(과대/과소 예측)을 알 수 없다.
(MAE 파트의 설명과 동일)
from sklearn.metrics import mean_squared_error mean_squared_error(y_true, y_pred)
5. RMSE(Root Mean Squared Error, 평균제곱근오차)
MSE에 루트를 씌운 지표.
스케일에 의존적이다.
1미만의 오차에 대해서는 제곱을 취할 경우 값이 작아진다.
1이상의 오차에서는 값이 클 수록 제곱 값은 더욱 커진다.
제곱근오차를 사용하기 때문에 제곱오차(MSE)보다 값의 왜곡이 적다.
절대값을 취하기 때문에 모델의 예측 경향성(과대/과소 예측)을 알 수 없다.
(MAE 파트의 설명과 동일)
r2와 더불어서 자주 사용되는 평가지표다.
from sklearn.metrics import mean_squared_error mean_squared_error(y_true, y_pred,squared=False)
6. MAPE(Mean Absolute Percentage Error, 평균절대비율오차)
MAE에 비율의 개념을 적용한 평가지표.
지표가 비율의 형태이기 때문에 직관적이다.
스케일에 의존적이다.
종속변수의 스케일에 비해서 변동폭이 작다면 MAPE가 비이상적으로 높게 나타난다.
종속변수가 100,000~ 100030 범위의 값을 가지고 있을 때 평균값인 100,015로 예측을 한다고 가정한다.
y_true = np.array([100000,100010,100020,100030])y_pred = np.array([100015,100015,100015,100015])이때 MAPE는 99.99%의 값을 가진다.
R Squared의 경우 0의 값을 가진다.
또한 종속변수에 1미만의 값이 있을 경우 MAPE값이 음수 값이 나타날 수 있다.(-1300% 같은 이상치가 나올 수 있다.)
절대값을 취하기 때문에 모델의 예측 경향성(과대/과소 예측)을 알 수 없다.
(MAE 파트의 설명과 동일)
from sklearn.metrics import mean_absolute_percentage_error mean_absolute_percentage_error(y_true, y_pred) # 포스팅과 같이 백분율로 나타내고 싶다면 아래와 같다. # 100-mean_absolute_percentage_error(y_true, y_pred)*100
7. MPE(Mean Percentage Error, 평균비율오차)
MAPE에서 절대값을 취하지 않는 평가지표이다.
절대값을 취하지 않기 때문에 모델의 예측 경향성(과대/과소 예측)을 알 수 있다.
하지만, 오차가 양수/음수 고르게 나온다면 0으로 수렴할 수 있기 때문에 주의해야 한다.
아래의 데이터의 경우 MPE는 100%이며 MAPE는 50%이다.
y_true = np.array([10,10,10,10])y_pred = np.array([15,5,15,5])import numpy as np def mean_percentage_error(y_true,y_pred): return np.mean((y_true-y_pred)/y_true)*100 mean_percentage_error(y_true,y_pred) # 포스팅과 같이 백분율로 나타내고 싶다면 아래와 같다. # 100-mean_percentage_error(y_true,y_pred)
8. SMAPE(Symmetric Mean Absolute Percentage Error, 대칭평균절대비율오차)
MAPE에서 분모 계산시에 종속변수에 예측값을 더하여 범위를 제한한 지표다.
기존 MAPE에서는 종속변수에 1미만의 값이 존재할 경우 음수 값이 나타나지만,
SMAPE에서는 이러한 점을 보완하여 0~100% 범위 내에서 값이 산출되도록 하였다.
y_true = np.array([0.01,0.02,0.01,0.002])y_pred = np.array([0.1,0.1,0.15,0.3])다음과 같은 데이터에서 MAPE는 -4300%라는 이상치가 나타나지만 SMAPE는 16.33%라는 값을 반환한다.
분모 계산시에 종속변수에 예측값을 더하기 때문에 오차의 +/-에 대한 차이가 발생한다.
아래와 같이 데이터1에서는 [2,2,4,1]의 오차이던 것을 데이터2에서 [-2,-2,4,1]로 변경하였다.
y_true1 = np.array([5,10,7,9])y_pred1 = np.array([7,12,11,10])
y_true2 = np.array([5,10,7,9])y_pred2 = np.array([3,8,11,10])MAPE에서는 동일하게 67.93%를 나타내지만 SMAPE에서는 각각 86.68%와 84.1%를 나타낸다.
import numpy as np def symmetric_mean_absolute_percentage_error(y_true, y_pred): return 100/len(y_true) * np.sum(np.abs(y_pred-y_true) / (np.abs(y_true) + np.abs(y_pred))) symmetric_mean_absolute_percentage_error(y_true, y_pred) # 포스팅과 같이백분율로 나타내고 싶다면 아래와 같다. # 100-symmetric_mean_absolute_percentage_error(y_true, y_pred) # 해당 코드에서는 y_true, y_pred가 둘다 0일 경우를 고려하지 않고 있다.
9. Spec in Ratio
허용오차 내 범위를 가지는 평가결과 비율을 나타내는 지표.
앞선 평가지표들이 오차에대한 값을 나타냈다면, Spec in ratio는 분류문제와 같이 Yes/No로 이진분류를 하는 지표이다.
Spec in ratio는 사전에 정의 된 허용오차가 필요하다.
예측된 결과와 실제 종속변수간에 차이가 허용오차보다 낮다면 Yes 높다면 No로 평가하여 최종적으로는 허용오차를 만족하는 비율을 산출하게 된다.
허용오차를 정의할 수 있다는 가정하에 직관적이며 스케일에 구애받지 않는 평가지표이다.
def spec_in_ratio(y_true,y_pred,margin_of_error): return len(np.where(np.abs(y_true-y_pred) <= margin_of_error)[0])/len(y_true)*100 spec_in_ratio(y_true,y_pred,margin_of_error)
참고
https://scikit-learn.org/stable/modules/model_evaluation.html#regression-metrics
https://www.statology.org/adjusted-r-squared-in-python/
https://www.statology.org/smape-python/
https://namu.wiki/w/%EA%B2%B0%EC%A0%95%EA%B3%84%EC%88%98
https://en.wikipedia.org/wiki/Symmetric_mean_absolute_percentage_error
반응형'Data Science > 데이터마이닝' 카테고리의 다른 글
클러스터링 기법 - 개념, 타당성평가, 종류 (0) 2022.10.05 연관규칙(Association rules) 파이썬 구현하기 mlxtend.frequent_patterns.apriori (0) 2022.10.04 데이터 형(data type) 종류 (0) 2022.09.29 [XAI/Python] SHAP 파이썬 라이브러리 사용 코드 예시(SHapley Additive exPlanations) (0) 2022.07.15 [문자열/Regex] 문자열 특정 문자 바꾸기 (0) 2021.05.17