Py) ML - 모델 평가(회귀모델)

Py) ML - 모델 평가(회귀모델)

머신러닝에서의 회귀모델의 평가(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
2
3
df_y = pd.DataFrame(dict(true = [0, 100, 20, 24, 40, 55],
pred = [1, 300, 20, 42, 37, 52]))
df_y
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
2
3
4
5
6
7
8
df_y["true"] - df_y["pred"]
## 0 -1
## 1 -200
## 2 0
## 3 -18
## 4 3
## 5 3
## dtype: int64

오차제곱(SE, Squared Error)은 다음과 같다.

1
2
3
4
5
6
7
8
(df_y["true"] - df_y["pred"]) ** 2
## 0 1
## 1 40000
## 2 0
## 3 324
## 4 9
## 5 9
## dtype: int64

오차제곱의 평균(MSE, Mean Squared Error)은 다음과 같다.

1
2
((df_y["true"] - df_y["pred"]) ** 2).mean()
## 6723.833333333333

오차제곱 평균의 제곱근(RMSE, Root Mean Squared Error)은 다음과 같다.

1
2
((df_y["true"] - df_y["pred"]) ** 2).mean() ** 0.5
## 81.99898373353984

오차절대값의 평균(MAE, Mean Absolute Error)은 다음과 같다.

1
2
abs(df_y["true"] - df_y["pred"]).mean()
## 37.5

평균절대비 오차(MAPE, Mean Absolute Percentage Error)는 다음과 같다.

1
2
abs((df_y["true"] - df_y["pred"]) / df_y["true"]).mean()
## inf

종속변수에 0이 있기 때문에 결과값이 무한대로 발산한 것을 알 수 있다. 그래서 첫 번째 원소를 제외하고 다음과 같이 계산해보면 적절한 값이 산출되는 것을 알 수 있다.

1
2
abs((df_y["true"][1:] - df_y["pred"][1:]) / df_y["true"][1:]).mean()
## 0.5759090909090909

sklearn 라이브러리 활용

MAE, MSE, RMSE, MAPE는 차례대로 다음과 같이 산출할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
mean_absolute_error(y_true = df_y["true"], y_pred = df_y["pred"])
## 37.5

mean_squared_error(y_true = df_y["true"], y_pred = df_y["pred"])
## 6723.833333333333

mean_squared_error(y_true = df_y["true"], y_pred = df_y["pred"]) ** 0.5
## 81.99898373353984

mean_absolute_percentage_error(y_true = df_y["true"], y_pred = df_y["pred"])
## 750599937895083.1

MAPE는 이론상 무한대의 값이 산출되는 것이 맞으나 내부 코드의 특성상 매우 큰 값이 도출되었다. 그리고 RMSE를 산출하기 위해 mean_squared_error() 로 산출된 결과에 제곱근을 취하는 형태의 코드를 작성했으나 “squared” 인자를 활용할 수도 있으며 다음과 같다.

1
2
mean_squared_error(y_true = df_y["true"], y_pred = df_y["pred"], squared = False)
## 81.99898373353984
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×