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