아이리스의 Species에 대해 모델을 작성해본다.
> library(nnet) > (m <- multinom(Species ~., data=iris)) # weights: 18 (10 variable) initial value 164.791843 iter 10 value 16.177348 iter 20 value 7.111438 iter 30 value 6.182999 iter 40 value 5.984028 iter 50 value 5.961278 iter 60 value 5.954900 iter 70 value 5.951851 iter 80 value 5.950343 iter 90 value 5.949904 iter 100 value 5.949867 final value 5.949867 stopped after 100 iterations Call: multinom(formula = Species ~ ., data = iris) Coefficients: (Intercept) Sepal.Length Sepal.Width Petal.Length Petal.Width versicolor 18.69037 -5.458424 -8.707401 14.24477 -3.097684 virginica -23.83628 -7.923634 -15.370769 23.65978 15.135301 Residual Deviance: 11.89973 AIC: 31.89973
작성한 모델이 주어진 훈련 데이터에 어떻게 적합되었는지는 fitted( )를 사용해 구할 수 있다.
> head(fitted(m))
setosa versicolor virginica
1 1.0000000 1.526406e-09 2.716417e-36
2 0.9999996 3.536476e-07 2.883729e-32
3 1.0000000 4.443506e-08 6.103424e-34
4 0.9999968 3.163905e-06 7.117010e-31
5 1.0000000 1.102983e-09 1.289946e-36
6 1.0000000 3.521573e-10 1.344907e-35
fitted( )의 결과는 각 행의 데이터가 각 분류에 속할 확률을 뜻한다. 어떤 분류로 예측되었는지를 알아내기 위해 각 행마다 가장 큰 값이 속하는 열을 뽑을 수도 있겠지만, 더 간단하게 predict( )를 사용해도 된다. 특히 predict( )에는 newdata에 새로운 데이터를 지정할 수 있으므로 새로운 관측값에 대한 예측을 수행하려면 predict( )를 사용해야 한다.
setosa, versicolor, virginica에서 한 행씩 뽑아 predict( )를 적용해보자. 분류를 얻을 때는 type=“class”를 지정해야 하지만, type의 기본값이 class므로 생략해도 된다.
> predict(m, newdata=iris[c(1, 51, 101), ], type="class")
[1] setosa versicolor virginica
Levels: setosa versicolor virginica
각 분류에 속할 확률을 예측하고자 한다면 predict( ) 사용 시 type=“probs”를 지정한다.
> predict(m, newdata=iris, type="probs")
setosa versicolor virginica
1 1.000000e+00 1.526406e-09 2.716417e-36
2 9.999996e-01 3.536476e-07 2.883729e-32
3 1.000000e+00 4.443506e-08 6.103424e-34
4 9.999968e-01 3.163905e-06 7.117010e-31
5 1.000000e+00 1.102983e-09 1.289946e-36
...
모델의 정확도는 예측된 Species와 실제 Species를 비교하여 알 수 있다. 예측값을 predicted에 저장하고 이 중 iris$Species와 같은 경우의 비율을 세서 정확도를 계산해보자.
> predicted <- predict(m, newdata=iris) > sum(predicted == iris$Species) / NROW(predicted) [1] 0.9866667
아이리스처럼 대상으로 하는 분류의 개수가 2개 이상인 경우에는 분할표를 사용해 세부적인 예측 정확도를 분석할 수 있다.
> xtabs(~ predicted + iris$Species)
iris$Species
predicted setosa versicolor virginica
setosa 50 0 0
versicolor 0 49 1
virginica 0 1 49
표를 통해 총 2개의 예측이 잘못되었고, versicolor를 virginica로 예측한 경우가 1건, virginica를 versicolor로 예측한 경우가 1건 있었음을 알 수 있다. 그러나 여기서 구한 정확도는 훈련 데이터에 대해서 직접 계산한 것이므로, 새로운 데이터에 대한 예측 성능으로 활용할 수는 없음을 기억하기 바란다.