差分
この文書の現在のバージョンと選択したバージョンの差分を表示します。
次のリビジョン | 前のリビジョン | ||
memo:r:rmachinelearning [2013/07/14 04:00] hasegawa 作成 |
memo:r:rmachinelearning [2016/07/17 04:22] (現在) |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
====== Rで機械学習 ====== | ====== Rで機械学習 ====== | ||
- | ===== 分割表 Confusion Matrix ===== | ||
- | クラス分類結果を評価するときに,モデルによる推定値と観測値を表形式で整理した分割表とそこから算出される各種の有効性指標が良く使われる. | ||
- | 日本語の参考文献としては,例えば,元田ら:データマイニングの基礎,第1版,オーム社,2006.の201ページからが参考になる. | ||
- | 標準環境で分割表を作るには,table()関数を使う. | + | ===== 混合行列 Confusion Matrix ===== |
- | library(caret)中のconfusionMatrix()関数を使えば,色々な有効性指標を自動的に算出してくれる.ただし,多クラス分類の場合は"one versus all"アプローチによる算出であることに注意. | + | 混同行列とも. |
+ | クラス分類結果を評価するときに,モデルによる推定値と観測値を表形式で整理した混合行列とそこから算出される各種の有効性指標が良く使われる(統計学での分割表 contingency table の2変数が推定値と観測値の場合と考えれば良い). | ||
+ | 日本語の文献では,例えば,元田ら:データマイニングの基礎,第1版,オーム社,2006.の201ページからが参考になる. | ||
+ | |||
+ | 標準環境で混合行列を作るには,table()関数を使う. | ||
+ | また,library(caret)中のconfusionMatrix()関数を使えば,色々な有効性指標を自動的に算出してくれる.ただし,多クラス分類の場合は"one versus all"アプローチによる算出であることに注意. | ||
実行例 | 実行例 | ||
ライン 33: | ライン 35: | ||
predicted <- factor(predicted,levels=levels(observed)) | predicted <- factor(predicted,levels=levels(observed)) | ||
- | ## table関数を使って分割表を作成 | + | ## table関数を使って混合行列を作成 |
- | table(predicted,observed) | + | (cm <- table(predicted,observed)) |
- | ## confusionMatrix関数を使って分割表を作成 | + | ## confusionMatrix関数を使って混合行列を作成し,有効性指標も算出 |
- | confusionMatrix(predicted,observed) | + | cm2 <- confusionMatrix(predicted,observed) |
``` | ``` | ||
ライン 50: | ライン 52: | ||
versicolor 9 8 9 | versicolor 9 8 9 | ||
virginica 5 9 9 | virginica 5 9 9 | ||
+ | ``` | ||
- | > confusionMatrix(predicted,observed) | + | ``` |
+ | > (cm2 <- confusionMatrix(predicted,observed)) | ||
Confusion Matrix and Statistics | Confusion Matrix and Statistics | ||
ライン 81: | ライン 85: | ||
Detection Prevalence 0.3467 0.3467 0.3067 | Detection Prevalence 0.3467 0.3467 0.3067 | ||
``` | ``` | ||
+ | |||
+ | 混合行列をLaTeXで使う | ||
+ | |||
+ | ``` | ||
+ | cm2 <- confusionMatrix(predicted,observed) | ||
+ | |||
+ | latex( | ||
+ | cm2$table | ||
+ | , digits = 3 | ||
+ | , file="cm2conf.tex" | ||
+ | , title = "" # 表の1行1列目の内容 | ||
+ | , label = "tab_ConfusionMatrix" # LaTeXの\label | ||
+ | , caption = "Confusion matrix" # LaTeXの\caption | ||
+ | , here = T # \begin{table}[H]を指定 ctableだと効かないので,texファイルに手作業で追記する | ||
+ | , center = "centering" # center環境の代わりに\centerを使う.booktabだと適切に動作しない | ||
+ | ) | ||
+ | |||
+ | latex( | ||
+ | t(cm2$byClass) # 表が横長過ぎるので,転置する | ||
+ | , digits = 3 # 小数第3位まで表示 | ||
+ | , ctable = T # 論文向きのctable | ||
+ | , file="cm2indicator.tex" | ||
+ | , title = "" # 表の1行1列目の内容 | ||
+ | , label = "tab_EffectivenessIndicator" # LaTeXの\label | ||
+ | , caption = "Effectiveness indicator" # LaTeXの\caption | ||
+ | , here = T # \begin{table}[H]を指定 ctableだと効かないので,texファイルに手作業で追記する | ||
+ | , center = "centering" # center環境の代わりに\centerを使う.booktabだと適切に動作しない | ||
+ | ) | ||
+ | ``` | ||
+ | |||
[Tips] 観測値の因子水準を使って,予測値を因子に変換 | [Tips] 観測値の因子水準を使って,予測値を因子に変換 | ||
predicted <- factor(predicted,levels=levels(observed)) | predicted <- factor(predicted,levels=levels(observed)) | ||
こうしておくことで,分類結果にあるクラスが含まれないような場合にも,クラス数×クラス数の正方行列で出力させることが出来る. | こうしておくことで,分類結果にあるクラスが含まれないような場合にも,クラス数×クラス数の正方行列で出力させることが出来る. | ||
+ | |||
+ | | ||
+ | ## 周辺和が必要なら,addmargins()関数を使うか,colSums(),rowSums()関数を使う | ||
+ | addmargins(cm) | ||
+ | cm2 <- rbind(cm,Sum=colSums(cm)) | ||
+ | cm2 <- cbind(cm2,Sum=rowSums(cm2)) | ||
+ | cm2 | ||
+ | | ||
+ | ## データフレームへの変換 | ||
+ | ### 混合行列をそのままデータフレームに変換すると | ||
+ | data.frame(cm) # (観測値の水準数×予測値の水準数)行3列のデータフレーム | ||
+ | ### 周辺和があると | ||
+ | #### addmargins()で周辺和を付け足すと | ||
+ | data.frame(addmargins(cm)) | ||
+ | #### colSums(),rowSums()関数で周辺和を付け足すと | ||
+ | data.frame(cm2) # 4行4列のデータフレーム(元の見た目通り) | ||
+ | ### 一度行列に変換してから,行名と列名を付けなおす | ||
+ | df <- data.frame(matrix(cm, nrow = nrow(cm))) | ||
+ | colnames(df) <- colnames(cm) | ||
+ | rownames(df) <- rownames(cm) | ||
+ | df | ||
+ | | ||
+ | # str()関数で構造を見てみると | ||
+ | str(cm) | ||
+ | str(addmargins(cm)) | ||
+ | str(cm2) | ||
+ | |||
+ | 混合行列(tableオブジェクト)から見た目そのままにデータフレームに変換する関数Table2Dataframeを作っておく | ||
+ | Table2Dataframe <- function(tbl){ | ||
+ | df <- data.frame(matrix(tbl, nrow = nrow(tbl))) | ||
+ | colnames(df) <- colnames(tbl) | ||
+ | rownames(df) <- rownames(tbl) | ||
+ | return(df) | ||
+ | } | ||
+ | # 実行例 | ||
+ | (df <- Table2Dataframe(tbl = cm)) | ||
+ | is.data.frame(df) | ||