내 예측 모델이 맞춘 값이 얼마나 정확한 거지?
이번 포스팅에선, 시계열 예측에서 자주 활용하는
Regression 데이터 예측 모델을 평가하는 법에 대해서 설명드리겠습니다.
우리가 예측 모델을 트레이닝 시킬 때, 예측 모델은 크게 두 가지로 나눠볼 수 있습니다. 하나는 Classification, 그리고 하나는 Regression 입니다. 고양이와 개를 분류하는 모델은 Classification 모델입니다. 그리고 상품의 판매량 혹은 주식의 가격을 예측하는 모델은 Regression 모델입니다.
Classification Model, 분류 모델은 트레이닝 시킨 모델이 분류를 잘 했는지 못했는지 판단하기는 아주 명확합니다. 고양이를 고양이라고 분류하면 맞은 거고, 고양이를 강아지로 분류하면 틀린 겁니다.
그런데, 문득 궁금한 점이 생겼습니다.
내가 Regression Model로 예측한
실수 값(Real number)의 정확도는 어떻게 측정할 수 있을까?
예를 들어, 예측 모델 A가 삼성전자 주식의 2020-01-01 가격을 1,000,000으로 예측했는데, 실제 가격이 1,020,000원 이라면, 이 모델은 틀린걸까요? 조금 애매해지죠? 만약 또 다른 예측 모델 B의 예측 값이 700,000 원이라면, 예측 값 자체는 모델 A의 1,000,000원이나 700,000원 둘 다 실제 값 1,020,000원을 맞추는 데 실패했습니다. 실제 가격은 1,020,000원이었는데, 둘다 정확한 가격을 맞추지는 못했죠. 그렇다면, 이 두 모델은 둘 다 실패작인가요?
음.. 수치(실수 값)를 예측하는 모델은 Accuracy를 구하는 것이 조금 애매합니다. 그렇지 않나요? 그럼 어떤 값을 가지고 정확도를 측정해야할까요? 여러 Regression 예제나 튜토리얼을 따라하다 보시면, Accuracy 대신에 RMSE 라는 단어를 발견하게 되실 것입니다.
RMSE의 공식은 아래와 같습니다. 말로 풀어보자면, 예측값과 실제값을 뺀 후 제곱시킨 값들을 다 더하고, n으로 나눕니다. 그리고 루트를 씌웁니다. 공식을 보면 아실 수 있겠지만, 우리가 고등학교 때 배운, 평균 제곱근 편차 or 표준편차(Standard Deviation)와 공식이 같습니다.
참고로, Python와 sklearn으로 RMSE를 구하는 법은 아래와 같습니다.
from sklearn.metrics import mean_squared_error
RMSE = mean_squared_error(y, y_pred)**0.5
RMSE는 모델의 예측 값과 실제 값의 차이를 하나의 숫자로 표현할 수 있습니다. Regression 모델의 손실 함수(Loss function)으로 우리는 RMSE와 거의 비슷한 MSE(Mean Squared Error)를 사용할 수 있습니다. 아래 Keras 코드 처럼요.
model.compile(loss='mean_squared_error', optimizer='adam')
Regression 모델의 잘 트레이닝 되었는지, 판단하는 기준으로 RMSE를 쓸 수 있는 거죠. 그럼 이 Error만 알면 다 해결되는건가요? 물론 이 RMSE가 대표적인 에러 값입니다만, 단점이 있습니다. 바로, 이 RMSE는 예측 대상의 크기에 영향을 바로 받게 됩니다. 예를 들어볼까요? 네이버 주가와 삼성전자 주가 예측의 RMSE를 생각해봅시다.
삼성전자의 주가가 2,389,000원 입니다. 그리고 NAVER의 주가는 778,000원 입니다. 그리고 우리가 삼성전자의 주식을 예측하는 모델을 만들었다고 칩시다. 그리고 삼성전자 주가를 예측하는 데 활용해보았더니, RMSE가 500,000이 나왔다고 합시다.
그리고, NAVER의 주가를 예측하는 모델을 만든 후 NAVER의 주가를 예측했는 데 RMSE가 놀랍게도 똑같이 500,000이 나왔다면.. 이 두 모델은 동일한 성능을 가지고 있는 걸까요?
명확하게 이상한 점을 느끼실 거에요. 삼성전자의 500,000와 NAVER의 500,000은 다릅니다.
에러가 예측하려는 값의 크기에 의존적이라는 면에서 RMSE는 크기 의존적 에러(Scale-dependent Errors)에 속하게 됩니다.
MAPE는 크기 의존적 에러의 단점을 커버하기 위한 모델입니다. MAPE의 공식은 아래와 같습니다.
At 는 실제 값이고, Ft 는 예측 값입니다.
MAPE는 예측 값과 실제 값을 뺀 후 이를 실제 값으로 나눈 값을 모두 더한 후에 n으로 나눕니다. 그리고 백분율로 표현하기 위해 100을 곱합니다.
그럼 다시, 삼성전자와 NAVER 주가로 돌아가보겠습니다. 삼성전자와 NAVER의 RMSE가 둘 다 500,000이었습니다. 하지만, MAPE를 기준으로 평가를 해보게 되면, NAVER의 주가를 예측하는 모델보다 삼성전자의 주가를 예측하는 모델이 더 잘 작동한다는 사실을 알 수 있습니다. 왜냐하면, 오차 변동폭을 실제 값으로 나눠보면 비율 상 같은 기준으로 비교할 수 있게 되고, RMSE는 같지만 오차의 변동 폭은 NAVER 주가를 예측하는 모델이 삼성전자 예측 모델보다 더 변동성이 심하다는 걸 알 수 있습니다.
그럼, 이 MAPE가 끝판왕인가요? 아니요. 이 평가 기준도 역시 단점이 있습니다. 문제가 생기는 지점은 바로, At 실제 값이 1보다 작을 때 발생합니다. 실제 값이 1보다 작기 때문에, 자칫하면 MAPE는 무한대에 가까운 값을 찍을 수 있게 됩니다. 또한, 실제 값이 0이라면, MAPE 값 자체를 계산 할 수 없게 됩니다.
또 하나의 에러는 MASE입니다. 이 에러 수치는 접근 방법은 RMSE와 MAPE와 다릅니다. 이 MASE 에러는 바로 예측 값과 실제 값의 차이를 평소에 움직이는 평균 변동폭으로 나눈 값입니다. 아까 MAPE가 오차를 실제 값으로 나누었지만, MASE 는 평소에 변동폭에 비해 얼마나 오차가 차이가 나는지를 측정하는 기준이라 볼 수 있습니다.
이 MASE는 변동성이 큰 지표와 변동성이 낮은 지표를 같이 예측할 필요가 있을 때, 유용하게 쓰일 것 같습니다.
이러한 에러의 기준들은 Keras나 Tensorflow에서 loss function으로 설정할 수 있습니다.
사이트에 가보시면, mean_squared_error와 mean_absolute_percentage_error는 보이네요.
음, Regression 모델의 예측 정확도를 측정하는 방법들을 몇가지 설명드려보았습니다. 물론 여기에 있는 것들이 전부는 아닙니다. r2 score도 있고 여러 가지 기준이 많습니다. 시간 되실때마다 하나씩 공부해보시면 좋을 것 같습니다. 문제의 특성에 맞는 좋은 loss function을 선택할 수 있다면 모델의 성능도 자연스럽게 올릴 수 있게 됩니다.
본격적으로 Regression 모델을 트레이닝 시키실 필요가 있으시다면, 단순히 예제들을 따라하는 수준을 넘어서 이런 주제들에 대해 공부하시는 게 도움이 되실겁니다. 각 에러들의 장단점을 이해하신다면 좋은 Regression 모델을 만들어나가는 방향을 잡는 데 도움이 될 거라 믿습니다.
1. Forecasting: principles and practice - 2.5 Evaluating forecast accuracy, https://www.otexts.org/fpp/2/5
2. Keras Usage of loss functions - https://keras.io/losses/
3. MASE(Mean Absolute Scaled Error) - https://en.wikipedia.org/wiki/Mean_absolute_scaled_error
4. RMSE(Root Mean Squared Error) - https://en.wikipedia.org/wiki/Root-mean-square_deviation
5. MAPE(Mean Absolute Percentage Error) - https://en.wikipedia.org/wiki/Mean_absolute_percentage_error