머신러닝에서의 회귀모델의 평가(Evaluation, Scoring)를 위한 종속변수 평가지표에 대해 알아본다.
개요
선형 회귀, 회귀나무 등 회귀모델을 평가하기 위해서는 다양한 접근이 있을 수 있다. 그 중에서도 종속변수를 기반으로 확인 가능한 오차(Error)기반의 평가지표 중 주로 사용하는 일부 지표를 알아보고자 한다.
MSE
평균 제곱 오차(Mean Squared Error)는 다음과 같다.
$$\frac{\sum_{i=1}^{n}{(y_i - \hat{y_i})^2}}{n}$$
오차를 제곱하기 때문에 값이 크고 단위도 제곱이 되기 때문에 해석에 어려움이 있다. 하지만 오차를 제곱 하는 특징 때문에 매우 크거나 작은 오차에 영향을 많이 받는다. 때문에 간헐적으로 있는 큰 오차가 염려된다면 이 지표를 사용하는 것도 좋다.
MAE
평균 절대 오차(Mean Absolute Error)는 다음과 같다.
$$\frac{\sum_{i=1}^{n}{|y_i - \hat{y_i}|}}{n}$$
오차의 절대값을 취하는 형태이기 때문에 종속변수의 값범위와 큰 차이가 없다. 평균적인 오차를 보기에 적절한 지표.
RMSE
평균 제곱근 오차(Root Mean Squared Error)는 다음과 같다.
$$\sqrt{\frac{\sum_{i=1}^{n}{(y_i - \hat{y_i})^2}}{n}}$$
MSE의 양의 제곱근으로 제곱 때문에 해석에 겪는 어려움을 해소한 지표라고 할 수 있다. 산출값은 MAE와 유사하며 오차 평가에 많이 사용되는 지표이다.
MAPE
평균 절대 백분률 오차(Mean Absolute Percentage Error)는 다음과 같다.
$$\frac{\sum_{i=1}^{n}{| \frac{y_i - \hat{y_i}}{y_i}} |}{n} \times 100$$
종속변수의 범위에 따라 해석을 다르게 해야하는 다른 지표(MSE, MAE, RMSE)와 다르게 오차를 종속변수로 나누어 그 비율을 산출하는 MAPE는 종속변수의 범위가 달라도 서로 다른 모델에서 산출된 값이라도 상대비교가 용이한 지표이다.
단, 종속변수에 0이 있으면 발산하기 때문에 사용에 주의한다.
실습
다음과 같이 데이터프레임 객체 “df_y”를 준비한다.
1 | df_y = pd.DataFrame(dict(true = [0, 100, 20, 24, 40, 55], |
true | pred | |
---|---|---|
0 | 0 | 1 |
1 | 100 | 300 |
2 | 20 | 20 |
3 | 24 | 42 |
4 | 40 | 37 |
5 | 55 | 52 |
직접 계산하기
“df_y” 객체의 “true” 변수의 값은 실제값(y)이고 “pred”는 예측값($\hat{y}$)으로 간주한다.
먼저 오차(E, Error)를 계산해보면 다음과 같다.
1 | df_y["true"] - df_y["pred"] |
오차제곱(SE, Squared Error)은 다음과 같다.
1 | (df_y["true"] - df_y["pred"]) ** 2 |
오차제곱의 평균(MSE, Mean Squared Error)은 다음과 같다.
1 | ((df_y["true"] - df_y["pred"]) ** 2).mean() |
오차제곱 평균의 제곱근(RMSE, Root Mean Squared Error)은 다음과 같다.
1 | ((df_y["true"] - df_y["pred"]) ** 2).mean() ** 0.5 |
오차절대값의 평균(MAE, Mean Absolute Error)은 다음과 같다.
1 | abs(df_y["true"] - df_y["pred"]).mean() |
평균절대비 오차(MAPE, Mean Absolute Percentage Error)는 다음과 같다.
1 | abs((df_y["true"] - df_y["pred"]) / df_y["true"]).mean() |
종속변수에 0이 있기 때문에 결과값이 무한대로 발산한 것을 알 수 있다. 그래서 첫 번째 원소를 제외하고 다음과 같이 계산해보면 적절한 값이 산출되는 것을 알 수 있다.
1 | abs((df_y["true"][1:] - df_y["pred"][1:]) / df_y["true"][1:]).mean() |
sklearn 라이브러리 활용
MAE, MSE, RMSE, MAPE는 차례대로 다음과 같이 산출할 수 있다.
1 | mean_absolute_error(y_true = df_y["true"], y_pred = df_y["pred"]) |
MAPE는 이론상 무한대의 값이 산출되는 것이 맞으나 내부 코드의 특성상 매우 큰 값이 도출되었다. 그리고 RMSE를 산출하기 위해 mean_squared_error()
로 산출된 결과에 제곱근을 취하는 형태의 코드를 작성했으나 “squared” 인자를 활용할 수도 있으며 다음과 같다.
1 | mean_squared_error(y_true = df_y["true"], y_pred = df_y["pred"], squared = False) |