この文章の最新バージョンは草案です。Diffこのバージョン(2013/07/14 04:01)は草案です。
承認件数:0/1

**以前のリビジョンの文書です**

Rで機械学習

分割表 Confusion Matrix

クラス分類結果を評価するときに,モデルによる推定値と観測値を表形式で整理した分割表とそこから算出される各種の有効性指標が良く使われる. 日本語の参考文献としては,例えば,元田ら:データマイニングの基礎,第1版,オーム社,2006.の201ページからが参考になる.

標準環境で分割表を作るには,table()関数を使う. また,library(caret)中のconfusionMatrix()関数を使えば,色々な有効性指標を自動的に算出してくれる.ただし,多クラス分類の場合は“one versus all”アプローチによる算出であることに注意.

実行例

library(randomForest);library(caret)
data <- iris

## データをランダムに並べ替え
data <- data[sample(1:nrow(data),replace=F),]

## データの半分を学習用データ,残りの半分を検証用データに分割
data.learn <- data[1:(nrow(data)/2),]
data.test <- data[((nrow(data)/2)+1):nrow(data),]

## ランダムフォレストで分類モデルを作成
model.rf <- randomForest(Species~., data=data.learn, type="class")

## 作成したモデルで予測
predicted <- predict(model.rf, data=data.test)

## 観測値
observed <- factor(data.test$Species)

## [Tips] 観測値の因子水準を使って,予測値を因子に変換
predicted <- factor(predicted,levels=levels(observed))

## table関数を使って分割表を作成
table(predicted,observed)

## confusionMatrix関数を使って分割表を作成
confusionMatrix(predicted,observed)

実行結果

> table(predicted,observed)
            observed
predicted    setosa versicolor virginica
  setosa         10          8         8
  versicolor      9          8         9
  virginica       5          9         9

> confusionMatrix(predicted,observed)
Confusion Matrix and Statistics

            Reference
Prediction   setosa versicolor virginica
  setosa         10          8         8
  versicolor      9          8         9
  virginica       5          9         9

Overall Statistics
                                          
               Accuracy : 0.36            
                 95% CI : (0.2523, 0.4791)
    No Information Rate : 0.3467          
    P-Value [Acc > NIR] : 0.4469          
                                          
                  Kappa : 0.0408          
 Mcnemar's Test P-Value : 0.8611          

Statistics by Class:

                     Class: setosa Class: versicolor Class: virginica
Sensitivity                 0.4167            0.3200           0.3462
Specificity                 0.6863            0.6400           0.7143
Pos Pred Value              0.3846            0.3077           0.3913
Neg Pred Value              0.7143            0.6531           0.6731
Prevalence                  0.3200            0.3333           0.3467
Detection Rate              0.1333            0.1067           0.1200
Detection Prevalence        0.3467            0.3467           0.3067

[Tips] 観測値の因子水準を使って,予測値を因子に変換

predicted <- factor(predicted,levels=levels(observed))

こうしておくことで,分類結果にあるクラスが含まれないような場合にも,クラス数×クラス数の正方行列で出力させることが出来る.

predict()関数の挙動

predict()関数は最低限モデル作成時に使用した説明変数があれば結果を返す. その他に目的変数や余計な変数があっても,説明変数さえあれば結果を返す.

library("randomForest")

data <- iris
model <- randomForest(Species ~ ., data=data)

# モデル作成時と同一の変数を持つデータ -> OK
pred <- predict(model,data)
table(observed = data$Species, estimated = pred)

# 目的変数を削除したデータ -> OK
data1 <- data[,1:4]
pred1 <- predict(model,data1)
table(observed = data$Species, estimated = pred1)

# 新規に変数を追加したデータ -> OK
data2 <- data
data2$newvar <- data[,1]
pred2 <- predict(model,data2)
table(observed = data$Species, estimated = pred2)

# 説明変数を削除したデータ -> NG
data3 <- data[,2:5]
pred3 <- predict(model,data3)

# 説明変数の名前を変更したデータ -> NG
data4 <- data
names(data4) <- c("a","b","c","d","e")
names(data4)
pred4 <- predict(model,data4)
memo/r/rmachinelearning.1373774490.txt.gz · 最終更新: 2016/07/17 04:22 (外部編集)
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0

- Rental Orbit Space -