この文章の最新バージョンは草案です。このバージョン(2013/07/14 04:00)は草案です。
承認件数:0/1
承認件数: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)