MSE와 MAE
🔨 절차형
💡
학습 전략: 연습 (Practice)
즉시 실전에 적용해 보는 것이 핵심
개요
학습 시 에러를 평가할 때, 에러 값의 상쇄를 방지하기 위해 MSE와 MAE를 사용합니다.
Mean Squared Error (MSE)
정의
에러 값을 제곱하여 음의 수를 제거하는 방법입니다.
수식
\[MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2\]특징
- 민감도: 변화에 더 민감하게 반응
- 이상치 영향: 이상치와 가깝게 지나가는 모델을 생성
- 제곱 효과: 큰 오차에 더 큰 페널티 부여
Mean Absolute Error (MAE)
정의
에러 값을 절대값으로 변환하는 방법입니다.
수식
\[MAE = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i|\]특징
- 선형성: 값에 선형적으로 변화
- 전체 흐름: 데이터의 전체적인 흐름에 맞는 모델을 생성
- 균등한 페널티: 모든 오차에 동일한 가중치
MSE vs MAE 비교
| 특징 | MSE | MAE |
|---|---|---|
| 계산 방식 | 제곱 | 절대값 |
| 이상치 민감도 | 높음 | 낮음 |
| 미분 가능성 | 모든 점에서 가능 | 0에서 불가능 |
| 해석 | 단위가 제곱됨 | 원래 단위 유지 |
| 최적화 | 평균에 수렴 | 중앙값에 수렴 |
언제 어떤 지표를 사용할까?
MSE 사용이 적합한 경우
- 이상치에 큰 페널티를 주고 싶을 때
- 큰 오차를 줄이는 것이 중요할 때
- 미분 가능한 손실 함수가 필요할 때
MAE 사용이 적합한 경우
- 이상치의 영향을 줄이고 싶을 때
- 모든 오차를 동등하게 처리하고 싶을 때
- 해석이 쉬운 지표가 필요할 때
Python 구현
NumPy로 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np
def mse(y_true, y_pred):
"""Mean Squared Error"""
return np.mean((y_true - y_pred) ** 2)
def mae(y_true, y_pred):
"""Mean Absolute Error"""
return np.mean(np.abs(y_true - y_pred))
# 예시
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])
print(f"MSE: {mse(y_true, y_pred):.4f}")
print(f"MAE: {mae(y_true, y_pred):.4f}")
Scikit-learn 사용
1
2
3
4
5
6
7
8
9
10
from sklearn.metrics import mean_squared_error, mean_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mse_value = mean_squared_error(y_true, y_pred)
mae_value = mean_absolute_error(y_true, y_pred)
print(f"MSE: {mse_value:.4f}")
print(f"MAE: {mae_value:.4f}")
RMSE (Root Mean Squared Error)
MSE의 제곱근을 취한 값으로, 원래 단위로 변환됩니다.
수식
\[RMSE = \sqrt{MSE} = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2}\]특징
- MSE의 단위 문제 해결
- 해석이 용이
- 여전히 이상치에 민감
1
2
3
4
5
6
7
8
9
10
11
import numpy as np
from sklearn.metrics import mean_squared_error
def rmse(y_true, y_pred):
"""Root Mean Squared Error"""
return np.sqrt(mean_squared_error(y_true, y_pred))
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
print(f"RMSE: {rmse(y_true, y_pred):.4f}")
시각화로 이해하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import matplotlib.pyplot as plt
# 데이터 생성
errors = np.linspace(-5, 5, 100)
mse_values = errors ** 2
mae_values = np.abs(errors)
# 시각화
plt.figure(figsize=(10, 6))
plt.plot(errors, mse_values, label='MSE', linewidth=2)
plt.plot(errors, mae_values, label='MAE', linewidth=2)
plt.xlabel('Error')
plt.ylabel('Loss')
plt.title('MSE vs MAE')
plt.legend()
plt.grid(True)
plt.show()
실전 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error
import numpy as np
# 샘플 데이터 생성
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 2 * X + 1 + np.random.randn(100, 1) * 2
# 학습/테스트 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 모델 학습
model = LinearRegression()
model.fit(X_train, y_train)
# 예측
y_pred = model.predict(X_test)
# 평가
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f"MSE: {mse:.4f}")
print(f"MAE: {mae:.4f}")
print(f"RMSE: {rmse:.4f}")