더북(TheBook)

X와 Y의 직접 지정

좀 더 빠른 속도를 원하거나 각종 파라미터가 nnet( )에서 자동으로 지정되는 것을 원치 않는 경우 X, Y를 지접 지정하는 형태로 nnet( )을 호출할 수도 있다. 이를 위해 가장 먼저 할 일은 Y를 지시 행렬Indicator Matrix로 변환하는 것이다.

표 10-8 지시 행렬

nnet::class.ind : 주어진 분류(클래스)에 대한 지시 행렬을 만든다.

nnet::class.ind(
  cl  # 팩터 또는 분류(class)의 벡터
)

반환 값은 각 행에 관측값을 놓고 각 열에 분류를 놓은 다음, 해당 분류에 속할 경우 1을, 아니라면 0을 저장한 행렬이다.

다음은 아이리스의 Species에 대한 지시 행렬을 만든 예다. setosa, versicolor, virginica가 각각의 컬럼으로 되어 있으며 데이터가 해당 분류에 속하는 경우 컬럼 값이 1이다.

> class.ind(iris$Species)
       setosa versicolor virginica
  [1,]      1          0         0
  [2,]      1          0         0
  [3,]      1          0         0
  [4,]      1          0         0
  [5,]      1          0         0
...
 [51,]      0          1         0
 [52,]      0          1         0
 [53,]      0          1         0
 [54,]      0          1         0
 [55,]      0          1         0
...
[101,]      0          0         1
[102,]      0          0         1
[103,]      0          0         1
[104,]      0          0         1
[105,]      0          0         1
...

이제 X에는 iris에서 Species를 제외한 나머지 변수들을 지정하고, Y에 class.ind( )의 결과를 지정하면 X, Y를 직접 지정한 nnet( )이 호출된다.

> m2 <- nnet(iris[, 1:4], class.ind(iris$Species), size=3,
+           softmax=TRUE)
# weights: 27
initial  value 179.822518
iter  10 value 69.476514
iter  20 value 65.407837
iter  30 value 13.239150
iter  40 value 6.182978
iter  50 value 5.988953
iter  60 value 5.964934
iter  70 value 5.960658
iter  80 value 5.960084
iter  90 value 5.958269
iter 100 value 5.956502
final    value 5.956502
stopped after 100 iterations

> predict(m2, newdata=iris[, 1:4], type="class")
[1] "setosa"    "setosa"    "setosa"    "setosa"    "setosa" ...
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.