서론
본 기사는 'Python으로 머신러닝을 수행하는 scikit-learn 입문' 시리즈의 제7편입니다.
제6편에서는 분류(Classification) 모델의 평가 지표를 학습했습니다.
제7편에서는 회귀(Regression, 수치 예측) 모델의 평가 지표를 다룹니다.
제3편에서 선형 회귀 모델을 만들었지만, '그래서, 얼마나 정확한가?'라는
핵심 질문에는 답하지 못했습니다. 본 기사에서 그 답을 제시합니다.
제가 사용하는 scikit-learn 라이브러리 버전은 "1.5.2"입니다.
본 시리즈 구성
시리즈 구성 예정 (총 11개 글)
- 설치 ~ 머신러닝의 전체 그림 이해 (fit / predict)
- 데이터 준비 ~ train_test_split과 표준화(StandardScaler)
- 선형 회귀 ~ LinearRegression으로 수치 예측하기
- 분류 입문 ~ 로지스틱 회귀와 k-최근접 이웃(KNN)
- 결정 트리와 랜덤 포레스트
- 분류 모델 평가 ~ 혼동 행렬, 정확도, 정밀도, 재현율, F1 점수
회귀 모델 평가 ~ MAE, MSE, RMSE, 결정계수 R² (본 기사) - 교차 검증과 하이퍼파라미터 조정(cross_val_score・GridSearchCV) (공개 후 링크 추가 예정)
- 클러스터링 ~ KMeans (비지도 학습) (공개 후 링크 추가 예정)
- 차원 축소 ~ PCA (주성분 분석) (공개 후 링크 추가 예정)
- 파이프라인 ~ 전처리와 모델을 하나로 묶기 + 총정리 (공개 후 링크 추가 예정)
총 11개의 글 이후에는 시리즈의 요약 정리글과, 고객 이탈 예측을 처음부터 끝까지 진행하는 실습편을 공개할 예정입니다.
본 기사의 목표
본 기사에서는 다음 내용을 이해하는 것을 목표로 합니다.
- 회귀 평가 = '예측값과 실제값의 차이'를 어떻게 측정할 것인가
- MAE, MSE, RMSE의 차이점 및 사용처
- 결정계수 R² (모델 설명력)의 의미
- scikit-learn에서의 계산 방법
회귀 평가 = '오차(誤差)' 측정하기
분류는 '맞음/틀림'이 명확했지만, 회귀는 수치의 예측입니다.
예를 들어 실제 월세가 10만 엔인데, 예측이 9.5만 엔이라면 **'0.5만 엔의 차이'**가 발생합니다.
이 차이(오차)가 작을수록 좋은 모델이며, 이것이 회귀 평가의 기본입니다.
우선 제3편과 동일한 당뇨병 데이터로 회귀 모델을 만들고 예측값을 준비하겠습니다.
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
...
지표 ①: MAE (평균 절대 오차)
**MAE (Mean Absolute Error: 평균 절대 오차)**는
**'예측 차이의 크기(절댓값)의 평균'**입니다. 가장 직관적인 지표입니다.
from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(y_test, y_pred)
print("MAE:", round(mae, 2))
...
💡 MAE는
'평균적으로 약 OO만큼 차이가 난다'라고 그대로 해석할 수 있습니다. 이번 경우라면 '평균 42.8 정도 차이가 난다'라는 의미입니다. 단위가 예측 대상과 같기 때문에 설명하기 가장 쉬운 지표입니다.
지표 ②: MSE (평균 제곱 오차)
**MSE (Mean Squared Error: 평균 제곱 오차)**는
차이를 제곱한 후 평균을 낸 지표입니다.
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_test, y_pred)
print("MSE:", round(mse, 2))
...
💡 MSE는 오차를
제곱하기 때문에 큰 차이를 강하게 벌칙합니다 (이상치에 민감함). '가끔 크게 벗어나는 것'을 특히 피하고 싶을 때 유용합니다. 다만 제곱했기 때문에 단위가 원래와 달라지며(엔이라면 엔²), 숫자의 크기를 직관적으로 해석하기 어렵다는 단점이 있습니다.
지표 ③: RMSE (제곱 평균 제곱근 오차)
MSE의 '단위가 변해버리는' 약점을 해소한 것이 **RMSE (Root Mean Squared Error: 제곱 평균 제곱근 오차)**입니다.
MSE의 **제곱근(루트)**을 취함으로써 단위를 원래대로 되돌립니다.
import numpy as np
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
print("RMSE:", round(rmse, 2))
...
💡 RMSE는 MAE와 같은 단위로 해석할 수 있으면서도 큰 오차를 가중치 있게 반영한다는 두 가지 장점을 모두 갖춘 지표입니다. 따라서 회귀 평가에서 가장 많이 사용됩니다. MAE보다 반드시 큰 값이 나오며, 'RMSE가 MAE보다 현저히 크다'는 것은 일부 데이터에 크게 벗어난 아웃라이어가 존재할 수 있다는 신호입니다.
💡 비교적 최신 scikit-learn(1.4 이상)에서는 from sklearn.metrics import root_mean_squared_error를 통해 RMSE를 직접 계산할 수 있습니다. 구형 환경에서는 위와 같이 np.sqrt(mean_squared_error(...))를 사용합니다.
지표④: 결정계수 R² (모델의 설명력)
마지막은 **결정계수(R²)**입니다. 이는 조금 성격이 다릅니다.
MAE/RMSE가 '오차의 크기'를 나타내는 반면, R²는 **'모델이 데이터를 얼마나 잘 설명하고 있는지'**를 0부터 1 사이의 비율로 나타냅니다.
from sklearn.metrics import r2_score
r2 = r2_score(y_test, y_pred)
print("R²:", round(r2, 3))
...
R²의 해석은 다음과 같습니다.
| R² 값 | 의미 |
|---|
| 1.0에 가까움 | 거의 완벽하게 설명하고 있음 (좋음) |
| ... | |
| 💡 R²는 단위에 의존하지 않기 때문에, 예측 대상이 '원(Yen)'이든 'kg'이든 같은 척도(0~1)로 비교할 수 있다는 것이 강점입니다. '이 모델은 합격점인가?'를 대략적으로 판단하는 데 유용합니다. 반면, MAE/RMSE처럼 '구체적으로 얼마나 오차가 날지'는 알 수 없기 때문에, R²와 RMSE를 함께 사용하는 것이 실무의 정석입니다. | |
참고로, 3회차에서 사용했던 model.score()는 회귀의 경우 이 R² 값을 반환합니다.
print(model.score(X_test, y_test)) # r2_score와 같은 값이 나옴
요약: 어떤 지표를 사용해야 할까?
회귀 평가 지표를 아래 표에 정리했습니다. 기본적으로는 'RMSE + R²'의 병용만으로 충분합니다.
| 지표 | 측정하는 것 | 특징 | 단위 |
|---|
| MAE | 평균적인 오차 | 직관적 / 아웃라이어에 강함 | 원래 단위와 동일 |
| ... | | | |
- |
'평균적으로 얼마나 오차가 날지?'를 전달하고 싶을 때 → MAE / RMSE -
'아웃라이어를 중요하게 생각할 때' → MSE / RMSE -
'모델의 좋고 나쁨을 대략 판단하고 싶을 때' → R²
맺음말
본 기사에서는 회귀 모델의 평가 지표를 학습했습니다.
- 회귀 평가란
**'예측값과 실제값의 오차(오차)'**를 측정하는 것 -
MAE는 직관적, RMSE는 가장 많이 사용됨, MSE는 아웃라이어에 민감함 -
R²는 '설명력'을 0~1로 나타내며 단위에 의존하지 않아 비교 가능 -
실무에서는
RMSE + R²의 병용이 정석입니다.
6회차(분류)와 본 기사(회귀)를 통해 모델을 수치적으로 평가하는 능력을 갖추게 되었습니다.
다음으로는 그 평가를 더욱 신뢰할 수 있는 것으로 만드는 '교차 검증'으로 넘어가겠습니다.
다음 예고
제8회 '교차 검증과 하이퍼파라미터 조정(cross_val_score・GridSearchCV)'에서는,
평가의 신뢰성을 높이고 모델을 자동으로 튜닝하는 방법을 학습합니다.
- 교차 검증 (데이터를 여러 번 나누어 평가하여 결과를 안정화)
GridSearchCV
(최적의 하이퍼파라미터를 자동 탐색)
'우연히 좋은 결과'를 방지하고, 진정으로 강력한 모델을 만드는 기술입니다.
본 시리즈가 도움이 될 것 같다고 느껴지시면 '좋아요'나 팔로우를 해주시는 것이 다음 글을 쓰는 큰 힘이 됩니다.
참고 문헌
본 기사를 작성하는 데 참고한 사이트를 정리했습니다.
본 시리즈 요약 기사
본 시리즈의 모든 기사를 모은 기사는 시리즈 완결 후에 공개될 예정입니다. (공개 후 링크 추가 예정)
Discussion