LLM 엔지니어링1장 · 머신러닝 프로세스와 기본 개념13 / 23← 이전목차다음 →MetaContents

1장. 머신러닝 프로세스와 기본 개념

회귀의 지표

배송 예정일을 맞히는 일을 떠올려 보세요. 하루 빗나간 것과 사흘 빗나간 것은 무게가 다릅니다. 숫자를 맞히는 회귀에서는 "맞혔다, 틀렸다" 대신 "얼마나 빗나갔나"를 잽니다.

세 주문의 빗나간 크기와 그 제곱을 막대로 견주어 MAE 와 RMSE 의 차이를 보여 주는 개념 그림

왼쪽 막대는 주문 세 건의 빗나간 크기(0.5일, 0일, 2일)이고, 오른쪽은 그 제곱입니다. 제곱하면 2일 빗나간 것이 4 로 커져서 혼자 두드러집니다. MAE 는 왼쪽의 평균이고, RMSE 는 오른쪽의 평균에 제곱근을 씌운 값입니다.

이름 풀이: 무엇의 약자인가

두 이름은 영어 낱말의 첫 글자를 모은 약자입니다. 이름을 뒤에서부터 읽으면 그대로 계산 차례가 됩니다.

약자(우리말)영어뒤에서부터 읽은 계산 차례
MAE(평균 절대 오차)Mean Absolute Error오차(Error)를 구해 → 절댓값(Absolute)을 씌우고 → 평균(Mean)을 낸다
RMSE(평균 제곱근 오차)Root Mean Squared Error오차(Error)를 구해 → 제곱(Squared)하고 → 평균(Mean)을 내고 → 제곱근(Root)을 씌운다

낱말의 뜻은 이렇습니다. 오차는 "실제 − 예측", 곧 빗나간 만큼입니다. 절댓값은 부호를 떼어 크기만 남기는 것(−0.5 → 0.5)이고, 제곱은 같은 수를 두 번 곱하는 것(2 → 4), 제곱근은 제곱을 되돌리는 것(4 → 2)입니다.

두 지표

지표계산특징어울리는 때
MAE빗나간 크기의 평균단위가 정답과 같아 읽기 쉽다평균적으로 얼마나 틀리는지 알리고 싶을 때
RMSE빗나간 크기를 제곱해 평균 낸 뒤 제곱근크게 빗나간 것을 더 무겁게 본다크게 틀리는 일을 특히 피하고 싶을 때
Python
from sklearn.metrics import mean_absolute_error, root_mean_squared_error

days_true = [2, 3, 5]       # 실제 배송일수
days_pred = [2.5, 3, 3]     # 모델의 예측

# 두 함수 모두 (실제, 예측) 순서로 넣는다
print(round(mean_absolute_error(days_true, days_pred), 3))
print(round(root_mean_squared_error(days_true, days_pred), 3))

빗나간 크기는 0.5, 0, 2 일입니다. MAE 는 평균인 0.833 일이고, RMSE 는 2일 빗나간 것을 무겁게 쳐서 1.19 일로 더 큽니다.

손으로 따라 계산하기

위의 주문 세 건을 이름의 차례대로 한 칸씩 계산해 봅니다.

주문실제(일)예측(일)오차(실제 − 예측)절댓값제곱
122.5−0.50.50.25
233000
353224
평균0.50.833(= MAE)1.417
  • MAE: 절댓값 칸의 평균입니다. (0.5 + 0 + 2) ÷ 3 = 0.833 일입니다. "예측이 평균 0.833 일, 하루가 조금 안 되게 빗나간다"고 읽습니다.
  • RMSE: 제곱 칸의 평균 1.417 에 제곱근을 씌웁니다. √1.417 = 1.19 일입니다. 제곱근을 씌우는 까닭은 제곱하며 "일×일"이 된 단위를 다시 "일"로 돌려 MAE 와 견줄 수 있게 하려는 것입니다.
  • 왜 오차를 그냥 평균 내지 않나: 오차 칸을 그대로 평균 내면 −0.5 와 +2 가 서로 깎여 0.5 로 작아집니다. 늦게 예측한 것과 일찍 예측한 것이 서로를 지워 버리는 것입니다. 그래서 절댓값이나 제곱으로 부호를 없앤 뒤 평균을 냅니다.
  • 두 값의 차이: 제곱 칸에서는 2일 빗나간 주문이 4 가 되어 혼자 커집니다. 그래서 RMSE(1.19)가 MAE(0.833)보다 큽니다. 크게 빗나간 주문이 많을수록 둘의 차이가 벌어집니다.
Python
import numpy as np

days_true = np.array([2, 3, 5])        # 실제 배송일수
days_pred = np.array([2.5, 3, 3])      # 모델의 예측

error = days_true - days_pred          # 오차: [-0.5, 0, 2]
# 이름을 뒤에서부터 읽은 차례대로 계산한다
mae = np.abs(error).mean()             # 절댓값 → 평균
rmse = np.sqrt((error ** 2).mean())    # 제곱 → 평균 → 제곱근
# 결과: 그냥 평균(서로 깎인 값), MAE, RMSE. 뒤의 둘은 sklearn 함수의 값과 같다
print(round(error.mean(), 3), round(mae, 3), round(rmse, 3))

코드에 나오는 함수

코드쉬운 뜻
mean_absolute_error(실제, 예측)MAE 를 계산한다. 빗나간 크기의 평균이다
root_mean_squared_error(실제, 예측)RMSE 를 계산한다. 빗나간 크기를 제곱해 평균 내고 제곱근을 씌운다
np.abs(error)abs 는 absolute(절댓값)의 줄임말이다. 칸마다 부호를 뗀다
error ** 2칸마다 제곱한다
.mean()배열의 평균을 낸다
np.sqrt(...)sqrt 는 square root(제곱근)의 줄임말이다

이 코드가 뜻하는 것

양궁 과녁에 화살 세 발을 쏜 뒤, 화살이 가운데에서 얼마나 떨어졌는지 자로 재는 일입니다. 여기서 과녁의 가운데가 실제 배송일수, 화살이 꽂힌 곳이 예측, 자로 잰 거리가 빗나간 크기입니다. 비유와 다른 점은, 과녁에서는 사방으로 빗나가지만 배송일수는 "일찍"과 "늦게" 두 쪽으로만 빗나간다는 것입니다.

줄하는 일쉽게 말하면
days_true, days_pred실제와 예측을 적는다과녁의 가운데와 화살 세 발
error = days_true - days_pred칸마다 빗나간 만큼을 구한다화살마다 가운데에서 얼마나 벗어났나
np.abs(error).mean()부호를 떼고 평균 낸다(MAE)세 발의 거리를 평균 낸다
np.sqrt((error ** 2).mean())제곱해 평균 내고 제곱근(RMSE)멀리 빗나간 화살에 벌점을 더 주고 평균 낸다
error.mean()부호를 그대로 둔 평균왼쪽과 오른쪽 빗나감이 서로 지워진 값

0.5, 0.833, 1.19 는 차례로 "서로 지워진 값", "평균으로 빗나간 크기", "크게 빗나간 것을 무겁게 친 크기"입니다. 그냥 평균 0.5 는 실제보다 잘 맞힌 것처럼 보이게 하므로 쓰지 않습니다.

작게 줄여서 눈으로 보기

MAE 가 같아도 RMSE 는 다를 수 있습니다. 실제 배송일수 네 건에 대해, 설명을 위해 지어낸 두 가지 예측을 견줍니다.

Python
from sklearn.metrics import mean_absolute_error, root_mean_squared_error

days_true = [2, 3, 5, 4]
pred_even = [3, 4, 6, 5]    # 네 건 모두 하루씩 빗나감
pred_one = [2, 3, 5, 8]     # 세 건은 딱 맞고, 한 건만 나흘 빗나감

for name, pred in [("고르게 빗나감", pred_even), ("한 건만 크게", pred_one)]:
    mae = mean_absolute_error(days_true, pred)
    rmse = root_mean_squared_error(days_true, pred)
    print(name, "MAE", round(mae, 3), "RMSE", round(rmse, 3))
출력
고르게 빗나감 MAE 1.0 RMSE 1.0
한 건만 크게 MAE 1.0 RMSE 2.0
결과읽는 법
고르게 빗나감 MAE 1.0 RMSE 1.0모든 주문이 똑같이 하루씩 빗나가면 두 지표가 같다
한 건만 크게 MAE 1.0 RMSE 2.0빗나간 크기의 합은 4일로 같아 MAE 는 같지만, 나흘 빗나간 한 건 때문에 RMSE 가 두 배가 된다

MAE 만 보면 두 모델이 똑같아 보입니다. 고객에게 나흘이나 틀린 안내를 하는 일을 피하고 싶다면 RMSE 가 그 차이를 알려 줍니다.

주의할 점

  • 두 지표 모두 작을수록 좋습니다. 분류의 정확도처럼 클수록 좋은 점수와 헷갈리지 않습니다.
  • RMSE 가 MAE 보다 훨씬 크면 크게 빗나간 주문이 몇 건 섞여 있다는 신호입니다. 그 주문들을 따로 꺼내 봅니다.
← 이전 절1장 · 기준값 바꾸기다음 절 →1장 · 실습 지도