본문으로 건너뛰기

043 회귀 평가 지표 - MAE, MSE, RMSE

키워드: MAE, MSE, RMSE

개요

회귀 모델의 성능을 평가하는 핵심 지표들을 이해해야 올바른 모델을 선택할 수 있습니다. 이 글에서는 MAE, MSE, RMSE의 개념과 활용법을 다룹니다.

실습 환경

  • Python 버전: 3.11 권장
  • 필요 패키지: pycaret[full]>=3.0

기본 개념: 잔차 (Residual)

잔차 = 실제값 - 예측값
= yᵢ - ŷᵢ

모든 오차 지표는 잔차를 기반으로 계산됩니다.

MAE (Mean Absolute Error)

잔차 절댓값의 평균:

MAE = (1/n) × Σ|yᵢ - ŷᵢ|
import numpy as np

y_true = np.array([100, 150, 200, 250, 300])
y_pred = np.array([110, 140, 220, 230, 310])

# 043 MAE 계산
mae = np.mean(np.abs(y_true - y_pred))
print(f"MAE: {mae}") # 18.0

# 043 sklearn으로 확인
from sklearn.metrics import mean_absolute_error
mae_sklearn = mean_absolute_error(y_true, y_pred)
print(f"MAE (sklearn): {mae_sklearn}") # 18.0

특징:

  • 이해하기 쉬움 (평균 오차)
  • 단위가 타겟과 동일
  • 이상치에 덜 민감

MSE (Mean Squared Error)

잔차 제곱의 평균:

MSE = (1/n) × Σ(yᵢ - ŷᵢ)²
# 043 MSE 계산
mse = np.mean((y_true - y_pred) ** 2)
print(f"MSE: {mse}") # 440.0

from sklearn.metrics import mean_squared_error
mse_sklearn = mean_squared_error(y_true, y_pred)
print(f"MSE (sklearn): {mse_sklearn}") # 440.0

특징:

  • 큰 오차에 더 큰 패널티
  • 단위가 제곱됨 (해석 어려움)
  • 이상치에 민감
  • 미분 가능 (최적화에 유리)

RMSE (Root Mean Squared Error)

MSE의 제곱근:

RMSE = √MSE = √[(1/n) × Σ(yᵢ - ŷᵢ)²]
# 043 RMSE 계산
rmse = np.sqrt(mse)
print(f"RMSE: {rmse}") # 약 20.98

# 043 sklearn에서는 squared=False
rmse_sklearn = mean_squared_error(y_true, y_pred, squared=False)
print(f"RMSE (sklearn): {rmse_sklearn}")

특징:

  • 단위가 타겟과 동일
  • 큰 오차에 민감 (MSE 특성 유지)
  • 가장 많이 사용되는 지표

비교 예제

from pycaret.regression import *
from pycaret.datasets import get_data

data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)

# 043 모델 생성 및 평가
model = create_model('rf', verbose=False)
results = pull()

print("교차 검증 결과:")
print(f"MAE: {results['MAE'].mean():.4f}")
print(f"MSE: {results['MSE'].mean():.4f}")
print(f"RMSE: {results['RMSE'].mean():.4f}")

세 지표의 관계

import numpy as np
import matplotlib.pyplot as plt

# 043 다양한 예측 시나리오
scenarios = {
'균일한 작은 오차': np.array([2, 2, 2, 2, 2]),
'균일한 중간 오차': np.array([5, 5, 5, 5, 5]),
'하나의 큰 오차': np.array([0, 0, 0, 0, 10]),
'불균일 오차': np.array([1, 2, 3, 4, 5])
}

print("시나리오별 지표 비교:")
print("-" * 50)

for name, errors in scenarios.items():
mae = np.mean(np.abs(errors))
mse = np.mean(errors ** 2)
rmse = np.sqrt(mse)

print(f"\n{name}:")
print(f" 오차: {errors}")
print(f" MAE: {mae:.2f}")
print(f" MSE: {mse:.2f}")
print(f" RMSE: {rmse:.2f}")
print(f" RMSE/MAE 비율: {rmse/mae:.2f}")

# 043 결론: RMSE ≥ MAE 항상 성립
# 043 RMSE/MAE 비율이 크면 큰 오차가 있다는 의미

지표 선택 가이드

상황권장 지표이유
이상치 많음MAE이상치에 덜 민감
큰 오차 중요RMSE큰 오차에 패널티
비즈니스 해석MAE직관적 해석
모델 최적화MSE/RMSE미분 가능
기본 선택RMSE가장 널리 사용

PyCaret에서 지표 기준 선택

from pycaret.regression import *
from pycaret.datasets import get_data

data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)

# 043 MAE 기준 최적 모델
print("=== MAE 기준 ===")
best_mae = compare_models(sort='MAE', n_select=1)

# 043 RMSE 기준 최적 모델
print("\n=== RMSE 기준 ===")
best_rmse = compare_models(sort='RMSE', n_select=1)

# 043 튜닝도 지표 선택 가능
tuned = tune_model(best_rmse, optimize='RMSE')

시각화로 이해하기

import matplotlib.pyplot as plt
import numpy as np

# 043 오차 크기에 따른 MAE vs MSE
errors = np.linspace(0, 10, 100)

mae_penalty = np.abs(errors)
mse_penalty = errors ** 2

plt.figure(figsize=(10, 6))
plt.plot(errors, mae_penalty, label='MAE Penalty (|error|)', linewidth=2)
plt.plot(errors, mse_penalty, label='MSE Penalty (error²)', linewidth=2)
plt.xlabel('Error Magnitude')
plt.ylabel('Penalty')
plt.title('MAE vs MSE: Error Penalty Comparison')
plt.legend()
plt.grid(True)
plt.savefig('mae_vs_mse_penalty.png', dpi=150)

# 043 MSE는 큰 오차에 훨씬 더 큰 패널티를 부여

실전 활용

from pycaret.regression import *
from pycaret.datasets import get_data

data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)

model = create_model('rf', verbose=False)

# 043 예측 결과 상세 분석
predictions = predict_model(model)

# 043 수동 계산
y_true = predictions['medv']
y_pred = predictions['prediction_label']

errors = y_true - y_pred

print("오차 분석:")
print(f" MAE: {np.abs(errors).mean():.4f}")
print(f" MSE: (errors**2).mean():.4f}")
print(f" RMSE: {np.sqrt((errors**2).mean()):.4f}")

# 043 오차 분포
print(f"\n오차 분포:")
print(f" 최소: {errors.min():.2f}")
print(f" 최대: {errors.max():.2f}")
print(f" 표준편차: {errors.std():.2f}")

정리

  • MAE: 평균 절대 오차, 이상치에 강건
  • MSE: 평균 제곱 오차, 큰 오차에 패널티
  • RMSE: MSE의 제곱근, 단위가 타겟과 동일
  • RMSE ≥ MAE 항상 성립
  • RMSE/MAE 비율로 이상치 영향 파악
  • 비즈니스 맥락에 따라 적절한 지표 선택

다음 글 예고

다음 글에서는 회귀 평가 지표 - R², MAPE를 다룹니다.


PyCaret 머신러닝 마스터 시리즈 #043