더북(TheBook)

모든 경우에 대한 비교

앞 절의 내용은 적절한 회귀 모델을 찾기 위해 단계적으로 변수를 추가, 삭제하거나 추가와 삭제를 반복하는 방법을 사용했다. 여기서는 이와 달리 N개의 설명 변수가 있을 때 각 변수를 추가하거나 뺀 총 2N개의 회귀 모델을 만들고 이들 모두를 비교해보는 방법을 알아본다.

leaps::regsubsets( )는 2N개의 회귀 모델을 모두 만들어 비교를 수행하는 함수다.[16], [17]

표 8-10 모든 가능한 모델과 단계적 알고리즘을 사용한 모델 선택

leaps::regsubsets : 모든 가능한 모델과 단계적 알고리즘을 사용해 모델을 선택한다.

leaps::regsubsets(
  x,   # 디자인 행렬 또는 모델 포뮬러
  data,  # 선택적으로 지정 가능한 데이터 프레임
  # 어떻게 모델을 탐색할지를 정하는 인자다. 모든 가능한 모델을 탐색하는 경우 exhaustive,
  # 변수를 추가하는 방법은 forward, 변수를 삭제하는 방법은 backward, 변수를 추가 또는
  # 삭제하는 것을 반복하는 경우 seqrep(Sequential Replacement)로 지정한다.
  method=c("exhaustive", "forward", "backward", "seqrep"),
  # 기본값은 각 변수 개수당 최선의 모델을 한 개씩만 구한다. 만약 변수 개수당 n개의 최선의
  # 모델을 얻고자 한다면 nbest=n을 지정한다.
  nbest=1
)

반환 값은 regsubsets 객체로, summary.regsubets( )를 사용해 처리할 수 있다.

보스턴 주택 가격 데이터인 mlbench::BostonHousing에 대한 모든 회귀 분석을 수행해보자. regsubsets( )에 모든 변수를 포함한 포뮬러를 기재하고 그 결과를 살펴보면 된다.

> install.packages("leaps")
> library(leaps)
> library(mlbench)
> data(BostonHousing)
> m <- regsubsets(medv ~ ., data=BostonHousing)
> summary(m)
Subset selection object
Call: regsubsets.formula(medv ~ ., data = BostonHousing)
13 Variables (and intercept)
        Forced in Forced out
crim        FALSE      FALSE
zn          FALSE      FALSE
indus       FALSE      FALSE
chas1       FALSE      FALSE
nox         FALSE      FALSE
rm          FALSE      FALSE
age         FALSE      FALSE
dis         FALSE      FALSE
rad         FALSE      FALSE
tax         FALSE      FALSE
ptratio     FALSE      FALSE
b           FALSE      FALSE
lstat       FALSE      FALSE
1 subsets of each size up to 8
Selection Algorithm: exhaustive
  crim zn indus chas1 nox rm age dis rad tax ptratio b   lstat
1  " "  " " " "  " "  " " " " " " " " " " " " " "    " " "*"
2  " "  " " " "  " "  " " "*" " " " " " " " " " "    " " "*"
3  " "  " " " "  " "  " " "*" " " " " " " " " "*"    " " "*"
4  " "  " " " "  " "  " " "*" " " "*" " " " " "*"    " " "*"
5  " "  " " " "  " "  "*" "*" " " "*" " " " " "*"    " " "*"
6  " "  " " " "  "*"  "*" "*" " " "*" " " " " "*"    " " "*"
7  " "  " " " "  "*"  "*" "*" " " "*" " " " " "*"    "*" "*"
8  " "  "*" " "  "*"  "*" "*" " " "*" " " " " "*"    "*" "*"

결과의 제일 아래 부분에는 * 표시가 나열된 부분이 보인다. 해당 부분의 제일 왼쪽에 쓰여 있는 1, 2, 3, …, 8은 변수의 개수, 즉 모델의 크기를 뜻한다. 그리고 각 행에서 *로 표시된 부분은 변수가 해당 개수만큼 사용되었을 때 최적의 모델을 뜻한다.

예를 들어, 첫 번째 행을 살펴보자. 다음 결과는 변수를 하나만 포함하겠다면 lstat을 포함한 모델이 가장 좋다는 의미다.

   crim zn indus chas1 nox rm age dis rad tax ptratio b   lstat
1  " "  " " " "  " "  " " " " " " " " " " " " " "     " " "*"

변수가 2개인 행을 살펴보면 rm, lstat을 포함한 모델이 가장 우수하다는 것을 알 수 있다.

   crim zn indus chas1 nox rm age dis rad tax ptratio b   lstat
2  " "  " " " "  " "  " " "*" " " " " " " " " " "     " " "*"
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.