Regression Evaluation#

회귀 문제에서 데이터를 통해 생성한 모델이 좋은지 판단하기 위해 자주사용하는 평가 함수에 대해서 알아봅니다.

Mean absolute error(MAE)#

MAE 값은 예측 값과 실제 값의 차이의 절대값의 평균을 나타냅니다.

\( \text{MAE}(y, \hat{y}) = \frac{1}{n_{\text{samples}}} \sum_{i=0}^{n_{\text{samples}}-1} \left| y_i - \hat{y}_i \right|. \)

예측 값이 배열 형태인 경우는 multioutput 옵션을 이용해서 MAE 값의 계산 방법을 조정할 수 있습니다. 기본적으로는 MAE 들의 평균 값을 리턴하며, ‘raw_values’ 값을 통해 변경 없이 리턴하거나, [0.3, 0.7] 가중치 배열를 통해 적용 비율을 달리 할 수 있습니다.

from sklearn.metrics import mean_absolute_error

y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mae = mean_absolute_error(y_true, y_pred)
print("MAE={}".format(mae))

# Multioutput
y_true = [[0.5, 1], [-1, 1], [7, -6]]
y_pred = [[0, 2], [-1, 2], [8, -5]]
mae = mean_absolute_error(y_true, y_pred) 
print("MAE={}".format(mae))

mae = mean_absolute_error(y_true, y_pred, multioutput='raw_values') 
print("MAE={}".format(mae))

mae = mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7]) 
print("MAE={}".format(mae))
MAE=0.5
MAE=0.75
MAE=[0.5 1. ]
MAE=0.85

Mean squared error(MSE)#

MSE 값은 예측 값과 실제 값의 차이의 제곱 값의 평균을 나타냅니다.

\( \text{MSE}(y, \hat{y}) = \frac{1}{n_\text{samples}} \sum_{i=0}^{n_\text{samples} - 1} (y_i - \hat{y}_i)^2. \)

from sklearn.metrics import mean_squared_error

y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mse = mean_squared_error(y_true, y_pred)
print("MSE={}".format(mse))

y_true = [[0.5, 1], [-1, 1], [7, -6]]
y_pred = [[0, 2], [-1, 2], [8, -5]]
mse = mean_squared_error(y_true, y_pred) 
print("MSE={}".format(mse))

mse = mean_squared_error(y_true, y_pred, multioutput='raw_values') 
print("MSE={}".format(mse))

mse = mean_squared_error(y_true, y_pred, multioutput=[0.3, 0.7]) 
print("MSE={}".format(mse))
MSE=0.375
MSE=0.7083333333333334
MSE=[0.41666667 1.        ]
MSE=0.825

Median absolute error(MedAE)#

MedAE는 모든 예측 값과 실제 값의 차이의 절대 값 중에 중앙 값을 구합니다. 중앙 값을 사용하기 때문에 에러 이상치에 민감하지 않게 됩니다.

\( \text{MedAE}(y, \hat{y}) = \text{median}(\mid y_1 - \hat{y}_1 \mid, \ldots, \mid y_n - \hat{y}_n \mid). \)

이 평가 함수는 multioutput 조건을 제공하지 않습니다.

from sklearn.metrics import median_absolute_error

y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
medae = median_absolute_error(y_true, y_pred)
print("MedAE={}".format(medae))
MedAE=0.5

R² score#

R2 Score 함수는 the coefficient of determination 를 계산합니다. 이 값은 모델이 독립변수를 이용하여 종속변수를 얼마나 잘 설명할 수 있는지는 나타내는 척도입니다. 1.0 에 가까울 수록 모델의 설명력이 좋음을 나타냅니다.

\( R^2(y, \hat{y}) = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{n} (y_i - \bar{y})^2} \)

multioutput 은 아래 옵션들을 지원합니다.

  • ‘raw_values’ : 변형 없이 그대로 반환

  • ‘uniform_average’ : uniform 가중치 평균

  • ‘variance_weighted’ : variance 가중치 평균

  • array type: 지정 가중치

from sklearn.metrics import r2_score

y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
r2 = r2_score(y_true, y_pred)  
print("R2={}".format(r2))

y_true = [[0.5, 1], [-1, 1], [7, -6]]
y_pred = [[0, 2], [-1, 2], [8, -5]]
r2 = r2_score(y_true, y_pred, multioutput='variance_weighted')
print("R2={}".format(r2))

y_true = [[0.5, 1], [-1, 1], [7, -6]]
y_pred = [[0, 2], [-1, 2], [8, -5]]
r2 = r2_score(y_true, y_pred, multioutput='uniform_average')
print("R2={}".format(r2))

r2 = r2_score(y_true, y_pred, multioutput='raw_values')
print("R2={}".format(r2))

r2_score(y_true, y_pred, multioutput=[0.3, 0.7])
print("R2={}".format(r2))
R2=0.9486081370449679
R2=0.9382566585956417
R2=0.9368005266622779
R2=[0.96543779 0.90816327]
R2=[0.96543779 0.90816327]