더북(TheBook)

아이리스의 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건 있었음을 알 수 있다. 그러나 여기서 구한 정확도는 훈련 데이터에 대해서 직접 계산한 것이므로, 새로운 데이터에 대한 예측 성능으로 활용할 수는 없음을 기억하기 바란다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.