관리 메뉴

귀퉁이 서재

머신러닝 - 17. 회귀 평가 지표 본문

머신러닝

머신러닝 - 17. 회귀 평가 지표

데이터 파수꾼 Baek Kyun Shin 2019. 12. 6. 12:19

회귀의 평가를 위한 지표는 실제 값과 회귀 예측값의 차이를 기반으로 합니다. 회귀 평가지표 MAE, MSE, RMSE, MSLE, RMSLE는 값이 작을수록 회귀 성능이 좋은 것입니다. 값이 작을수록 예측값과 실제값의 차이가 없다는 뜻이기 때문입니다. 반면, R² 는 값이 클수록 성능이 좋습니다.

각 회귀 평가지표 별 구하는 공식은 아래와 같습니다. 캐글 회귀 문제에서도 아래의 평가 지표가 자주 사용됩니다.

MAE (Mean Absolue Error)

실제 값과 예측 값의 차이를 절댓값으로 변환해 평균한 것

MSE (Mean Squared Error)

실제 값과 예측 값의 차이를 제곱해 평균한 것

RMSE (Root Mean Squared Error)

MSE 값은 오류의 제곱을 구하므로 실제 오류 평균보다 더 커지는 특성이 있어 MSE에 루트를 씌운 RMSE 값을 쓰는 것입니다.

MSLE (Mean Squared Log Error)

MSE에 로그를 적용해준 지표입니다. log(y)가 아니라 log(y+1)입니다. y=0일 때, log(y)는 마이너스 무한대이므로 이를 보정해주기 위해 +1을 한 것입니다. 

RMSLE (Root Mean Squared Log Error)

RMSE에 로그를 적용해준 지표입니다.

R² (R Sqaure)

분산 기반으로 예측 성능을 평가합니다. 1에 가까울수록 예측 정확도가 높습니다.

R² = 예측값 Variance / 실제값 Variance

RMSE와 비교해서 RMSLE가 가진 장점

1. 아웃라이어에 강건해진다.

RMSLE는 아웃라이어에 강건(Robust)합니다. 예를 들어보겠습니다.

예측값 = 67, 78, 91, 실제값 = 60, 80, 90일 때, RMSE = 4.242, RMSLE = 0.6466입니다.

예측값 = 67, 78, 91, 102, 실제값 = 60, 80, 90, 750일 때 RMSE = 374.724, RMSLE = 1.160입니다. 750이라는 아웃라이어 때문에 RMSE는 굉장히 증가했지만 RMSLE의 증가는 미미합니다. RMSLE는 아웃라이어가 있더라도 값의 변동폭이 크지 않습니다. 따라서 RMSLE는 아웃라이어에 강건하다고 말할 수 있습니다.

2. 상대적 Error를 측정해준다.

예측값과 실제값에 로그를 취해주면 로그 공식에 의해 아래와 같이 상대적 비율을 구할 수 있습니다.

예측값 = 100, 실제값 = 90일 때, RMSLE = 0.1053, RMSE = 10입니다.

예측값 = 10,000, 실제값 = 9,000일 때, RMSLE = 0.1053, RMSE = 1,000입니다.

보시는 바와 같이 값의 절대적 크기가 변하더라도 상대적 크기가 동일하다면 RMSLE 값도 동일합니다. 반면, 상대적 크기가 동일하더라도 절대적 크기가 변하면 RMSE 값은 변합니다. 따라서 RMSE와 달리 RMSLE는 예측값과 실제값의 상대적 Error를 측정해줍니다.

3. Under Estimation에 큰 패널티를 부여한다.

RMSLE는 Over Estimation보다 Under Estimation에 더 큰 패널티를 부여합니다. 즉, 예측값이 실제값보다 클 때보다 예측값이 실제값보다 작을 때 더 큰 패널티를 부여합니다.

예측값 = 600, 실제값 = 1,000일 때 RMSE = 400, RMSLE = 0.510입니다.

예측값 = 1,400, 실제값 = 1,000일 때 RMSE = 400, RMSLE = 0.33입니다.

예측값과 실제값의 차이는 둘 다 400입니다. Over Estimation이든 Under Estimation이든 RMSE값은 동일합니다. 하지만 RMSLE는 Under Estimation일 때 (즉, 예측값이 실제값보다 작을 때) 더 높은 페널티가 주어집니다. 배달 음식을 시킬 때 30분이 걸린다고 했는데 실제로 20분이 걸리는 건 큰 문제가 되지 않지만, 30분이 걸린다고 했는데 40분이 걸리면 고객이 화가 날 수 있습니다. 이럴 때 RMSLE를 적용할 수 있습니다.

Python 예제

각 회귀 평가 지표는 sklearn을 통해 간단히 구현할 수 있습니다. MSLE, RMSLE를 사용할 때는 예측값이나 실제값에 음수가 있으면 오류가 날 수 있으니 주의하시기 바랍니다. 

import numpy as np
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error, mean_squared_log_error

origin = np.array([1, 2, 3, 2, 3, 5, 4, 6, 5, 6, 7])
pred = np.array([1, 1, 2, 2, 3, 4, 4, 5, 5, 7, 7])


MAE =  mean_absolute_error(origin, pred)
# MAE = 0.45454545454545453

MSE = mean_squared_error(origin, pred)
# MSE = 0.45454545454545453

RMSE = np.sqrt(MSE)
# RMSE = 0.674199862463242

MSLE = mean_squared_log_error(origin, pred)
# MSLE = 0.029272467607503516

RMSLE = np.sqrt(mean_squared_log_error(origin, pred))
# RMSLE = 0.1710919858073531

R2 = r2_score(origin, pred)
# R2 = 0.868421052631579

References

Reference1: 파이썬 머신러닝 완벽가이드 (권철민 저)

Reference2: Medium (What's the difference between RMSE and RMSLE?)

 

 

6 Comments
  • 프로필사진 honey butt 2020.03.04 19:14 신고 질문이 있는데 RMSLE에서 패널티를 준다, 패널티를 덜 준다 등 '패널티'라는 말을 쓰는데 구체적으로 여기서 말하는 패널티가 뭔지 모르겠어요. 혹시 답변 주실 수 있나요
  • 프로필사진 데이터 파수꾼 Baek Kyun Shin 2020.03.04 20:54 신고 안녕하세요. 또 방문해주셔서 감사합니다. ^^

    패널티에 대해 자세히 설명드리겠습니다.

    우리가 미래의 어떤 현상을 예측을 한다고 할 때, 그 예측치가 실제와 항상 일치하지는 않습니다. 위 글에서도 언급했던 배달 음식을 예로 들어보겠습니다.

    제가 배달의 민족에서 18시에 음식을 주문했는데 "음식의 도착 예정 시간은 18시 50분입니다"라는 카톡 알림이 왔다고 합시다. 배민에서 음식의 도착 예정 시간을 예측해서 알려주는 것입니다.
    음식의 조리 시간과 식당으로부터 집까지 배달하는데 걸리는 시간을 계산해 18시 50분이라고 예측을 해서 알려준 겁니다.

    하지만 실제로 음식이 도착한 시간이 19시이면 저는 화가 나겠죠. 18시 50분에 올 줄 알았는데 10분이나 늦었으니 말이죠. 근데 반대로 18시 40분에 도착했다고 합시다. 그러면 저는 "어? 생각보다 빨리왔네?"라며 크게 싫어하진 않겠죠.

    자 여기서 음식의 도착 예정 시간은 18시 50분입니다. 첫번째 케이스인 경우 실제 도착 시간은 19시이고, 두번째 케이스인 경우 실제 도착 시간은 18시 40분입니다.

    도착 예정 시간과 실제 도착 시간의 Error는 두 케이스 모두 10분입니다.

    이제 배민 개발자 입장이 되어봅시다. 도착 예정 시간을 예측하는 알고리즘을 만들어야 합니다.
    실제 도착 시간이 19시, 18시 40분인 경우가 있다면 도착 예정 시간을 18시 50분으로 하는 것보다는
    18시 55분으로 하는 게 좀 더 괜찮을 수도 있습니다.

    "음식의 도착 예정 시간은 18시 55분입니다"라는 메시지를 받은 사람은
    음식이 19시에 도착을 해도 5분 정도 밖에 안 늦었으니 이해해줄거고, 18시 40분에 도착을 해도 생각보다 빨리 받아 좋아할 겁니다.

    18시 50분으로 예측한 머신러닝 알고리즘을 18시 55분으로 바꾸려면 알고리즘에게
    "너 잘못 예측했어! 예측치를 좀 바꿔봐!"라고 말해줘야 합니다.

    19시에 도착했을 때는 "야! 너 정말 잘못 예측했어! 제대로 해봐!!"라고 아주 많이 꾸짖고
    18시 40분에 도착했을 때는 "예측은 잘못했는데, 뭐 그정도는 괜찮아"라고 말했다고 합시다.

    그러면 알고리즘 입장에서는 19시에 도착했을 때 더 많은 꾸짖음을 받으니 19시 쪽과 Error가 더 적어지도록 예측치를 수정할 겁니다.
    그래서 18시 50분으로 예측하던 걸 18시 55분으로 수정하게 됩니다. (55분은 하나의 예시일뿐, 51분으로 바꿀 수도 있고 59분으로 바꿀 수도 있고 세부적인 건 달라지겠죠)

    이때 이 알고리즘을 꾸짖는 정도를 "패널티"라고 표현합니다.
  • 프로필사진 데이터 파수꾼 Baek Kyun Shin 2020.03.04 20:57 신고 이렇게 패널티는 머신러닝 알고리즘을 꾸짖어 더 정확한 예측을 하도록 합니다. 패널티가 크면(꾸짖음의 정도가 크면) 패널티를 줄이려고 수정을 많이 하고, 패널티가 작으면(꾸짖음의 정도가 작으면) 알고리즘을 크게 수정하려고 하지 않습니다.
    패널티는 이런 방식으로 사용됩니다. 이해가 잘 되셨는지 모르겠네요 ㅎㅎ
  • 프로필사진 honey butt 2020.03.04 21:11 신고 맙소사....솔직히 이렇게까지 정성스럽게 답변해주실지 몰랐는데 좀 심하게 감동받았습니다. 그리고 마지막에 입이 벌어졌습니다. 저를 이해시키시다니... 이런쪽에 이해도가 느린편인데 한 번 읽고 이해될 정도로 설명을 너무 잘해주셔서요.. 혹시 데이터 사이언스 티칭을 업으로 하고 계신가요? 어떻게 그렇게 쉽게 예를 들어 설명해주실 수 있나요. 저는 이공계열이 전혀 아니지만 요즘 데이터 사이언스에 관심이 생겨 인터넷 강의를 듣고 있습니다. 그런데 인터넷 강의여서 그런지 질문이 생길 때 마다 해소하기가 어렵고 검색으로도 한계가 느껴지더라고요. 영어설명이 많아 읽기 힘들기도 하구요 -0-; 요즘 캐글의 바이크 쉐어링 디멘딩을 풀며 예측 공식등 다양한 정보를 보고 있지만 모든게 낯선 사람한텐 한 번에 이해하기가 어렵더라고요. 이 정도 답변이면 수업료를 내야 할 정도인 것 같은데 무료수업을 받은 것 같아 송구하네요. 블로그에 광고라도 누르면 작게나마 도움이 될까요? 앞으로 스승님으로 모시겠습니다.
  • 프로필사진 형민 2021.06.22 15:49 지금 해결하고있는 도메인 문제에서 딱 필요한 방식이 RMSLE의 특성에 맞네요. 좋은 글 감사합니다!
  • 프로필사진 데이터 파수꾼 Baek Kyun Shin 2021.06.22 18:14 신고 RMSLE를 많이 쓰는 것 같아요. 읽어주셔서 감사합니다 :)
댓글쓰기 폼