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

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