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