2020년 10월 11일 일요일

mse, rmse, rmsle, mean_squared_error, python

MSE(Mean squared error)

전체 에러를 표현하기 위해서 사용하는 식입니다.

오차의 제곱에 대해 평균을 취한 것입니다. 수치가 작을 수록 원본과의 오차가 적은 것입니다.

식은 아래와 같습니다.


https://en.wikipedia.org/wiki/Mean_squared_error

제곱을 해서 더하는 이유는 제곱을 하지 않으면 오차들의 부호에 의해서 오차의 크기가 사라질 수 있기 때문입니다. 즉, 오차라는것은 목표값에 대한 차이이므로 -5 , 5 가 각각 오차라고 할때 합하게 되면 오차는 0이 되어버리게 됩니다. 이런 부호로 인한 오차를 의미를 없애고자 오차에 제곱을 하게 됩니다.

python에서는 sklearn에 mean_squared_error 함수가 있습니다.


RMSE(Root mean squared error)

MSE에 제곱근을 씌운값입니다. 제곱근을 씌우는 이유는 MSE를 만들때 제곱을 하였기 때문에 실제 오차값이 제곱이 되어 있기 때문입니다.


예를 들어보겠습니다.

testdata.csv

Y,PY
0.5,1


testmse.py

import pandas as pd
from sklearn.metrics import mean_squared_error

df = pd.read_csv('testdata.csv', header=0, encoding='utf8')
rmse = mean_squared_error(df['PY'], df['Y'],squared=False)
mse = mean_squared_error(df['PY'], df['Y'])
rmse_2 = mse ** 0.5
print('mse',mse,'rmse',rmse)
print('rmse',rmse_2)

0.5와 1의 차이는 -0.5가 됩니다. 즉 error는 -0.5이며, 이것의 제곱이 MSE가 됩니다. 즉 MSE = 0.25

이것에 RMSE를 구하기 위해서는 제곱근을 취합니다. squared=False 인자를 넘겨도 되고 **0.5를 곱해서 root 를 연산을 합니다. 그래서 RMSE = 0.5 가 됩니다.

결과

mse 0.25 rmse 0.5
rmse 0.5

처음으로 돌아와서 0.5, 1의 차이 값이 RMSE 라고 보면 됩니다. 그래서 MSE보다는 RMSE가 실제 차이에 더 가깝습니다.


RMSLE(Root mean squared Logarithmic error)

중간에 로그를 취해서 편차를 구하는것이 rmsle입니다.



이번에는 test data를 아래와 같이 변경해 보았습니다.

testdata.csv

Y,PY
50,100

결과

mse 2500.0 rmse 50.0
rmse 50.0

0.5, 1 했을때와 비교해볼때 엄청난 차이가 납니다.

그래서 중간에 log를 취해준것이 rmsle가 됩니다. 

코드는 아래와 같이 변형 하였습니다.

rmsle.py

import pandas as pd
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_squared_log_error

df = pd.read_csv('testdata.csv', header=0, encoding='utf8')
rmse = mean_squared_error(df['PY'], df['Y'],squared=False)
mse = mean_squared_error(df['PY'], df['Y'])
msle = mean_squared_log_error(df['PY'], df['Y'])

print('mse',mse,'rmse',rmse)
print('rmse',mse**0.5)
print('msle',msle)
print('rmsle',msle**0.5)


50, 100 일때

mse 2500.0 rmse 50.0
rmse 50.0
msle 0.4668918986603742
rmsle 0.683294884116934

0.5, 1 일때

mse 0.25 rmse 0.5
rmse 0.5
msle 0.08276097481015171
rmsle 0.2876820724517809


결과적으로 오류가 원본에 비해서 차이가 많이 나긴 하지만, scale이 많이 차이남에도 불구하고 제일 작음을 알 수 있습니다.


 





댓글 없음:

댓글 쓰기