分類精度を確認する

 判別分析や決定木のような分類モデルを評価する場合、そのモデルの分類精度を確認するのが一般的です。*1 以下の例は、irisデータの判別分析です。

# 分析データ
# 訓練データと実験データの作成
tr.index <- seq(1, nrow(iris), 2)
iris.train <-iris[tr.index, ]
iris.test <- iris[-tr.index, ]

# 線形判別分析
library(MASS)
iris.lda <- lda(Species ~ ., data = iris.train)
iris.pre <- predict(iris.lda, iris.test)
# 判別結果
# 混同行列
(tab <- table(iris.pre$class, iris.test$Species))
# 分類精度
sum(diag(tab)) / sum(tab)

 上記のスクリプトを実行すると、以下のような混同行列と分類精度が得られます。

            setosa versicolor virginica
  setosa         25          0         0
  versicolor      0         24         2
  virginica       0          1        23
[1] 0.96

 因みに、gmodelsパッケージのCrossTable関数を使うことで、より多くの情報を得ることができます。

library(gmodels)
CrossTable(iris.pre$class, iris.test$Species)

 CrossTable関数の出力は、以下のようなものです。

   Cell Contents
|-------------------------|
|                       N |
| Chi-square contribution |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  75 

 
               | iris.test$Species 
iris.pre$class |     setosa | versicolor |  virginica |  Row Total | 
---------------|------------|------------|------------|------------|
        setosa |         25 |          0 |          0 |         25 | 
               |     33.333 |      8.333 |      8.333 |            | 
               |      1.000 |      0.000 |      0.000 |      0.333 | 
               |      1.000 |      0.000 |      0.000 |            | 
               |      0.333 |      0.000 |      0.000 |            | 
---------------|------------|------------|------------|------------|
    versicolor |          0 |         24 |          2 |         26 | 
               |      8.667 |     27.128 |      5.128 |            | 
               |      0.000 |      0.923 |      0.077 |      0.347 | 
               |      0.000 |      0.960 |      0.080 |            | 
               |      0.000 |      0.320 |      0.027 |            | 
---------------|------------|------------|------------|------------|
     virginica |          0 |          1 |         23 |         24 | 
               |      8.000 |      6.125 |     28.125 |            | 
               |      0.000 |      0.042 |      0.958 |      0.320 | 
               |      0.000 |      0.040 |      0.920 |            | 
               |      0.000 |      0.013 |      0.307 |            | 
---------------|------------|------------|------------|------------|
  Column Total |         25 |         25 |         25 |         75 | 
               |      0.333 |      0.333 |      0.333 |            | 
---------------|------------|------------|------------|------------|

 また、caretパッケージのconfusionMatrix関数を使うと、kappa係数なども出力されます。

library(caret)
confusionMatrix(iris.pre$class, iris.test$Species)

 confusionMatrix関数の出力は、以下のようなものです。

Confusion Matrix and Statistics

            Reference
Prediction   setosa versicolor virginica
  setosa         25          0         0
  versicolor      0         24         2
  virginica       0          1        23

Overall Statistics
                                          
               Accuracy : 0.96            
                 95% CI : (0.8875, 0.9917)
    No Information Rate : 0.3333          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.94            
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: setosa Class: versicolor Class: virginica
Sensitivity                 1.0000            0.9600           0.9200
Specificity                 1.0000            0.9600           0.9800
Pos Pred Value              1.0000            0.9231           0.9583
Neg Pred Value              1.0000            0.9796           0.9608
Prevalence                  0.3333            0.3333           0.3333
Detection Rate              0.3333            0.3200           0.3067
Detection Prevalence        0.3333            0.3467           0.3200

 なお、kappa係数は、vcdパッケージのKappa関数で求めることもできます。*2

library(vcd)
Kappa(tab)

 Kappa関数の出力は、以下のようなものです。

               value        ASE
Unweighted 0.9400000 0.03394113
Weighted   0.9547739 0.16846514

*1:適合率 (precision) と再現率 (recall)、そして、それらの調和平均であるF値などを示す場合もあります。

*2:kappa係数を求める関数としては、irrパッケージのkappa2関数もあります。