Must Learning With Statistics

다항 회귀분석(Polynomial Regression) 본문

통계 이론

다항 회귀분석(Polynomial Regression)

Doublek Park 2020. 3. 23. 01:30
13. 다항 회귀분석(Polynomial Regression)
  • 다항 회귀분석 : 예측자들이 1차항으로 구성된 것이 아닌, 2차항, 3차항 등으로 구성되어 있는 회귀식
    $$
    \hat y = b_0+b_1x_i+b_2x_{i}^2+\cdots+b_px_p^{p}
    $$

    다항 회귀분석은 위 식처럼 구성이 될 수 있습니다. 다항회귀분석에서는 매우 중요한 개념이 하나 따라오는데, 이를 확인하고 다항 회귀분석을 진행하도록 하겠습니다.

분산-편차의 Trade off 관계

  • Trade off : 두 개의 목표 중에서 하나를 달성하려고 하면 다른 목표가 희생되어야 하는 관계를 의미합니다.

기계학습에서 예측 모형을 만드는 것은 항상 Trade off 관계를 생각해야 됩니다. 기본적으로 통계학에서는 모형의 Target Variable(종속 변수)이 연속형(Continuous)일 때는 MSE 와 Bias에 주목합니다. 만약 Target Variable이 범주형(Categorical)일 경우에는 모형의 Error Rate에 주목합니다. 그 이유는 모형의 정확성은 MSE 혹은 Bias가 얼마나 작은지에 따라 결정되기 때문입니다.

MSE(Mean Squared Error)

앞서 단순선형회귀에서 MSE를 다루었지만, 다시 한번 복습하면서 재차 다루어보도록 하겠습니다.

$MSE$를 이해하기 위해서는 위 그림의 의미를 제대로 숙지하고 있어야 합니다.

$$
Y_i = 실제 관측값 ,
$$

$$
\hat{Y_i} = 예측값
$$

$$
\overline{Y} = 평균
$$

여기서 예측값 $\hat{Y_i}$은 추정된 회귀식 $\hat{Y_i} = \beta_0 + \beta_1X_i$으로부터 추정된 예측 값입니다.
평균값 $\overline{Y}$은 $\overline{Y} = \frac{1}{n}\Sigma(Y_i)$ 평균 산술식으로부터 계산된 표본평균입니다.

보라색 간격에 해당되는 $\hat{Y_i}-\overline{Y}$는 간격의 차이를 설명할 수 있기 때문에($\beta_0 + \beta_1X_i - \frac{1}{n}\Sigma(Y_i)$) 추정된 회귀식이설명이 가능한 영역이 입니다. 하지만 초록색 간격에 해당되는 $Y_i - \hat{Y_i}$는 실제로 관측된 $Y_i$값이 왜 저기에 찍혔는지에 대해서는 설명을 할 수 없습니다. 그런관계로 해당 영역을 설명이 불가능한 영역입니다.

모든 모형은 설명력이 높으며 (혹은 설명 못하는 영역이 적은) 예측이 잘 되는 모형이 좋은 모형입니다. 결국 모형의 결함은 설명을 하지 못하는 $Y_i - \hat{Y_i}$은 오차로 계산하게 됩니다. 이를 잔차(Residuals, 혹은 Error)라고 합니다.

추정된 회귀식 $\hat{Y_i} = \beta_0 + \beta_1X_i$이 변수들 간의 인과관계를 제대로 설명하는지 측정하기 위하여 잔차의 합을 계산하게 됩니다. 여기서 잔차는 상황에 따라 양수가 될 수도, 음수가 될 수도 있습니다. 그렇기에 부호 간 계산으로 잔차의 합이 상쇄되는 것을 방지하기 위하여 잔차를 제곱하여 합을 구하게 됩니다. 이를 오차의 제곱합(Sum Squred Error, $SSE$)라고 부릅니다. 그런 다음 계산된 $SSE$를 보정하기 위하여 $SSE$를 오차의 자유도($df_e$)로 나눕니다. 그렇게 계산 된 값을 오차 평균 제곱합(Mean Squared Error, $MSE$)라고 부릅니다.

$$
SSE = \Sigma(Y_i - \hat{Y_i})^2
$$

$$
MSE = \frac{1}{df_E}\Sigma{(Y_i-\hat{Y_i})^2}
$$
SSE를 오차의 자유도로 나누어주는 이유

  • 제곱 된 값은 항상 양수입니다
  • 양수를 모두 더하게 되면, 데이터가 많을 수록 값은 커지게 됩니다.
  • 그 의미는 SSE자체가 데이터가 많을 수록 단순히 커지는 의미이기 때문에, 정말 오차가 높은가? 에 대한 평가기준이 잘못 해석될 수가 있습니다.
  • 이를 자유도로 나눔으로써 평균이 계산되고, 보정된 평균오차를 모형의 Error 수준으로 판단하게 됩니다.

위와 같은 계산으로 회귀식이 설명 가능한 영역인, $\hat{Y_i} - \overline{Y}$은 각각 다음과 같이 계산이 됩니다.
$$
SSR = \Sigma(\hat{Y_i}-\overline{Y})^2
$$

$$
MSR = \frac{1}{df_R}\Sigma(\hat{Y_i}-\overline{Y})^2
$$

그렇다면 추정되는 회귀식이 데이터의 인과관계를 얼마나 잘 설명하는지 계산하기 위해 설명을 하지 못하는 영역 대비, 설명을 할 수 있는 영역을 비교하게 됩니다.
$$
F , value = \frac{MSR}{MSE} = \frac{\frac{1}{df_R}\Sigma(\hat{Y_i}-\overline{Y})^2}{\frac{1}{df_E}\Sigma{(Y_i-\hat{Y_i})^2}}
$$
$\frac{MSR}{MSE}$는 두 집단의 분산을 비교하는 F 분포를 따르게 됩니다.

추정된 회귀식의 설명하는 영역이 설명하지 못하는 영역에 비해 얼마나 큰지 나타내는 검정통계량(Test Statistics)$F , value$는 값이 클수록 회귀식의 귀무가설($H_0,: 회귀식의 , 기울기가 ,0이다$)를 기각할 가능성이 커지게 됩니다. 그렇다면 $F\ value$값이 커질려면 다음과 같습니다.

  • $MSR$이 증가
  • $MSE$가 감소

분석모형의 성능 평가를 $MSE$로 하는 이유입니다. $MSE$가 작은 모형일수록 회귀식의 오차가 줄기때문에 그만큼 현상을 잘 설명한다고 할 수 있습니다.

Variation & Bias

회귀식으로 추정된 $\hat{Y_i}$는 얼핏보면 단일 값인 점 추정(Point Estimation)으로 생각할 수 있지만, 모든 통계분석 모형은 구간 추정(Interval Estimation)입니다. 구간 추정이란 소리는 추정값에 대한 신뢰구간을 계산한다는 의미입니다.

신뢰구간의 의미는 똑같은 $X$값이 주어졌을 때, 추정값 $\hat{y} = \beta_0 + \beta_1 X$ 의 값이 $[\hat{y} - \alpha , \hat{y} +\alpha]$의 범위에 속한다는 의미입니다. 만약 분산이 크다면, 이 신뢰구간의 길이는 길어지게 되고, 추정의 신뢰성이 떨어지는 문제가 발생합니다.
반대로 편의(Bias)는 추정된 값이 모집단의 특성, 즉 모수를 반영하지 못한다는 의미입니다.

위 그림을 보시면 분산과 편향이 크고 작을 때에 따라 모형의 정확성이 어떻게 변하는지 알 수 있습니다. 모수의 True Value가 원 정중앙에 있다고 하였을 때, Variance 가 크다는 것은 추정값의 범위가 넓은 것을 의미하고, Bias가 크다는 것은 영점조준 사격 훈련 때 탄집군은 생겼지만 영점이 잘못잡혔다와 비슷하다고 생각하시면 됩니다.

선형 & 비선형 Modeling

Linear Regression(선형 회귀분석)과 Non - Linear Regression(비선형 회귀분석)을 잠깐 다루고 가겠습니다.

library(ggplot2)

ggplot(Regression) +
  geom_point(aes(x = X, y = y),col = 'royalblue',alpha = 0.4) +
  geom_smooth(aes(x = X, y = y),col = 'red') +
  theme_bw() +
  xlab("") + ylab("")


ggplot(Regression) +
  geom_point(aes(x = X, y = y2),col = 'royalblue',alpha = 0.4) +
  geom_smooth(aes(x = X, y = y2),col = 'red') +
  theme_bw() +
  xlab("") + ylab("")

)

사람들이 회귀분석을 돌릴 때, 가장 실수하는 부분은 단순하게 변수들 간의 상관관계만을 파악해서 분석하는 경우입니다. 상관관계는 두 변수의 관계가 선형성을 띄는지를 판단하는 것일 뿐입니다. 만약 두 변수가 비선형 관계에 있을 경우, 상관관계는 낮게 잡힐 수도 있습니다. 하지만 상관계수가 낮게 잡힌다고 해서 이 두 변수 간에 관계가 존재하지 않는 것은 아닙니다. 비선형으로 회귀식을 잡으면 충분히 관계를 설명할 수가 있게 됩니다.

ggplot(Regression) +
  geom_point(aes(x = X, y = y3),col = 'royalblue',alpha = 0.4) +
  geom_smooth(aes(x = X, y = y3),col = 'red') +
  theme_bw() +
  xlab("") + ylab("")

특히 이런 경우, 데이터의 상관관계수가 매우 낮게 계산이 됩니다. 상관계수만 보면 매우 낮기때문에 일반적으로 모델링 할 생각부터 안하게 됩니다. 하지만 분석모형에서는 이러한 비선형 관계들로 관계식을 추정할 수 있습니다.

  • 선형 회귀분석

두 변수의 관계가 선형인 경우에 대해서 회귀분석을 추정해보겠습니다.

LINEAR = lm(y ~ X,data = Regression)
summary(LINEAR)

Call:
lm(formula = y ~ X, data = Regression)

Residuals:
    Min      1Q  Median      3Q     Max 
-9.5537 -5.7116  0.2738  5.0961 10.2835 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   1.9839     0.9975   1.989   0.0486 *  
X            10.0924     0.1620  62.308   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.085 on 148 degrees of freedom
Multiple R-squared:  0.9633,    Adjusted R-squared:  0.963 
F-statistic:  3882 on 1 and 148 DF,  p-value: < 2.2e-16
ggplot(Regression) +
  geom_smooth(aes(x = X, y = predict(LINEAR, newdata = Regression)),col = "red",  method = 'lm') +
  geom_point(aes(x = X , y = y),col = 'royalblue') + ylab("") + xlab("") + ggtitle("Linear Regression") +
  theme_bw()

일반적인 선형회귀분석, 즉 선형을 완벽하게 띄고 있는 변수 간의 관계는 간단하게 선형으로 적합시키면 문제가 없습니다.

  • Polynomial Regression

변수 간의 관계가 y=x2y=x2형태를 가지는 데이터에 대해 2차항 회귀분석(다항 회귀분석)을 적용시켜 보겠습니다.

# 제곱꼴 관계를 선형으로 적합
NonLinear = lm(y2 ~ X, data = Regression)
summary(NonLinear)

Call:
lm(formula = y2 ~ X, data = Regression)

Residuals:
    Min      1Q  Median      3Q     Max 
-154.19  -84.79  -46.28   46.35  446.95 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -208.872     21.225  -9.841   <2e-16 ***
X            103.788      3.447  30.113   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 129.5 on 148 degrees of freedom
Multiple R-squared:  0.8597,    Adjusted R-squared:  0.8587 
F-statistic: 906.8 on 1 and 148 DF,  p-value: < 2.2e-16

2차항의 관계를 선형으로 적합하였을 때의 설명력은 85 ~ 86%가 나온 것을 알 수가 있습니다.

다음으로 다항 회귀분석(2차항)을 적용시켜보도록 하겠습니다.

NonLinear2 = lm(y2 ~ poly(X,2), data = Regression)
summary(NonLinear2)

Call:
lm(formula = y2 ~ poly(X, 2), data = Regression)

Residuals:
    Min      1Q  Median      3Q     Max 
-65.180 -25.879   5.213  29.693  39.436 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  345.341      2.582  133.74   <2e-16 ***
poly(X, 2)1 3899.149     31.625  123.29   <2e-16 ***
poly(X, 2)2 1527.866     31.625   48.31   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 31.63 on 147 degrees of freedom
Multiple R-squared:  0.9917,    Adjusted R-squared:  0.9916 
F-statistic:  8767 on 2 and 147 DF,  p-value: < 2.2e-16

회귀식을 $\hat{y_i} = \beta_0 + \beta_1x_i +\beta_2x_i^2$형태로 적합한 결과 설명력은 99%로 상승한 것을 볼 수 있습니다.

ggplot(Regression) +
  geom_smooth(aes(x = X, y = predict(NonLinear2,newdata = Regression)),col = "red") +
  geom_point(aes(x = X, y = y2),col = 'royalblue') + 
  ylab("") + xlab("") + 
  ggtitle("Polynomial Regression") +
  theme_bw()

  • 유연성이 있는 회귀분석

    다음 회귀분석은 $y=sin(x)$꼴을 가지는 두 변수 간의 관계를 회귀식으로 추정해보도록 하겠습니다. 워낙 형태가 괴이하기 때문에 몇차 항을 적합시켜야할지 모르겠습니다. 그러하니 변수항의 차수(Degree of Polynomial)을 2 ~ 10까지 주고 Testing을 해보도록 하겠습니다.

# Train Set & Test Set 형성

TRAIN = Regression[1:100,]
TEST = Regression[101:150,]

# 저장공간 생성

DEGREE = c()
TEST_MSE = c()
TRAIN_MSE = c()
Adj_R = c()
TEST_VAR = c()
TRAIN_VAR = c()

# 적합 모델 찾기 

for( degree in 2:10){

  FLEXIBLE_MODEL = lm(y3 ~ poly(X,degree),data = TRAIN)

  ## Summary Save

  SUMMARY = summary(FLEXIBLE_MODEL)
  ANOVA = anova(FLEXIBLE_MODEL)
  DEGREE = c(DEGREE,degree)

  ## R_SQUARE

  Adj_R = c(Adj_R,SUMMARY$adj.r.squared)

  ## Train Set

  TRAIN_MSE = c(TRAIN_MSE, ANOVA$`Mean Sq`[2])
  TRAIN_VAR = c(TRAIN_VAR, var(FLEXIBLE_MODEL$fitted.values))

  ## Test Set

  Pred = predict(FLEXIBLE_MODEL, newdata = TEST)
  TEST_RESIDUALS = (Pred - TEST$y3)
  TEST_MSE_VALUE = sum(TEST_RESIDUALS^2)/(nrow(TEST))
  TEST_MSE = c(TEST_MSE,TEST_MSE_VALUE)
  TEST_VAR = c(TEST_VAR, var(Pred))
}

## Test 결과 데이터프레임 생성

F_DATA = data.frame(
  DEGREE = DEGREE,
  Adj_R = Adj_R,
  TRAIN_MSE = TRAIN_MSE,
  TRAIN_VAR = TRAIN_VAR,
  TEST_MSE = TEST_MSE,
  TEST_VAR = TEST_VAR
)

항차를 2차항부터 10차항까지 차례대로 추정해본 결과는 다음과 같습니다.

library(dplyr)
library(reshape)

ggplot(TRAIN) +
  geom_point(aes(x= X, y = y3) , col = 'royalblue', alpha = 0.8) +
  geom_smooth(aes(x = X, y = predict(FLEXIBLE_MODEL,newdata = TRAIN)),col = 'red') +
  xlab("") + ylab("") + ggtitle("Flexible Regression") +
  theme_bw()


ggplot(F_DATA) +
  geom_point(aes(x = DEGREE, y = Adj_R * 100)) +
  geom_line(aes(x = DEGREE, y = Adj_R * 100)) +
  geom_text(aes(x = DEGREE, y = Adj_R * 100 + 5,
                label = paste(round(Adj_R*100,2),"%",sep="")),size = 3)+ 
  scale_x_continuous(breaks = seq(2,10,by = 1)) + 
  ylab("Adj_R2") +
  theme_bw()


F_DATA %>%
  select(DEGREE,TRAIN_MSE,TEST_MSE) %>%
  melt(id.vars = c("DEGREE")) %>%
  ggplot() +
  geom_point(aes(x = DEGREE, y = value, col = variable)) +
  geom_line(aes(x = DEGREE, y = value, col = variable)) +
  labs(col = "") +
  theme_bw() +
  theme(legend.position = "bottom") +
  xlab("Degree") + ylab("MSE")

F_DATA %>%
  select(DEGREE,TRAIN_VAR,TEST_VAR) %>%
  melt(id.vars = c("DEGREE")) %>%
  ggplot() +
  geom_point(aes(x = DEGREE, y = value, col = variable)) +
  geom_line(aes(x = DEGREE, y = value, col = variable)) +
  labs(col = "") +
  theme_bw() +
  theme(legend.position = "bottom") +
  xlab("Degree") + ylab("Variation")

)
)

  • $R^2$는 6차항부터 급격하게 올라가는 것을 볼 수가 있습니다.
    따라서 6차항은 되어야 $y=sin(x)$형태의 관계를 잘 설명할 수 있는 편이라고 생각할 수 있습니다.
  • $MSE$는 Train Set과 Test Set에 따라 추세가 다릅니다.
    차수가 높아질수록 Train Set의 $MSE$는 감소하는 것을 알 수있습니다. 하지만 Test Set의 MSE는 감소하다가 증가하는 것을 확인할 수 있습니다. 이는 Train Set은 기가막히게 잘 맞추지만 새로운 데이터인 Test Set은 맞추지 못하는 OverFitting이 발생하였다고 볼 수 있습니다.
  • $Variance$는 항차가 올라갈수록 대체로 증가하는 추세에 있는 것을 볼 수 있습니다.
    여기서 고차항의 회귀모형의 단점이 제대로 드러납니다. 분석 모형이 유연할수록(항차가 높을수록) 회귀추정값의 분산은 높게 뛰기 마련입니다. 이는 회귀식에 의한 추정값에 대한 신뢰구간이 길어진다는 의미이며, 결과에 대한 신뢰도가 떨어진다는 것을 의미합니다.

여기까지 비선형 회귀분석에 대해 알아보았습니다.

'통계 이론' 카테고리의 다른 글

로지스틱 회귀분석  (0) 2020.03.27
카이제곱 독립성 검정  (2) 2020.03.27
다중 회귀분석(Multiple Regression)  (0) 2020.03.23
회귀분석(R Code)  (0) 2020.03.23
단순 선형 회귀분석의 추정  (0) 2020.03.23
Comments