🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

모델 성능 평가 회귀 완벽 가이드 - 슬라이드 1/8
A

AI Generated

2025. 12. 17. · 6 Views

모델 성능 평가 회귀 완벽 가이드

회귀 모델의 성능을 평가하는 핵심 지표들을 실무 중심으로 알아봅니다. MAE, MSE, RMSE, R² 등 주요 평가 지표의 개념과 활용법을 초급자도 쉽게 이해할 수 있도록 설명합니다.


목차

  1. 회귀_평가_지표_개요
  2. MAE_평균_절대_오차
  3. MSE_평균_제곱_오차
  4. RMSE_평균_제곱근_오차
  5. R²_결정_계수_이해
  6. 지표별_특징_비교
  7. 좋은_모델의_기준

1. 회귀 평가 지표 개요

어느 날 김개발 씨는 첫 머신러닝 모델을 완성했습니다. 부동산 가격을 예측하는 회귀 모델이었죠.

그런데 선배 박시니어 씨가 물었습니다. "모델이 잘 작동하나요?

어떻게 확인했어요?" 김개발 씨는 당황했습니다.

회귀 평가 지표는 예측 모델이 얼마나 정확한지 수치로 측정하는 도구입니다. 마치 학생의 성적표처럼 모델의 성능을 객관적으로 보여줍니다.

이를 통해 모델의 강점과 약점을 파악하고 개선 방향을 찾을 수 있습니다.

다음 코드를 살펴봅시다.

from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import numpy as np

# 실제 값과 예측 값 준비
y_true = np.array([100, 150, 200, 250, 300])
y_pred = np.array([110, 140, 210, 240, 290])

# 주요 평가 지표 계산
mae = mean_absolute_error(y_true, y_pred)
mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_true, y_pred)

# 결과 출력
print(f"MAE: {mae:.2f}, MSE: {mse:.2f}")
print(f"RMSE: {rmse:.2f}, R²: {r2:.4f}")

김개발 씨는 3개월 전 머신러닝 공부를 시작했습니다. 드디어 첫 번째 프로젝트로 부동산 가격 예측 모델을 완성했죠.

데이터를 모으고, 전처리하고, 모델을 학습시키는 과정이 쉽지 않았지만 해냈습니다. 그런데 문제가 생겼습니다.

선배 박시니어 씨가 코드 리뷰를 하다가 물었습니다. "이 모델, 성능이 어떤가요?" 김개발 씨는 대답하지 못했습니다.

모델이 예측 값을 내놓기는 하는데, 그것이 좋은 건지 나쁜 건지 판단할 기준이 없었던 것입니다. 그렇다면 회귀 평가 지표란 정확히 무엇일까요?

쉽게 비유하자면, 회귀 평가 지표는 마치 학생의 성적표와 같습니다. 학생이 시험을 보면 점수가 나오고, 그 점수로 실력을 평가하죠.

마찬가지로 머신러닝 모델도 예측을 하고 나면, 그 예측이 얼마나 정확한지 점수를 매겨야 합니다. 이 점수가 바로 평가 지표입니다.

평가 지표가 없던 시절에는 어땠을까요? 개발자들은 눈으로 직접 확인하는 수밖에 없었습니다.

"음, 이 예측 값이 실제 값과 비슷해 보이네?" 하는 식이었죠. 하지만 데이터가 수천, 수만 개가 되면 이런 방식은 불가능합니다.

더 큰 문제는 모델 간 비교가 어렵다는 것이었습니다. A 모델과 B 모델 중 어느 것이 더 나은지 객관적으로 판단할 수 없었습니다.

바로 이런 문제를 해결하기 위해 회귀 평가 지표가 등장했습니다. 평가 지표를 사용하면 모델의 성능을 정량적으로 측정할 수 있습니다.

또한 여러 모델을 공정하게 비교할 수도 있습니다. 무엇보다 개선 방향을 명확히 파악할 수 있다는 큰 이점이 있습니다.

점수가 낮다면 어디를 고쳐야 할지 힌트를 얻을 수 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 sklearn.metrics 모듈에서 필요한 함수들을 import합니다. 이 모듈에는 다양한 평가 지표가 준비되어 있습니다.

다음으로 y_true와 y_pred를 준비합니다. y_true는 실제 값, y_pred는 모델이 예측한 값입니다.

이 두 값을 비교해서 오차를 계산하는 것이 평가의 핵심입니다. 그다음 각 평가 지표를 계산합니다.

mean_absolute_error는 절대 오차의 평균을, mean_squared_error는 제곱 오차의 평균을 계산합니다. rmse는 mse에 제곱근을 씌운 값이고, r2_score는 결정 계수라는 특별한 지표입니다.

마지막으로 결과를 출력합니다. 실제 현업에서는 어떻게 활용할까요?

예를 들어 온라인 쇼핑몰에서 고객의 구매 금액을 예측하는 모델을 개발한다고 가정해봅시다. 모델 A는 MAE가 500원, 모델 B는 MAE가 1000원이 나왔습니다.

그렇다면 모델 A가 평균적으로 500원만큼 오차가 나고, 모델 B는 1000원 오차가 납니다. 당연히 모델 A가 더 정확하죠.

이처럼 실무에서는 여러 모델을 학습시키고 평가 지표로 비교해서 최선의 모델을 선택합니다. 하지만 주의할 점도 있습니다.

초보 개발자들이 흔히 하는 실수 중 하나는 단 하나의 지표만 보는 것입니다. 예를 들어 MAE만 보고 모델을 선택하면, 이상치(outlier)에 취약할 수 있습니다.

따라서 여러 지표를 종합적으로 살펴봐야 합니다. MAE, RMSE, R²를 모두 확인하고, 각 지표가 말하는 바를 이해해야 합니다.

다시 김개발 씨의 이야기로 돌아가 봅시다. 박시니어 씨는 친절하게 설명해줬습니다.

"모델을 만들었으면 반드시 평가 지표로 성능을 측정해야 해요. 그래야 이 모델을 실제 서비스에 쓸 수 있는지 판단할 수 있으니까요." 김개발 씨는 고개를 끄덕였습니다.

"아, 그래서 항상 평가 지표를 함께 보고하는 거군요!" 회귀 평가 지표를 제대로 이해하면 더 신뢰할 수 있는 머신러닝 시스템을 만들 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.

실전 팁

💡 - 항상 여러 지표를 함께 확인하세요. 한 가지 지표만으로는 부족합니다.

  • 평가 지표의 단위를 확인하세요. MAE와 RMSE는 데이터와 같은 단위를 가집니다.

2. MAE 평균 절대 오차

모델 평가 방법을 배운 김개발 씨는 가장 먼저 MAE라는 지표를 공부하기 시작했습니다. "이름이 직관적이네요.

평균 절대 오차라니." 하지만 왜 절대값을 쓰는지 궁금해졌습니다.

**MAE(Mean Absolute Error)**는 예측 값과 실제 값의 차이를 절대값으로 변환한 뒤 평균을 낸 지표입니다. 가장 직관적이고 이해하기 쉬운 평가 지표로, 모델이 평균적으로 얼마나 틀리는지 알려줍니다.

이상치에 덜 민감한 특징이 있습니다.

다음 코드를 살펴봅시다.

from sklearn.metrics import mean_absolute_error
import numpy as np

# 실제 부동산 가격 (단위: 만원)
actual_prices = np.array([3000, 3500, 4000, 4500, 10000])
# 모델이 예측한 가격
predicted_prices = np.array([3100, 3400, 4200, 4600, 9500])

# MAE 계산
mae = mean_absolute_error(actual_prices, predicted_prices)
print(f"평균 절대 오차: {mae:.0f}만원")

# 수동 계산으로 이해하기
errors = np.abs(actual_prices - predicted_prices)
manual_mae = np.mean(errors)
print(f"수동 계산 MAE: {manual_mae:.0f}만원")
print(f"개별 오차: {errors}")

김개발 씨는 첫 번째 평가 지표로 MAE를 선택했습니다. 이름부터 친근했습니다.

Mean Absolute Error, 즉 평균 절대 오차. 단어 하나하나가 이해하기 쉬웠죠.

박시니어 씨가 커피를 한 잔 건네며 말했습니다. "MAE는 가장 기본적인 지표예요.

하지만 그만큼 중요하죠. 실무에서 가장 많이 쓰입니다." 그렇다면 MAE란 정확히 무엇일까요?

쉽게 비유하자면, MAE는 마치 과녁 연습과 같습니다. 활을 쏠 때 화살이 정중앙에서 얼마나 벗어났는지 거리를 재죠.

10cm 빗나갔든, 20cm 빗나갔든 방향은 상관없이 거리 자체만 측정합니다. 그리고 여러 번 쏜 화살의 평균 거리를 계산합니다.

MAE도 이와 똑같습니다. 예측이 실제 값에서 얼마나 멀리 떨어져 있는지, 그 거리의 평균을 구하는 것입니다.

MAE가 없던 시절에는 어땠을까요? 개발자들은 부호가 있는 오차를 그대로 평균 냈습니다.

하지만 이게 문제였습니다. +100 오차와 -100 오차가 있으면 평균이 0이 되어버립니다.

실제로는 크게 틀렸는데도 평균 오차는 0이라니, 말이 안 되죠. 더 큰 문제는 양의 오차와 음의 오차가 서로 상쇄된다는 것이었습니다.

모델이 엉망인데도 평균 오차만 보면 괜찮아 보일 수 있었습니다. 바로 이런 문제를 해결하기 위해 절대값을 사용합니다.

절대값을 취하면 모든 오차가 양수가 됩니다. +100이든 -100이든 모두 100이 됩니다.

이제 오차들이 서로 상쇄되지 않습니다. 그리고 이것들의 평균을 구하면 모델이 평균적으로 얼마나 틀리는지 명확하게 알 수 있습니다.

무엇보다 해석이 직관적이라는 큰 이점이 있습니다. "이 모델은 평균적으로 100만원 정도 틀립니다"라고 바로 말할 수 있습니다.

위의 코드를 한 줄씩 살펴보겠습니다. 먼저 actual_prices에 실제 부동산 가격을 담습니다.

단위는 만원입니다. 다음으로 predicted_prices에 모델이 예측한 가격을 담습니다.

이 부분이 핵심입니다. 이제 mean_absolute_error 함수에 두 배열을 넣으면 MAE가 자동으로 계산됩니다.

하지만 어떻게 계산되는지 직접 보고 싶다면 수동 계산을 해볼 수 있습니다. np.abs(actual_prices - predicted_prices)는 각 쌍의 오차를 절대값으로 바꿉니다.

그리고 np.mean()으로 평균을 냅니다. 결과는 같습니다.

이렇게 직접 계산해보면 MAE의 원리를 완벽히 이해할 수 있습니다. 실제 현업에서는 어떻게 활용할까요?

예를 들어 배달 시간 예측 서비스를 개발한다고 가정해봅시다. 모델이 "30분 후 도착"이라고 예측했는데 실제로는 35분 걸렸습니다.

오차는 5분이죠. 이런 식으로 수천 건의 배달 데이터에서 오차를 계산하고 평균을 내면, "우리 모델은 평균 3분 정도 오차가 있습니다"라고 말할 수 있습니다.

비즈니스적으로 이해하기 쉬운 지표입니다. CEO에게 보고할 때도 "평균 오차 3분"이라고 하면 바로 이해합니다.

또한 MAE는 이상치에 덜 민감합니다. 예를 들어 대부분의 예측이 정확한데 한두 개만 크게 틀렸다고 해봅시다.

MAE는 그 큰 오차를 그대로 평균에 반영하지만, 제곱을 하지 않기 때문에 영향이 제한적입니다. 이것이 MAE의 장점이자 때로는 단점이 되기도 합니다.

하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 MAE만 보고 모델을 평가하는 것입니다.

MAE는 이상치를 잘 드러내지 못합니다. 만약 소수의 예측이 엄청나게 틀렸는데, 대부분이 맞다면 MAE는 낮게 나올 수 있습니다.

하지만 실제 서비스에서는 그 소수의 큰 오차가 치명적일 수 있습니다. 따라서 RMSE나 다른 지표와 함께 봐야 합니다.

다시 김개발 씨의 이야기로 돌아가 봅시다. 코드를 실행한 김개발 씨는 신기해했습니다.

"평균 절대 오차가 220만원이네요. 우리 모델이 평균적으로 220만원씩 틀린다는 거군요!" 박시니어 씨가 웃으며 말했습니다.

"맞아요. 바로 그게 MAE의 매력이죠.

직관적이고 설명하기 쉽습니다." MAE를 제대로 이해하면 모델의 기본 성능을 빠르게 파악할 수 있습니다. 여러분도 첫 번째 평가 지표로 MAE를 사용해 보세요.

실전 팁

💡 - MAE는 데이터와 같은 단위를 가집니다. 해석이 쉽습니다.

  • 이상치에 덜 민감하지만, 그래서 큰 오차를 놓칠 수 있습니다. RMSE와 함께 보세요.

3. MSE 평균 제곱 오차

MAE를 이해한 김개발 씨는 다음 지표인 MSE를 공부하기 시작했습니다. "제곱 오차?

왜 굳이 제곱을 할까요?" 박시니어 씨가 말했습니다. "바로 그 '왜'가 핵심이에요."

**MSE(Mean Squared Error)**는 예측 값과 실제 값의 차이를 제곱한 뒤 평균을 낸 지표입니다. 제곱을 하기 때문에 큰 오차에 더 큰 패널티를 주는 특징이 있습니다.

이상치나 큰 오차를 감지하는 데 효과적이지만, 단위가 제곱되어 해석이 어려울 수 있습니다.

다음 코드를 살펴봅시다.

from sklearn.metrics import mean_squared_error
import numpy as np

# 두 모델의 예측 비교
actual = np.array([100, 200, 300, 400, 500])
model_a = np.array([105, 195, 305, 395, 505])  # 골고루 작은 오차
model_b = np.array([100, 200, 300, 400, 600])  # 마지막만 큰 오차

# MSE 계산
mse_a = mean_squared_error(actual, model_a)
mse_b = mean_squared_error(actual, model_b)

print(f"모델 A MSE: {mse_a:.2f}")
print(f"모델 B MSE: {mse_b:.2f}")

# 제곱의 효과 확인
print(f"모델 A 오차: {actual - model_a}")
print(f"모델 B 오차: {actual - model_b}")

김개발 씨는 MAE를 완벽히 이해했습니다. 이제 MSE를 공부할 차례였죠.

그런데 이상했습니다. "왜 굳이 오차를 제곱할까요?

절대값만으로도 충분한데." 박시니어 씨가 화이트보드에 그림을 그리기 시작했습니다. "좋은 질문이에요.

MAE와 MSE의 차이를 이해하면 언제 어떤 지표를 써야 할지 알 수 있습니다." 그렇다면 MSE란 정확히 무엇일까요? 쉽게 비유하자면, MSE는 마치 교통 범칙금 제도와 같습니다.

속도위반을 조금 하면 벌금이 적지만, 많이 하면 벌금이 기하급수적으로 늘어나죠. 10km 초과는 3만원, 20km 초과는 6만원이 아니라 7만원, 이런 식입니다.

마찬가지로 MSE도 작은 오차는 작게, 큰 오차는 아주 크게 평가합니다. 오차가 2배가 되면 패널티는 4배가 되는 것이죠.

절대값 대신 제곱을 쓰지 않던 시절에는 어땠을까요? 앞서 MAE에서 봤듯이 절대값은 좋은 방법입니다.

하지만 한계가 있었습니다. 모든 오차를 동등하게 취급한다는 것입니다.

오차 10이든 오차 100이든 비례적으로만 반영됩니다. 그런데 실제 비즈니스에서는 큰 오차가 훨씬 더 치명적인 경우가 많습니다.

예를 들어 재고 예측이 10% 틀리는 것과 50% 틀리는 것은 차원이 다른 문제죠. 바로 이런 문제를 해결하기 위해 제곱을 사용합니다.

제곱을 하면 큰 오차가 더욱 부각됩니다. 오차 5는 제곱하면 25, 오차 10은 제곱하면 100이 됩니다.

오차가 2배인데 제곱 값은 4배가 됩니다. 이렇게 하면 큰 오차에 민감한 모델 평가가 가능해집니다.

또한 수학적으로도 좋은 성질이 있습니다. 미분이 가능해서 모델 학습 시 최적화하기 쉽습니다.

많은 머신러닝 알고리즘이 내부적으로 MSE를 손실 함수로 사용하는 이유입니다. 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 actual에 실제 값을 담습니다. 그다음 두 모델의 예측 값을 준비합니다.

모델 A는 모든 예측에서 약간씩 틀립니다. 오차가 -5, 5, -5, 5, -5 정도죠.

모델 B는 대부분 정확하지만 마지막 예측만 크게 틀립니다. 오차가 0, 0, 0, 0, 100입니다.

이제 각 모델의 MSE를 계산합니다. mean_squared_error 함수가 자동으로 계산해줍니다.

결과를 보면 흥미로운 점을 발견할 수 있습니다. 모델 B의 MSE가 훨씬 큽니다.

왜 그럴까요? 마지막 오차 100이 제곱되어 10000이 되면서 평균을 크게 끌어올렸기 때문입니다.

실제 현업에서는 어떻게 활용할까요? 예를 들어 수요 예측 시스템을 개발한다고 가정해봅시다.

대부분의 날은 예측이 정확하지만, 가끔 특별한 이벤트가 있는 날은 크게 틀립니다. MAE로 평가하면 평균이 낮아서 괜찮아 보일 수 있습니다.

하지만 MSE로 평가하면 그 큰 오차가 명확히 드러납니다. 실제로 재고가 크게 부족하거나 남는 것은 비즈니스에 치명적이므로, MSE가 더 적절한 지표일 수 있습니다.

또한 MSE는 모델 학습의 목표 함수로도 많이 쓰입니다. 선형 회귀, 신경망 등 많은 알고리즘이 MSE를 최소화하는 방향으로 학습합니다.

평가 지표와 학습 목표가 일치하면 더 효과적인 학습이 가능합니다. 하지만 주의할 점도 있습니다.

초보 개발자들이 흔히 하는 실수 중 하나는 MSE의 단위를 무시하는 것입니다. 원래 데이터가 "만원" 단위라면, MSE는 "만원의 제곱" 단위입니다.

직관적으로 이해하기 어렵죠. "평균 제곱 오차가 2500만원²입니다"라고 하면 무슨 뜻인지 바로 와닿지 않습니다.

따라서 해석할 때는 RMSE로 변환하는 것이 좋습니다. 또한 MSE는 이상치에 매우 민감합니다.

데이터에 잘못 입력된 값이나 극단적인 값이 있으면 MSE가 크게 왜곡될 수 있습니다. 이럴 때는 이상치를 먼저 제거하거나, MAE와 함께 봐야 합니다.

다시 김개발 씨의 이야기로 돌아가 봅시다. 코드 결과를 본 김개발 씨는 놀랐습니다.

"모델 B가 MSE가 훨씬 크네요! 그런데 대부분의 예측은 정확한데." 박시니어 씨가 설명했습니다.

"바로 그게 MSE의 특징이에요. 큰 오차 하나가 평균을 크게 올립니다.

이게 장점이자 단점이죠." MSE를 제대로 이해하면 이상치와 큰 오차를 효과적으로 감지할 수 있습니다. 여러분도 큰 오차가 중요한 상황에서는 MSE를 활용해 보세요.

실전 팁

💡 - MSE는 큰 오차에 민감합니다. 이상치를 찾는 데 유용합니다.

  • 단위가 제곱되므로 해석이 어렵습니다. RMSE로 변환해서 보세요.

4. RMSE 평균 제곱근 오차

MSE를 이해한 김개발 씨는 또 다른 지표를 발견했습니다. RMSE였죠.

"MSE에 루트를 씌운 건가요?" 박시니어 씨가 고개를 끄덕였습니다. "정답입니다.

그게 전부지만, 그게 엄청난 차이를 만들어요."

**RMSE(Root Mean Squared Error)**는 MSE에 제곱근을 씌운 지표입니다. MSE의 장점인 큰 오차에 대한 민감성은 유지하면서, 단위를 원래 데이터와 같게 만들어 해석을 쉽게 합니다.

실무에서 가장 많이 사용되는 회귀 평가 지표 중 하나입니다.

다음 코드를 살펴봅시다.

from sklearn.metrics import mean_squared_error
import numpy as np

# 아파트 가격 예측 (단위: 억원)
actual_prices = np.array([5.0, 6.5, 7.2, 8.0, 9.5])
predicted_prices = np.array([5.2, 6.3, 7.5, 7.8, 10.0])

# MSE와 RMSE 계산
mse = mean_squared_error(actual_prices, predicted_prices)
rmse = np.sqrt(mse)  # MSE에 제곱근

# sklearn으로 직접 계산
rmse_direct = mean_squared_error(actual_prices, predicted_prices,
                                  squared=False)

print(f"MSE: {mse:.4f} 억원²")
print(f"RMSE: {rmse:.4f} 억원")
print(f"RMSE(직접): {rmse_direct:.4f} 억원")
print(f"평균적으로 {rmse:.2f}억원 정도 오차가 발생합니다.")

김개발 씨는 MSE를 공부하면서 불편함을 느꼈습니다. "MSE는 좋은데, 단위가 제곱이라 이해하기 어려워요." 바로 그때 RMSE를 발견했습니다.

박시니어 씨가 말했습니다. "RMSE는 실무에서 가장 사랑받는 지표 중 하나예요.

MSE의 장점을 유지하면서 해석도 쉽거든요." 그렇다면 RMSE란 정확히 무엇일까요? 쉽게 비유하자면, RMSE는 마치 면적을 길이로 다시 변환하는 것과 같습니다.

정사각형의 면적이 100m²라고 하면, 한 변의 길이는 10m죠. 제곱근을 씌워서 원래 단위로 돌아갑니다.

RMSE도 똑같습니다. MSE는 "오차의 제곱"을 평균 낸 것이라 단위가 제곱입니다.

여기에 제곱근을 씌우면 원래 데이터와 같은 단위로 돌아옵니다. MSE만 사용하던 시절에는 어땠을까요?

연구자들은 모델의 성능을 보고할 때 난감했습니다. "평균 제곱 오차가 0.16입니다"라고 하면, 청중들은 고개를 갸우뚱했습니다.

0.16이 큰 건가요, 작은 건가요? 단위가 제곱이라 감이 안 오는 것이죠.

더 큰 문제는 다른 지표와 비교하기 어렵다는 것이었습니다. MAE는 원래 단위인데 MSE는 제곱 단위라, 둘을 직접 비교할 수 없었습니다.

바로 이런 문제를 해결하기 위해 제곱근을 씌웁니다. 제곱근을 취하면 단위가 다시 정상으로 돌아옵니다.

"평균 제곱근 오차가 0.4입니다"라고 하면 바로 이해됩니다. 데이터가 억원 단위라면 "평균적으로 0.4억원 틀립니다"라고 해석할 수 있습니다.

MAE처럼 직관적이면서도, MSE의 장점인 큰 오차에 대한 민감성은 유지됩니다. 일석이조인 셈이죠.

위의 코드를 한 줄씩 살펴보겠습니다. 먼저 아파트 가격 데이터를 준비합니다.

단위는 억원입니다. 실제 가격과 예측 가격이 있습니다.

이제 mean_squared_error로 MSE를 계산합니다. 결과는 0.076 억원² 정도입니다.

이게 크냐 작으냐? 잘 모르겠죠.

여기에 np.sqrt()로 제곱근을 씌웁니다. 그러면 RMSE가 나옵니다.

약 0.28억원입니다. "평균적으로 0.28억원(2800만원) 정도 틀린다"고 바로 이해할 수 있습니다.

sklearn 최신 버전에서는 squared=False 옵션으로 RMSE를 바로 계산할 수도 있습니다. 실제 현업에서는 어떻게 활용할까요?

예를 들어 주식 가격 예측 모델을 개발한다고 가정해봅시다. 모델의 RMSE가 500원이라면, "이 모델은 평균적으로 500원 정도 틀립니다"라고 바로 말할 수 있습니다.

투자자들도 이해하기 쉽죠. 또한 여러 모델을 비교할 때도 유용합니다.

모델 A는 RMSE 500원, 모델 B는 RMSE 300원이라면 모델 B가 더 정확하다고 즉시 판단할 수 있습니다. 또한 RMSE는 캐글(Kaggle) 같은 데이터 사이언스 경진대회에서 자주 평가 지표로 사용됩니다.

제곱 오차를 기반으로 하기 때문에 큰 오차를 줄이는 것이 중요해집니다. 참가자들은 이상치나 큰 오차를 줄이기 위해 다양한 기법을 동원하게 됩니다.

하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 RMSE와 MAE를 혼동하는 것입니다.

둘 다 원래 단위를 가지지만, 계산 방식이 다릅니다. RMSE는 제곱을 거치기 때문에 큰 오차에 더 민감합니다.

같은 데이터라도 RMSE가 MAE보다 항상 크거나 같습니다. 큰 오차가 있으면 그 차이가 더 벌어집니다.

또한 RMSE는 평균의 개념이 아닙니다. 제곱을 했다가 다시 제곱근을 씌우는 과정에서 단순 평균과는 다른 값이 나옵니다.

"대표적인 오차 크기"를 나타내는 지표라고 이해하는 것이 좋습니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.

RMSE를 계산한 김개발 씨는 환하게 웃었습니다. "이제 이해됐어요!

MSE는 제곱이라 어려웠는데, RMSE는 바로 감이 오네요." 박시니어 씨가 만족스럽게 말했습니다. "그래서 실무에서는 RMSE를 많이 써요.

보고할 때도 설득력이 있거든요." RMSE를 제대로 이해하면 모델의 성능을 명확하게 전달할 수 있습니다. 여러분도 실무 보고서에는 RMSE를 적극 활용해 보세요.

실전 팁

💡 - RMSE는 MAE보다 항상 크거나 같습니다. 큰 오차가 있으면 차이가 더 벌어집니다.

  • 해석이 쉬우므로 비전문가에게 설명할 때 유용합니다.

5. R² 결정 계수 이해

MAE, MSE, RMSE를 모두 이해한 김개발 씨는 마지막 지표를 마주했습니다. R²(R-squared)였습니다.

"이건 뭔가 다른 것 같은데요?" 박시니어 씨가 웃으며 말했습니다. "정답입니다.

이건 특별한 지표예요."

**R²(결정 계수)**는 모델이 데이터의 분산을 얼마나 잘 설명하는지 나타내는 지표입니다. 0에서 1 사이의 값을 가지며, 1에 가까울수록 모델이 데이터를 잘 설명합니다.

다른 지표들과 달리 상대적인 성능을 평가하는 특징이 있습니다.

다음 코드를 살펴봅시다.

from sklearn.metrics import r2_score
import numpy as np

# 학생 성적 예측 (100점 만점)
actual_scores = np.array([70, 75, 80, 85, 90, 95])
predicted_scores = np.array([72, 74, 82, 84, 88, 96])

# R² 계산
r2 = r2_score(actual_scores, predicted_scores)
print(f"R² Score: {r2:.4f}")
print(f"모델이 데이터 분산의 {r2*100:.2f}%를 설명합니다.")

# 완벽한 예측과 형편없는 예측
perfect_pred = actual_scores  # 완벽한 예측
baseline_pred = np.full(len(actual_scores),
                        np.mean(actual_scores))  # 평균만 예측

r2_perfect = r2_score(actual_scores, perfect_pred)
r2_baseline = r2_score(actual_scores, baseline_pred)

print(f"\n완벽한 모델 R²: {r2_perfect:.4f}")
print(f"평균만 예측하는 모델 R²: {r2_baseline:.4f}")

김개발 씨는 지금까지 배운 지표들이 모두 오차의 크기를 측정했다는 것을 알아챘습니다. MAE는 절대 오차, MSE는 제곱 오차, RMSE는 제곱근 오차.

그런데 R²는 뭔가 달라 보였습니다. 박시니어 씨가 설명하기 시작했습니다.

"지금까지는 '얼마나 틀렸는가'를 봤다면, R²는 '얼마나 잘 설명하는가'를 봅니다. 관점이 다른 거죠." 그렇다면 란 정확히 무엇일까요?

쉽게 비유하자면, R²는 마치 시험 점수의 백분율과 같습니다. "100점 만점에 80점"이라고 하면 바로 이해되죠.

R²도 비슷합니다. 모델이 데이터를 얼마나 잘 설명하는지를 0에서 1 사이의 값으로 나타냅니다.

1이면 완벽, 0이면 무용지물입니다. 0.8이면 "데이터 변동의 80%를 모델이 설명한다"는 뜻입니다.

R²가 없던 시절에는 어땠을까요? 연구자들은 절대적인 오차 값만으로 모델을 평가했습니다.

RMSE가 10이라고 하면 좋은 건가요, 나쁜 건가요? 데이터의 규모에 따라 달라집니다.

주택 가격이 수억 원대라면 RMSE 10만원은 아주 좋은 것이지만, 커피 가격이 수천 원대라면 RMSE 10원도 나쁠 수 있습니다. 즉, 절대 지표는 상대적 비교가 어렵다는 문제가 있었습니다.

바로 이런 문제를 해결하기 위해 가 등장했습니다. R²는 상대적인 성능을 측정합니다.

기준선은 "평균만 예측하는 단순 모델"입니다. 이 모델보다 얼마나 나은지를 0~1 스케일로 표현합니다.

데이터 규모와 관계없이 일관된 해석이 가능합니다. 0.9면 어떤 데이터든 "아주 좋은 모델"이라고 말할 수 있습니다.

또한 다른 프로젝트와 비교하기도 쉽습니다. 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 학생 성적 데이터를 준비합니다. 실제 점수와 예측 점수가 있습니다.

r2_score 함수로 R²를 계산합니다. 결과는 0.9 정도 나옵니다.

"모델이 데이터 분산의 90%를 설명한다"는 뜻입니다. 꽤 좋은 모델이죠.

비교를 위해 두 가지 극단적인 경우를 봅니다. 첫째, 완벽한 예측을 하면 R²는 1.0이 됩니다.

둘째, 평균만 예측하는 단순 모델은 R²가 0.0입니다. 이것이 R²의 기준선입니다.

여러분의 모델이 평균보다 나은지를 판단하는 것이죠. 실제 현업에서는 어떻게 활용할까요?

예를 들어 광고 효과 예측 모델을 개발한다고 가정해봅시다. 모델 A는 R² 0.6, 모델 B는 R² 0.8이 나왔습니다.

모델 B가 더 좋다는 것을 바로 알 수 있습니다. 절대 오차 값을 비교할 필요도 없습니다.

또한 경영진에게 보고할 때도 유용합니다. "우리 모델은 데이터 변동의 80%를 설명합니다"라고 하면 직관적으로 이해됩니다.

또한 피처 엔지니어링을 할 때도 유용합니다. 새로운 변수를 추가했을 때 R²가 올라가면 그 변수가 유용하다는 뜻입니다.

반대로 R²가 변하지 않으면 그 변수는 불필요한 것이죠. 하지만 주의할 점도 있습니다.

초보 개발자들이 흔히 하는 실수 중 하나는 R²만 보고 모델을 선택하는 것입니다. R²가 높다고 무조건 좋은 모델은 아닙니다.

과적합(overfitting)된 모델도 훈련 데이터에서는 높은 R²를 보일 수 있습니다. 따라서 테스트 데이터에서의 R²를 확인해야 합니다.

또한 R²가 음수가 나올 수도 있습니다. 모델이 평균보다 못할 때죠.

이럴 때는 모델에 심각한 문제가 있다는 신호입니다. 데이터 전처리나 모델 선택을 다시 검토해야 합니다.

R²의 해석도 조심해야 합니다. "분산의 80%를 설명한다"는 것이 "80% 정확하다"는 뜻은 아닙니다.

선형 관계를 얼마나 잘 포착하는가를 나타내는 지표입니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.

R²를 계산한 김개발 씨는 놀랐습니다. "R²가 0.95네요!

거의 완벽하게 설명한다는 거죠?" 박시니어 씨가 조심스럽게 말했습니다. "훈련 데이터에서는 그렇네요.

하지만 테스트 데이터에서도 확인해야 해요. 과적합일 수도 있으니까요." R²를 제대로 이해하면 모델의 전반적인 설명력을 파악할 수 있습니다.

여러분도 다른 지표와 함께 R²를 활용해 보세요.

실전 팁

💡 - R²는 0~1 사이 값을 가집니다. 1에 가까울수록 좋지만, 과적합을 조심하세요.

  • 테스트 데이터에서의 R²를 반드시 확인하세요. 훈련 데이터만으로는 부족합니다.

6. 지표별 특징 비교

모든 지표를 공부한 김개발 씨는 혼란스러웠습니다. "그래서 어떤 지표를 써야 하나요?" 박시니어 씨가 웃으며 말했습니다.

"좋은 질문이에요. 상황에 따라 다릅니다."

MAE, MSE, RMSE, R²는 각각 장단점과 적합한 사용 상황이 다릅니다. MAE는 해석이 쉽고 이상치에 강하며, RMSE는 큰 오차를 감지하는 데 유용합니다.

R²는 상대적 성능을 평가할 때 효과적입니다. 실무에서는 여러 지표를 함께 사용하는 것이 좋습니다.

다음 코드를 살펴봅시다.

from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import numpy as np

# 세 가지 모델 비교
actual = np.array([100, 200, 300, 400, 500])
model_consistent = np.array([110, 210, 310, 410, 510])  # 일관된 오차
model_outlier = np.array([100, 200, 300, 400, 700])     # 큰 오차 하나
model_perfect = actual                                   # 완벽

models = {
    '일관된 오차': model_consistent,
    '이상치 포함': model_outlier,
    '완벽한 예측': model_perfect
}

print("="*50)
for name, pred in models.items():
    mae = mean_absolute_error(actual, pred)
    rmse = np.sqrt(mean_squared_error(actual, pred))
    r2 = r2_score(actual, pred)

    print(f"\n{name} 모델:")
    print(f"  MAE:  {mae:.2f}")
    print(f"  RMSE: {rmse:.2f}")
    print(f"  R²:   {r2:.4f}")
print("="*50)

김개발 씨는 네 가지 지표를 모두 배웠지만, 더 헷갈렸습니다. "언제 MAE를 쓰고, 언제 RMSE를 쓰나요?

R²는 또 언제 쓰는 거죠?" 박시니어 씨가 차분하게 설명하기 시작했습니다. "각 지표는 다른 질문에 답합니다.

그 질문이 무엇인지 알면 어떤 지표를 쓸지 자연스럽게 결정됩니다." 그렇다면 각 지표는 어떤 차이가 있을까요? 쉽게 비유하자면, 지표들은 마치 다른 렌즈로 세상을 보는 것과 같습니다.

맨눈으로 보면 전체적인 모습이 보이고, 망원경으로 보면 멀리 있는 것이 잘 보이고, 현미경으로 보면 작은 것이 크게 보입니다. 각각 다른 용도죠.

평가 지표도 마찬가지입니다. MAE는 전체적인 평균 오차, RMSE는 큰 오차, R²는 설명력에 초점을 맞춥니다.

하나의 지표만 사용하던 시절에는 어떤 문제가 있었을까요? 개발자들은 주로 MSE만 사용했습니다.

하지만 문제가 생겼습니다. 비즈니스 팀에 설명할 때 "MSE가 2500입니다"라고 하면 아무도 이해하지 못했습니다.

또한 데이터의 특성을 고려하지 못했습니다. 이상치가 많은 데이터와 깔끔한 데이터를 같은 기준으로 평가하면 공정하지 않습니다.

바로 이런 문제를 해결하기 위해 다양한 지표를 함께 사용합니다. MAE는 해석이 직관적합니다.

"평균 100원 틀립니다"라고 바로 말할 수 있습니다. 또한 이상치에 강합니다.

극단적인 값이 몇 개 있어도 평균을 크게 왜곡하지 않습니다. 대신 큰 오차를 잘 드러내지 못한다는 단점이 있습니다.

RMSE는 큰 오차에 민감합니다. 제곱을 거치기 때문에 극단적인 값이 있으면 지표가 크게 올라갑니다.

이것이 장점이자 단점입니다. 큰 오차가 중요한 비즈니스라면 RMSE가 적절하고, 평균적인 성능이 중요하다면 MAE가 낫습니다.

또한 단위가 원래대로 돌아와서 해석하기 쉽습니다. R²는 상대적 평가에 유용합니다.

데이터 규모와 관계없이 0~1 스케일로 표현되므로 다른 프로젝트와 비교할 수 있습니다. "우리 모델은 80%를 설명합니다"라고 하면 누구나 이해합니다.

하지만 절대적인 오차 크기는 알 수 없다는 단점이 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 실제 값을 준비합니다. 그다음 세 가지 다른 유형의 예측을 만듭니다.

첫 번째는 일관되게 10씩 오차가 나는 모델, 두 번째는 대부분 정확하지만 한 예측만 크게 틀리는 모델, 세 번째는 완벽한 모델입니다. 이제 각 모델에 대해 세 가지 지표를 모두 계산합니다.

결과를 비교하면 흥미로운 패턴을 발견할 수 있습니다. 일관된 오차 모델은 MAE와 RMSE가 비슷합니다.

하지만 이상치 포함 모델은 RMSE가 MAE보다 훨씬 큽니다. 큰 오차 하나가 RMSE를 크게 끌어올렸기 때문입니다.

실제 현업에서는 어떻게 활용할까요? 예를 들어 물류 배송 시간 예측 모델을 개발한다고 가정해봅시다.

대부분의 배송은 정확하지만, 가끔 교통 체증으로 크게 지연되는 경우가 있습니다. 이럴 때 MAE만 보면 평균은 좋아 보이지만, 고객은 큰 지연에 불만을 가질 수 있습니다.

따라서 RMSE도 함께 봐야 합니다. RMSE가 MAE보다 많이 크다면 큰 오차가 자주 발생한다는 신호입니다.

또한 모델 선택 과정에서도 여러 지표를 사용합니다. 후보 모델들의 MAE, RMSE, R²를 모두 비교하고, 비즈니스 요구사항에 맞는 모델을 선택합니다.

예를 들어 큰 오차가 치명적인 금융 분야라면 RMSE를 우선시하고, 평균 성능이 중요한 추천 시스템이라면 MAE를 우선시할 수 있습니다. 하지만 주의할 점도 있습니다.

초보 개발자들이 흔히 하는 실수 중 하나는 모든 지표를 동시에 최적화하려는 것입니다. 하지만 트레이드오프(trade-off)가 있습니다.

MAE를 줄이려다 RMSE가 올라갈 수 있고, 그 반대도 가능합니다. 따라서 비즈니스 우선순위를 정해야 합니다.

가장 중요한 지표 하나를 주 지표로 삼고, 나머지는 참고 지표로 활용하세요. 또한 지표의 한계를 이해해야 합니다.

모든 지표는 숫자일 뿐입니다. 실제로 모델을 배포하기 전에는 데이터를 시각화하고, 오차의 분포를 확인하고, 극단적인 케이스를 검토해야 합니다.

다시 김개발 씨의 이야기로 돌아가 봅시다. 세 모델의 지표를 비교한 김개발 씨는 깨달았습니다.

"아, 이상치 포함 모델은 MAE는 비슷한데 RMSE가 훨씬 크네요!" 박시니어 씨가 만족스럽게 말했습니다. "정확합니다.

지표를 함께 보면 모델의 특성을 더 잘 이해할 수 있어요." 각 지표의 특징을 제대로 이해하면 상황에 맞는 평가 방법을 선택할 수 있습니다. 여러분도 실무에서는 여러 지표를 종합적으로 활용해 보세요.

실전 팁

💡 - 보고할 때는 RMSE와 R²를 주로 사용하세요. 이해하기 쉽습니다.

  • MAE와 RMSE의 차이가 크면 이상치나 큰 오차가 있다는 신호입니다.

7. 좋은 모델의 기준

지표들을 모두 이해한 김개발 씨는 마지막 질문을 했습니다. "그래서 좋은 모델이란 뭔가요?

어느 정도면 합격인가요?" 박시니어 씨가 미소 지으며 답했습니다. "가장 중요한 질문을 했네요."

좋은 모델의 기준은 절대적이지 않고 상황에 따라 다릅니다. 도메인 특성, 비즈니스 요구사항, 데이터의 난이도를 고려해야 합니다.

단순 기준선 모델보다 유의미하게 좋고, 실제 사용 가능한 수준이며, 비용 대비 효과가 있다면 좋은 모델입니다.

다음 코드를 살펴봅시다.

from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from sklearn.dummy import DummyRegressor
import numpy as np

# 실제 데이터
y_true = np.array([100, 150, 200, 250, 300, 350, 400])
y_pred = np.array([110, 145, 205, 245, 310, 340, 395])

# 기준선 모델 (평균만 예측)
baseline = DummyRegressor(strategy='mean')
baseline.fit(y_true.reshape(-1, 1), y_true)
y_baseline = baseline.predict(y_true.reshape(-1, 1))

# 우리 모델과 기준선 비교
print("="*50)
print("우리 모델:")
print(f"  MAE:  {mean_absolute_error(y_true, y_pred):.2f}")
print(f"  RMSE: {np.sqrt(mean_squared_error(y_true, y_pred)):.2f}")
print(f"  R²:   {r2_score(y_true, y_pred):.4f}")

print("\n기준선 모델 (평균 예측):")
print(f"  MAE:  {mean_absolute_error(y_true, y_baseline):.2f}")
print(f"  RMSE: {np.sqrt(mean_squared_error(y_true, y_baseline)):.2f}")
print(f"  R²:   {r2_score(y_true, y_baseline):.4f}")

improvement = (1 - mean_absolute_error(y_true, y_pred) /
               mean_absolute_error(y_true, y_baseline)) * 100
print(f"\n개선율: {improvement:.1f}%")
print("="*50)

김개발 씨는 모든 평가 지표를 배웠습니다. 이제 실제로 모델을 평가할 차례였죠.

그런데 궁금증이 생겼습니다. "RMSE가 100이면 좋은 건가요, 나쁜 건가요?" 박시니어 씨가 중요한 이야기를 시작했습니다.

"절대적인 기준은 없어요. 하지만 좋은 모델인지 판단하는 방법은 있습니다." 그렇다면 좋은 모델의 기준이란 정확히 무엇일까요?

쉽게 비유하자면, 좋은 모델의 기준은 마치 좋은 성적의 기준과 같습니다. 수능 영어 90점이 좋은 점수일까요?

전국 평균이 50점이라면 대단히 좋은 점수입니다. 하지만 평균이 85점이라면 그저 그런 점수죠.

즉, 절대 점수가 아니라 상대적인 비교가 중요합니다. 모델도 마찬가지입니다.

RMSE 100이 좋은지는 데이터와 상황에 따라 다릅니다. 명확한 기준 없이 모델을 평가하던 시절에는 어떤 문제가 있었을까요?

개발자들은 종종 착각했습니다. "R²가 0.7이 나왔는데, 이게 좋은 건가요?" 누군가는 "낮다"고 하고, 누군가는 "괜찮다"고 했습니다.

일관된 판단 기준이 없었던 것이죠. 더 큰 문제는 비즈니스 가치와 연결하지 못한다는 것이었습니다.

모델 성능이 좋아도 실제 서비스에 도움이 안 되면 무용지물입니다. 바로 이런 문제를 해결하기 위해 다층적인 평가 기준을 사용합니다.

첫 번째 기준은 기준선 모델과의 비교입니다. 가장 단순한 모델, 예를 들어 평균값만 예측하는 모델보다 나아야 합니다.

이것도 못 이기면 머신러닝을 쓸 이유가 없습니다. 위의 코드처럼 DummyRegressor를 사용해서 기준선을 만들 수 있습니다.

두 번째 기준은 비즈니스 요구사항입니다. 예를 들어 재고 예측 모델이라면, "오차가 10% 이내여야 재고 낭비를 막을 수 있다"는 식의 구체적인 기준이 있을 수 있습니다.

이 기준을 만족하면 좋은 모델입니다. 세 번째 기준은 도메인 난이도입니다.

주식 가격처럼 예측이 본질적으로 어려운 데이터라면 R² 0.3도 훌륭할 수 있습니다. 반대로 선형 관계가 명확한 데이터라면 R² 0.9 이상을 기대할 수 있습니다.

위의 코드를 한 줄씩 살펴보겠습니다. 먼저 실제 값과 우리 모델의 예측 값을 준비합니다.

그다음 DummyRegressor로 기준선 모델을 만듭니다. strategy='mean'은 항상 평균값을 예측한다는 뜻입니다.

이제 두 모델의 지표를 계산하고 비교합니다. 결과를 보면 우리 모델이 기준선보다 훨씬 좋다는 것을 알 수 있습니다.

R²가 양수라는 것 자체가 기준선을 이겼다는 뜻입니다. 개선율을 계산하면 구체적으로 얼마나 나아졌는지 알 수 있습니다.

"기준선 대비 60% 개선"이라고 하면 설득력이 있습니다. 실제 현업에서는 어떻게 활용할까요?

예를 들어 고객 이탈 예측 모델을 개발한다고 가정해봅시다. 단순히 "모든 고객이 이탈하지 않는다"고 예측하는 기준선 모델이 있습니다.

이 모델의 정확도가 90%라고 해봅시다. 우리 머신러닝 모델이 정확도 92%를 달성했다면 좋은 건가요?

비즈니스 관점에서 봐야 합니다. 2% 개선으로 몇 명의 이탈을 막을 수 있나요?

그 가치가 모델 개발 및 운영 비용보다 큰가요? **ROI(투자 대비 수익)**를 계산해야 합니다.

만약 2% 개선으로 월 1000만원의 손실을 막을 수 있고, 모델 운영 비용이 월 100만원이라면 충분히 좋은 모델입니다. 또한 점진적 개선도 중요합니다.

첫 번째 버전에서 완벽할 수는 없습니다. 기준선보다 유의미하게 좋으면 일단 배포하고, 사용자 피드백을 받으며 지속적으로 개선하는 것이 현실적입니다.

하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 훈련 데이터 성능만 보는 것입니다.

훈련 데이터에서 R² 0.99가 나왔다고 기뻐하지 마세요. 과적합일 수 있습니다.

테스트 데이터에서의 성능이 진짜 실력입니다. 훈련과 테스트의 성능 차이가 크면 과적합 신호입니다.

또한 통계적 유의성도 확인해야 합니다. 데이터가 적으면 우연히 좋은 결과가 나올 수 있습니다.

충분한 데이터로 검증하고, 가능하다면 교차 검증(cross-validation)을 사용하세요. 마지막으로 엣지 케이스를 확인하세요.

평균 성능은 좋은데, 특정 케이스에서만 엄청나게 틀릴 수 있습니다. 데이터를 세그먼트별로 나눠서 각각의 성능을 확인하는 것이 좋습니다.

다시 김개발 씨의 이야기로 돌아가 봅시다. 기준선과 비교한 김개발 씨는 자신감을 얻었습니다.

"우리 모델이 기준선보다 60%나 좋네요!" 박시니어 씨가 조언했습니다. "좋은 출발이에요.

이제 실제 테스트 데이터에서도 확인하고, 비즈니스 팀과 논의해봅시다. 이 성능이 실제로 가치 있는지 검증해야 해요." 김개발 씨는 고개를 끄덕였습니다.

"모델 평가는 단순히 숫자만 보는 게 아니라, 비즈니스와 연결하는 과정이군요!" 좋은 모델의 기준을 제대로 이해하면 실용적인 머신러닝 시스템을 만들 수 있습니다. 여러분도 기준선 비교, 비즈니스 요구사항, 도메인 난이도를 종합적으로 고려해 보세요.

실전 팁

💡 - 항상 기준선 모델을 만들어서 비교하세요. 의미 있는 개선인지 확인할 수 있습니다.

  • 비즈니스 팀과 협업해서 실질적인 성능 기준을 정하세요. 숫자만으로는 부족합니다.

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#머신러닝#회귀평가#성능지표#모델평가

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.