HOWTO · R

R의 다항식 회귀

이 튜토리얼은 R에서 다항식 회귀를 수행하는 방법을 보여줍니다.

이 페이지의 내용

다항식 회귀는 독립 x와 종속 y 간의 관계가 n차 다항식으로 모델링되는 선형 회귀로 정의할 수 있습니다. 이 튜토리얼은 R에서 다항식 회귀를 수행하는 방법을 보여줍니다.

R의 다항식 회귀

다항식 회귀는 xy의 평균 사이의 비선형 관계에 적합합니다. 다항식 또는 2차 항을 회귀에 추가합니다.

이 회귀는 하나의 결과 변수와 예측 변수에 사용됩니다. 다항식 회귀는 주로 다음에서 사용됩니다.

  1. 전염병의 진행
  2. 조직의 성장률 계산
  3. 퇴적물 내 탄소 동위원소 분포

ggplot2를 사용하여 R의 다항식 회귀를 그릴 수 있습니다. 이 패키지가 아직 설치되지 않은 경우; 먼저 설치해야 합니다.

install.packages('ggplot2')

다음은 다항식 회귀의 단계별 프로세스입니다.

데이터 생성

우리는 delftstack 학생들의 데이터로 데이터 프레임을 생성합니다: 공부한 시간, 기말 고사 점수, 학급의 총 학생 수(60명).

예:

#create data frame
delftstack <- data.frame(hours = runif(60, 6, 20), marks=60)
delftstack$marks = delftstack$marks + delftstack$hours^3/160 + delftstack$hours*runif(60, 1, 2)

#view the head of the data
head(delftstack)

이 코드는 나중에 다항식 회귀에 사용되는 데이터를 생성합니다.

출력:

      hours     marks
1  7.106636  71.33509
2  8.501039  74.93339
3 18.051042 124.92229
4 19.153316 141.40656
5 18.306620 118.47464
6  6.240467  70.53522

데이터 시각화

다음 단계는 데이터를 시각화하는 것입니다. 회귀 모델을 만들기 전에 공부한 시간과 최종 시험 점수 사이의 관계를 보여줘야 합니다.

예:

# Visualization
library(ggplot2)

ggplot(delftstack, aes(x=hours, y=marks)) + geom_point()

위의 코드는 데이터 그래프를 그립니다.

시각화 플롯

다항식 회귀 모델 피팅

다음 단계는 1에서 6까지의 다항식 회귀 모델과 k=10인 k-겹 교차 검증을 맞추는 것입니다.

예:

#shuffle data
delftstack.shuffled <- delftstack[sample(nrow(df)),]

# number of k-fold cross-validation
K <- 10

#define the degree of polynomials to fit
degree <- 6

# now create k equal-sized folds
fold <- cut(seq(1,nrow(delftstack.shuffled)),breaks=K,labels=FALSE)

#The object to hold MSE's of models
mse_object = matrix(data=NA,nrow=K,ncol=degree)

#K-fold cross validation
for(i in 1:K){
    #testing and training data
    test_indexes <- which(fold==i,arr.ind=TRUE)
    test_data <- delftstack.shuffled[test_indexes, ]
    train_data <- delftstack.shuffled[-test_indexes, ]

    # using k-fold cv for models evaluation
    for (j in 1:degree){
        fit.train = lm(marks ~ poly(hours,j), data=train_data)
        fit.test = predict(fit.train, newdata=test_data)
        mse_object[i,j] = mean((fit.test-test_data$marks)^2)
    }
}

# MSE for each degree
colMeans(mse_object)

출력:

[1] 26.13112 15.45428 15.87187 16.88782 18.13103 19.10502

6개의 모델이 있으며 각 모델에 대한 MSE는 위 코드의 출력에 제공됩니다. 이 출력은 각각 각도 h=1에서 h=6에 대한 것입니다.

MSE가 가장 낮은 모델은 h=2의 MSE 값이 다른 모델보다 작기 때문에 h=2인 다항 회귀 모델이 됩니다.

최종 모델 분석

마지막으로 최종 모델을 분석하고 가장 적합한 모델의 요약을 보여드리겠습니다.

예:

#fitting the best model
best_model = lm(marks ~ poly(hours,2, raw=T), data=delftstack)

#summary of the best model
summary(best_model)

위의 코드는 가장 적합한 모델의 요약을 보여줍니다.

출력:

Call:
lm(formula = marks ~ poly(hours, 2, raw = T), data = delftstack)

Residuals:
   Min     1Q Median     3Q    Max
-8.797 -2.598  0.337  2.443  9.872

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)
(Intercept)              68.42847    5.54533  12.340  < 2e-16 ***
poly(hours, 2, raw = T)1 -1.07557    0.93476  -1.151    0.255
poly(hours, 2, raw = T)2  0.22958    0.03577   6.418 2.95e-08 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 4.204 on 57 degrees of freedom
Multiple R-squared:  0.9669,    Adjusted R-squared:  0.9657
F-statistic: 831.9 on 2 and 57 DF,  p-value: < 2.2e-16

출력에서 마크 = 68.42847 - 1.07557*(시간) + .22958*(시간)2를 볼 수 있습니다. 이 방정식을 사용하여 학생이 공부한 시간에 따라 얼마나 많은 점수를 받을지 예측할 수 있습니다.

예를 들어 학생이 5시간 동안 공부했다면 다음과 같이 계산됩니다.

marks = 68.42847 - 1.07557*(5) + .22958*(5)2

marks = 68.42847 - 1.07557*5 + .22958*25

marks = 68.42847 - 5.37785 + 5.7395

marks = 68.79012

학생이 5시간 공부하면 기말고사에서 68.79012점을 받습니다.

마지막으로 피팅된 모델을 플롯하여 원시 데이터와 얼마나 잘 일치하는지 확인할 수 있습니다.

ggplot(delftstack, aes(x=hours, y=marks)) +
    geom_point() +
    stat_smooth(method='lm', formula = y ~ poly(x,2), size = 1) +
    xlab('Hours Studied') +
    ylab('Marks')

출력(플롯):

최종 플롯