회귀분석을 하며 여러 모델들을 만들고 실제 성능이 어느정도인지 판단하기 위한 지표들이 필요하다.
위 9가지 방식의 특징을 알아보려 한다.
아래 수식들의 n은 모두 데이터 수를 의미한다.
1. ME(Mean of Error)
ME(Mean of Error)는 평균 제곱 오차를 의미한다. 예측오차의 산술평균을 의미하고 다음과 같이 산정된다.
$$ ME=\frac{\sum_{i=1}^n{e_i}}{n}=\frac{\sum _{i=1}^n\left(Y_i-\hat{Y_i}\right)}{n} $$
def ME(y, t):
return (y-t).mean(axis=None)
2. MAE(Mean Absolute Error)
MAE(Mean Absolute Erro)는 예측값과 실제값의 모든 차이의 합이다. 인간이 보기에 직관적으로 차이를 알 수 있다는 장점이 있다. 하지만 이상치에 대해 robust한 결과를 보여주어 오차에 덜 민감하다는 단점이 있고, 위 MSE, RMSE에 비해, 오차값이 outlier의 영향을 상대적으로 적게 받는다. 또한 절댓값을 취하므로 underestimates/overestimates인지에 대한 판단을 할 수 없으며 스케일에 의존적이다.
$$ MAE=\frac{\sum_{i=1}^n{|Y_i-\hat{Y_i}|}}{n} $$
def MAE(y, t):
return (abs(y - t)).mean(axis=None)
3. MSE(Mean Squared Error)
MSE(Mean Squared Error)는 오차의 제곱을 평균으로 나눈 것인데, 예측값과 실제값 차이의 면적의 평균이라고 할 수 있다. 오차를 제곱하기 때문에 이상치에 민감하다. 또한 1미만의 에러는 더 작아지고, 그 이상의 에러는 더 커진다. 예측 변수와 단위가 다르다는 단점도 있다. 예를 들어 기온을 예측하는 모델의 MSE가 4이라면 이 모델은 평균적으로 2도 정도를 잘못 예측하는 것으로 보아야 한다. 결국 제곱을 씌우게 되어 underestimates/overestimates인지 파악하기 힘들며 MAE처럼 스케일에 의존적이다. MSE 기반 방식은 모두 underestimates/overestimates 파악이 힘들다.
오차제곱합(SSE)와 유사하지만 오차제곱합으로는 실제 오차가 커서 값이 커지는 것인지 데이터의 양이 많아서 값이 커지는 것인지를 구분할 수 없게 된다.
def MSE(y, t):
return ((y-t)**2).mean(axis=None)
def SSE(y, t):
return 0.5*np.sum((y-t)**2)
4. MSLE(Mean Squared Log Error)
MSLE(Mean Squared Log Error)는 MSE에 로그를 적용한 것이다. 결정 값이 클수록 오류값도 커지기 때문에 일부 큰 오류값들로 인해 전체 오류값이 커지는 것을 막아준다.
def MSLE(y, t):
return np.log((y-t)**2).mean(axis=None)
5. RMSE(Root Mean Squared Error)
RMSE(Root Mean Squared Error)는 MSE값에 루트를 씌운 값이다. 지표 자체가 직관적이며 예측변수와 단위가 같다.
예를 들어 기온을 예측하는 모델의 RMSE가 5라면 이 모델은 평균적으로 5 정도를 잘못 예측하는 것이라 볼 수 있다. MAE와 비슷해보이지만 전체 오류를 모두 더한 다음 root를 씌운다. RMSE 또한 스케일에 의존적이며 제곱 후 루트를 씌우기 때문에 MAE처럼 실제 값에 대해 underestimates/overestimates인지 파악하기 힘들다.
def RMSE(y, t):
return np.sqrt(((y - t) ** 2).mean(axis=None))
6. RMSLE(Root Mean Squared Log Error)
RMSLE(Root Mean Squared Log Error)는 RMSE값에 로그를 취한 값이다. 결정 값이 클 수록 오류 값도 커지기 때문에 일부 큰 오류 값들로인해 전체 오류값이 커지는 것을 막아준다.
$$ RMSLE=log(\sqrt{\frac{\sum_{i=1}^{n}(Y_i-\hat{Y_i})^2}{n}} $$
def RMSLE(y, t):
return np.log(np.sqrt(((y - t) ** 2).mean(axis=None)))
7. MPE(Mean Percentage Error)
MPE(Mean Percentage Error)는 RMSE와 MAE 같은 지표들은 모두 참값과 예측값의 절대적인 예측오차에 기반해 예측오차의 크기를 나타내는 지표이다. 그러나 예측오차는 절대적인 의미의 예측오차뿐 아니라 상대적인 의미의 예측오차가 필요할 경우에도 발생하는데, 예를 들어 참값 10에 대한 예측오차 1과 참값 100에 대한 예측오차 1의 경우, 같은 예측오차가 1이라도 상대적인 의미의 오차 크기는 다르다. 하지만 모델이 underestimates/overestimates인지 판단할 수 있다는 장점이 있다.
$$ MPE=\frac{\sum _{i=1}^n\frac{Y_i-\hat{Y_i}}{Y_i}\cdot 100}{n} $$
def MPE(y, t):
return (((y-t)/y)*100).mean(axis=None)
8. MAPE(Mean Absolute Percentage Error)
MAPE(Mean Absolute Percentage Error)는 MPE는 예측오차를 단순히 합계를 내었기 때문에 전체적인 크기를 제대로 산정할 수 없다. 오차는 음수, 양수가 있기 때문에 합계를 내면 0이 되는 경우가 존재하기 때문이다. MAPE(Mean of Absolute Percentage Errors)는 그러한 문제점을 개선한 지표로 예측오차에 절대값을 씌어서 계산한다. 하지만 절대값이 들어가며 underestimates/overestimates인지 판단할 수 없어졌다.
$$ MAPE=\frac{\sum_{i=1}^n|\frac{Y_i-\hat{Y_i}}{Y_i}|\cdot 100}{n} $$
def MAPE(y, t):
return ((abs((y-t)/y))*100).mean(axis=None)
9. MASE(Mean Absolute Scaled Error)
MASE(Mean Absolute Scaled Error)는 데이터를 척도화하여 이를 기준으로 예측오차의 절대값에 대한 평균을 낸 값이다. 따라서 MASE는 스케일에 대한 의존성이 낮다는 장점이 있다.
$$ MASE=\frac{1}{n}\sum _{\ i=1}^{n\ }\left(\frac{\left|{e_i}\right|}{\frac{1}{n-1}\sum _{\ i=2}^{n\ }\left|{Y_i-Y_{i-1}}\right|}\right)=\frac{\sum _{\ i=1}^{\ n}\left|{e_i}\right|}{\frac{n}{n-1}\sum _{\ i=2}^{\ n}\left|Y_i-Y_{i-1}\right|} $$
def MASE(y, t):
n = len(y)
d = np.abs(np.diff(y)).sum() / (n - 1)
errors = abs(y-t)
return errors.mean(axis=None)/d
모두 유용하지만 가장 자주 쓰인다고 생각되는 평가 지표는 MAE, MSE, RMSE, MAPE 이 네 가지이다.
이외에도 종류는 많으니 자신의 상황에 맞게 잘 적용해 사용하면 될듯하다.
관련 포스트
2024.10.26 - [Data Science/ML & DL] - 손실 함수(Loss Function)와 모델 유형 및 분야 별 적용 방법
참고 자료
https://mizykk.tistory.com/102
https://m.blog.naver.com/gisookhyun/222015867569
https://blog.naver.com/PostView.nhn?blogId=wnstn0154&logNo=221835861559
https://mizykk.tistory.com/102
https://m.blog.naver.com/pmw9440/221813530210
소스 코드