[인사이드 머신러닝] 단순회귀모델: 회귀선의 적합도 평가

아래의 내용을 읽어보기 전에 이전 포스트([인사이드 머신러닝] 단순회귀모델: 회귀계수의 추정)를 먼저 보는 것이 전체적인 흐름을 이해하는데 도움이 됩니다.

이전 포스트에서 살펴본 방식대로 단순회귀모델에서 회귀직선을 추정한 후에는 그 결과가 얼마나 타당한지 검토하여야 한다. 산점도(scatter plot)을 통해 시각적으로 확인하는 방법도 가능하겠으나 추정한 모델의 적합도를 정량적으로 평가하기 위한 지표가 필요하다. 다음의 세 가지 지표들이 회귀직선의 적합도를 측정하는데 널리 사용된다.

  • FF-검정 (FF-test)
  • 결정계수 (R2R^2, coefficient of determination)
  • Residual standard error

위 지표들을 계산하는데 있어 선행되어야 하는 것이 신호의 변동을 분석하는 것이다. 이러한 분석 과정을 분산분석(analysis of variance: ANOVA)이라 부르며, 본 포스트에서는 ANOVA부터 살펴보기로 한다.


분산분석 (ANOVA)

하나의 관찰값 yiy_i

yiyˉtotal deviation=(yiy^i)unexplained deviation+(y^iyˉ)explained deviation(1)\tag{1} \underbrace{y_i - \bar{y}}_{\text{total deviation}} = \underbrace{(y_i-\hat{y}_i)}_{\text{unexplained deviation}} + \underbrace{(\hat{y}_i-\bar{y})}_{\text{explained deviation}}

즉, 총 편차(total deviation)는 회귀직선에 의해 설명되는 편차(explained deviation)과 회귀직선에 의해 설명되지 않는 편차(unexplained deviaion), 즉 residual로 나타낼 수 있다. 식 (1)을 시각적으로 나타내면 [그림 1]과 같다.

[그림 1] 회귀직선에 대한 총 편차의 구분

식 (1)의 양변을 제곱하고 모든 ii에 대한 합을 구하면

i(yiyˉ)2=i(yiy^i)2+i(y^iyˉ)2+2i(yiy^i)(y^iyˉ)(2)\tag{2} \sum_i (y_i - \bar{y})^2 = \sum_i (y_i - \hat{y}_i)^2 + \sum_i (\hat{y}_i - \bar{y})^2 + 2\sum_i (y_i - \hat{y}_i)(\hat{y}_i - \bar{y})

와 같이 되는데, 마지막 항은

i(yiy^i)(y^iyˉ)=iei(y^iyˉ)=ieiy^iyˉiei=0(3)\tag{3} \begin{aligned} \sum_i (y_i - \hat{y}_i)(\hat{y}_i - \bar{y}) &= \sum_i e_i (\hat{y}_i - \bar{y}) \\&= \sum_i e_i\hat{y}_i - \bar{y}\sum_i e_i \\ &= 0 \end{aligned}

이 되어, 식 (2)의 총 편차의 제곱의 합은 다음과 같이 두 변동의 합으로 분해가 된다. (만약, 식(3)이 0이 되는 것이 자연스럽게 받아들여지지 않는다면 이전 포스트를 참조)

i(yiyˉ)2SST=i(yiy^i)2SSE+i(y^iyˉ)2SSR(4)\tag{4} \underbrace{\sum_i (y_i - \bar{y})^2}_{SST} = \underbrace{\sum_i (y_i - \hat{y}_i)^2}_{SSE} + \underbrace{\sum_i (\hat{y}_i - \bar{y})^2}_{SSR}

식 (4)에서 SSTSST, SSRSSR, SSESSE는 아래의 약어이다.

  • SSTSST: total sum of squares (총제곱합), 또는 total variation (총 변동)이라고도 부름.
  • SSRSSR: sum of squares due to regression (회귀에 의한 제곱합, 회귀직선에 의해 설명되는 변동)
  • SSESSE: sum of squares due to residual errors (오차에 의한 제곱합, 회귀직선에 의해 설명되지 않는 변동)

우리는 단순회귀모델을 고려하고 있으므로 절편계수를 제외하면 회귀계수는 하나이다. 회귀직선에 의해 설명되는 변동 SSRSSR은 자유도 1을 갖는다. 총 NN개의 샘플이 주어졌을 경우, SSTSST의 자유도는 N1N-1

SSTSST, SSESSE, SSRSSR을 계산할 때 식 (4)의 정의대로 계산하기보다는 아래와 같이 계산하는 것이 더 편리하다.

SST=i(yiyˉ)2=iyi2Nyˉ2SSR=i(y^iyˉ)2=i(yˉ+β^1(xixˉ)yˉ)2=β^12i(xixˉ)2=(SxySxx)2Sxx=Sxy2SxxSSE=SSTSSR(5)\tag{5} \begin{aligned} SST &= \sum_i (y_i - \bar{y})^2 = \sum_i y_i^2 - N\bar{y}^2 \\ SSR &= \sum_i (\hat{y}_i - \bar{y})^2 \\ &= \sum_i \left( \cancel{\bar{y}}+\hat{\beta}_1(x_i-\bar{x})- \cancel{{\bar{y}}} \right)^2 \\ &= \hat{\beta}_1^2\sum_i \left(x_i-\bar{x} \right)^2 \\ &= \left(\frac{S_{xy}}{S_{xx}}\right)^2S_{xx} \\ &= \frac{S_{xy}^2}{S_{xx}} \\ SSE &= SST - SSR \end{aligned}

위 식에서 SSRSSR의 표현식을 유도하기 위해 아래와 같이 이전 포스트에서 유도되었던 결과들을 사용하였다.

  • y^i=yˉ+β^1(xixˉ)\hat{y}_i=\bar{y} + \hat{\beta}_1(x_i-\bar{x})
  • β^1=Sxy/Sxx\hat{\beta}_1 = S_{xy}/S_{xx}
  • SxxS_{xx}

위와 같은 일련의 과정을 통해 우리는 총 변동을 회귀직선에 의한 변동과 오차에 의한 변동을 정량적으로 분해할 수 있었다. 앞에서 구한 세 가지 제곱합 SSTSST, SSRSSR, SSESSE를 각각 자유도로 나누면 일종의 분산이 된다. 예를 들어, SST/(N1)SST/(N-1)

source of
variation
Degrees of FreedomSum of SquaresMean SquaresF0F_0
Regression11SSR=i(y^iyˉ)2SSR=\sum_i (\hat{y}_i - \bar{y})^2MSR=SSR1MSR=\frac{SSR}{1}F0=MSRMSEF_0=\frac{MSR}{MSE}
Residual ErrorN2N-2SSE=i(yiy^i)2SSE=\sum_i (y_i - \hat{y}_i)^2MSE=SSEN2MSE=\frac{SSE}{N-2}
TotalN1N-1SST=i(yiyˉ)2SST=\sum_i (y_i - \bar{y})^2

FF-검정(FF-Test)

회귀직선이 유의한가 하는 것은 분산분석을 통해 구한 MSRMSRMSEMSE에 비해 얼마나 큰지 비교함으로써 판단할 수 있다. 만약, 회귀직선이 유효하다면 대부분의 변동이 회귀직선에 의해 설명될 것이므로 MSRMSRMSEMSE보다 훨씬 클 것이다.

MSRMSRMSEMSE는 수학적으로 분산이다. 즉, 각각 회귀직선에 의해 설명되는 변동의 분산과 오차에 의한 변동의 분산을 나타낸다. 통계학에서 두 모집단의 분산을 비교하는 경우에는 분산의 차이를 비교하지 않고 분산의 비율을 계산한다. 두 분산의 비율을 이용하는 이유는 오로지 표본분산비에 대한 확률분포함수를 수학적으로 찾아내기 용이하기 때문이다. 그리고 이때 사용하는 것이 바로 FF 분포이다.

FF-Distribution: Review

표본분산과 카이제곱분포

정규분포를 따르는 모집단에서 NN개의 표본을 추출하여 표본분산을 다음과 같이 구할 수 있다.

S2=1N1i=1N(XiXˉ)2S^2=\frac{1}{N-1} \sum_{i=1}^N (X_i - \bar{X})^2

그리고

(n1)S2χN12(n-1)S^2 \sim \chi_{N-1}^2

즉, (n1)S2(n-1)S^2

카이제곱 랜덤변수의 비율과 FF분포

서로 독립이면서 자유도가 각각 k1k_1

F=V1/k1V2/k2F(k1,k2)F = \frac{V_1/k_1}{V_2/k_2} \sim F(k_1, k_2)

[그림 2] 자유도에 따른 F-분포 그래프 (source: [5])

Hypothesis Test

앞의 분산분석에서 MSRMSRMSEMSE는 각각 SSRSSRSSESSE를 자유도로 나누어 구하였다. 그리고 SSRSSRSSESSE는 정의에 의해 각각 자유도 11N2N-2

F0=MSRMSE(6)\tag{6} F_0 = \frac{MSR}{MSE}

회귀직선의 기울기(β1\beta_1

H0:β1=0H1:β10(7)\tag{7} \begin{aligned} H_0 : \beta_1 &= 0 \\ H_1: \beta_1 &\neq 0 \end{aligned}

즉, (7)의 가설을 검증하기 위해 (6)의 통계량을 사용한다. 식 (7)의 가설에서 대립가설 (H1H_1

[그림 3] F 검정의 의미 (source: [6])


결정계수 (R2R^2, coefficient of determination)

모든 관측값들이 회귀직선 위에 있다면 추정된 회귀식이 모든 표본의 변동을 완전히 설명할 것이고, SSESSE는 0이 될 것이다3. 따라서 SSTSST에서 SSESSE가 차지하는 부분이 작거나 반대로 SSTSST에서 SSRSSR이 차지하는 부분이 크면, 추정된 회귀모형의 적합도가 높다고 할 수 있다.

결정계수는 총 변동 SSTSST에서 설명된 변동 SSRSSR이 차지하는 비로 정의된다. 결정계수는 일반적으로 R2R^2로 나타내며 R-squared라고도 부른다. 수학적으로는 다음과 같이 정의된다.

R2=SSRSST=explained variationtotalvariation=1SSESST=1unexplained variationtotalvariation(8)\tag{8} \begin{aligned} R^2 &= \frac{SSR}{SST} = \frac{\text{explained variation}}{total variation} \\ &=1-\frac{SSE}{SST} =1- \frac{\text{unexplained variation}}{total variation} \end{aligned}

R2R^2의 범위는 0R210 \leq R^2 \leq 1

r=i=1N(xixˉ)(yiyˉ)i=1N(xixˉ)2i=1N(yiyˉ)2=sxysxxsyy=±R2(9)\tag{9} \begin{aligned} r &= \frac{\sum_{i=1}^N(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum_{i=1}^N(x_i-\bar{x})^2} \sqrt{\sum_{i=1}^N(y_i-\bar{y})^2}} \\ &= \frac{s_{xy}}{\sqrt{s_{xx}}\sqrt{s_{yy}}} \\ &= \pm \sqrt{R^2} \end{aligned}

식 (9)로부터 결정계수를 R2R^2으로 표기하는 이유(상관관계의 제곱)를 알 수 있다.


Residual standard error

Residual standard error는 root mean square error를 의미한다. 즉, MSEMSE의 제곱근을 의미하는데, 사실 MSEMSE를 이용해서 그냥 해석해도 되고, 수학적 편의성 때문에 그렇게들 많이 한다. 즉, MSEMSE가 작으면 작을수록 회귀선이 관측값들을 잘 설명하고 있다고 해석하는 것이다.

그러나 MSEMSE는 그 값이 작으면 좋은 것은 맞지만 어느 정도의 값이 작은 것인지는 분명하지 않다. MSEMSE의 크기가 관측치의 단위에 의존하기 때문이다. 그래서 수치적으로 적합도를 표현할 때에는 R2R^2와 같은 상대적인 측도를 사용한다.


파이썬 예제

  • sklearn.datasets 패키지의 make_regression() 함수를 이용하여 가상의 선형회귀 데이터를 만들었다.
  • sklearn.linear_model 패키지 아래 LinearRegression 클래스를 lr로 객체화하여 회귀계수를 추정한다.
# generage regression dataset
from sklearn.datasets import make_regression
x, y = make_regression(n_samples=1000, n_features=1, n_targets=1, bias=10, noise=3, random_state=42)

# data split
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.4, random_state=42)

# model training
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x_train, y_train)

# plot the result
import matplotlib.pyplot as plt
import numpy as np
plt.scatter(x_test, y_test, s=10, marker = 'o', c='blue')
plt.plot([np.min(x_test), np.max(x_test)], [np.min(x_test)*lr.coef_+lr.intercept_, np.max(x_test)*lr.coef_+lr.intercept_], c='red')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

# R-squared value
print(lr.score(x_train, y_train))
print(lr.score(x_test, y_test))

# LS estimates
print(lr.coef_, lr.intercept_)
  • lr.score() 메소드를 이용하여 훈련 데이터와 테스트 데이터의 R2R^2 값을 확인한다. 훈련 데이터와 테스트 데이터 모두 0.96 이상의 결정계수 값을 출력하였다. 결정계수가 1에 근접하므로 훈련이 잘 되었다고 할 수 있다..
  • print(lr.coef_, lr.intercept_)를 이용하여 추정된 휘귀계수도 프린트하여 확인해본다.
0.9691481822147915
0.9661977117689878
[16.80174075] 10.144605141789095
  • sklearn 라이브러리에서는 R에서 제공하는 summary()와 유사한 메소드를 제공하지 않는다. 따라서 F0F_0
import statsmodels.api as sm

x = sm.add_constant(x_train)
model = sm.OLS(y_train, x)
results = model.fit()
print(results.summary())
  • 결과는 다음과 같다. R2R^2 값(R-squared)과 추정된 계수 값들(x1, const)이 sklearn을 통해 출력한 값과 거의 동일한 것을 확인할 수 있다.
  • F-statistic는 F0F_0
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.969
Model:                            OLS   Adj. R-squared:                  0.969
Method:                 Least Squares   F-statistic:                 1.878e+04
Date:                Fri, 13 Aug 2021   Prob (F-statistic):               0.00
Time:                        08:42:40   Log-Likelihood:                -1497.0
No. Observations:                 600   AIC:                             2998.
Df Residuals:                     598   BIC:                             3007.
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         10.1446      0.120     84.551      0.000       9.909      10.380
x1            16.8017      0.123    137.058      0.000      16.561      17.042
==============================================================================
Omnibus:                        0.122   Durbin-Watson:                   1.973
Prob(Omnibus):                  0.941   Jarque-Bera (JB):                0.209
Skew:                           0.017   Prob(JB):                        0.901
Kurtosis:                       2.915   Cond. No.                         1.04
==============================================================================

더 복잡한 모델 추정하기

지금까지는 독립변수가 하나이면서 1차식으로 이루어진 경우만을 다루었다. 대부분의 문제들은 독립변수가 여러 개이고 다항식으로 이루어져 있다. 이 문제들을 어떻게 다루는지는 다음 포스트에서 살펴보자.


Footnotes

1: 일반적인 추정량은 불편성(unbiaseness), 일치성(consistency), 효율성(efficiency) 등의 특성을 가져야 바람직하다고 알려져있다. 이중 불편성이란 통계량 값의 평균이 모수(parameter)와 같은 것을 의미하며, 이러한 성징을 갖는 통계량을 unbiased estimator라고 한다.
2: [그림 1]과 이전 포스트의 "단순회귀모델-모델의 정의" 섹션과 식 (3), 식 (15)를 참고하면 본문에서 말하고자 하는 바가 이해될 것이다.
3: 사실 이 경우는 노이즈가 없는 경우로 실존하지 않는다.

참고자료

[1] 김성수, 강명욱, 강위창, "회귀모형," 한국방송통신대학교출판문화원, 2019.
[2] 이태림, 이기재, 이긍희, 장영재, "통계학개론," 한국방송통신대학교출판문화원, 2020.
[3] https://en.wikipedia.org/wiki/F-distribution
[4] https://en.wikipedia.org/wiki/Chi-squared_distribution
[5] https://www.vosesoftware.com/riskwiki/Fdistribution.php
[6] https://www.fromthegenesis.com/hypothesis-testingf-test/

좋은 웹페이지 즐겨찾기