728x90

주어진 데이터(예를 들어 mtcars) 에서 잘 맞는 회귀모형을 구하거나, 회귀모형이 얼마나 잘 맞는지를

보려면

데이터셋을 train 데이터와 test 데이터로 구분하여 train 데이터에서 모형(회귀모형등)을 구하고

이를  test 데이터 적용하고, 얼마나 잘 맞는지 지표로서 MSE(Mean Squared Error)을 한 번

구해 보았습니다.

그런데 이러한 작업을 여러 번 해 보려면 어떻게 할까?

(1) 데이터(관측치수 n개)dptj 관측치 1개를 제외하고

(2) n-1개의 관측치를 가지고 모형(회귀분석)을 구하고

(3) 이를 test 데이터(이는 관측치 1개뿐) 적용하여 예측치(이것도 1개)를 구합니다.

(4) 이번에는 2번째 관측치를 제외하고, 위와 같은 방법으로 작업을 진행합니다.

(5) 이러기를 (n-1) 번을 하게 됩니다.

(6) n-1 에 대한 평균 MSE를 구하게 됩니다.

 

* 잠깐 여기서 조금 헷갈리는 단어들이 나옵니다.

  그러니까 (n-1)개에서 모형을 구하고... 꽤 관측치 수가 큰 데이터에서 모형을 구했으니까

  예측치는 거의 편향이 일어나지 않겠네요.

  그래도 그렇지.... 하나의 관측치에 대한 것을 구한 것이니까 변동이 크겠네요...

 

 

이제 이 과정을 실습을 해 보겠습니다.

앞서 검증셋기법에서 회귀분석을 하느라 lm( ) 함수를 사용하였습니다.

LOOCV를 적용하려면 프로그램을 만들 필요없이 cv.glm( ) 함수를 사용하면 됩니다(회귀분석인 경우)

왜? lm( ) 을 사용하지 않고?

lm( ) 으로는 cv.glm( )을 사용할 수 없으니 cv.glm( )을 사용하기 위해서는 lm( ) 대신에 glm( )을 사용합니다.

LOOCV 사용하지 않고 회귀분석만 하고자 할 때에는 lm( ) 이나 glm( )이나 결과가 같게 나옵니다.

그런데 cv.glm( ) 함수는 패키지 "boot"에 있습니다.

 

#===== LOOCV

model_glm <- glm(mpg~cyl,data=mtcars)

coef(model_glm)

lm(mpg~cyl,data=mtcars)

library(boot)

cv.err <- cv.glm(mtcars,model_glm)

cv.err$delta

 

#===== 10-fold

model_glm <- glm(mpg~cyl,data=mtcars)

kfold.err <- cv.glm(mtcars,model_glm,K=10)

kfold.err$delta

 

 

+ Recent posts