コンピュータ設定悪戦苦闘メモ

困ったこととその解決策のメモ.万人に有効なことは保証できませんが,お役に立てればうれしいな.

6.Rで決定木を表示すると分類結果を表す帯グラフが正しく表示されない

やりたいこと:Rで決定木を表示したときに分類結果を表す帯グラフが正しく表示されてほしい

環境:R version 3.1.2 (Windows7)

 

【状況】

エラーメッセージは出ないが,表示される決定木の結果のグラフがおかしい

> ktree<-rpart(CorrectTag~.,data=data1,method="class")
> plot(as.party(ktree))
> ktree
n= 120
node), split, n, loss, yval, (yprob)
        * denotes terminal node

1) root 120 60 0 (0.5000000 0.5000000)
  2) condition2< 0.5 9 0 0 (1.0000000 0.0000000) *
  3) condition2>=0.5 111 51 1 (0.4594595 0.5405405)
    6) condition5< 0.5 87 43 0 (0.5057471 0.4942529) *
    7) condition5>=0.5 24 7 1 (0.2916667 0.7083333) *

Node4はclass0が43,class1が44のはずなのに帯グラフが0%か100%にしかなってないようにみえる.

f:id:akusenkutou:20151130124606p:plain

 

【原因】

目的変数(正解のクラス)のデータ型が数値(integer)として認識されているのに,因子(factor)とみなされていると思いこんで,カテゴリ分類を行う設定で(method="class")決定木を作ったため.

データ型の確認方法は以下のとおり.

> sapply(data1,class)
condition1 condition2 condition3 condition4 condition5 CorrectTag
 "integer"  "integer"  "integer"  "integer"  "integer"  "integer"

今回はテキストファイルからデータを 読み込んだのだが,目的変数の値を二値だからという理由で0と1で与えた.するとRに数値と判断されてしまった.

 

【解決策】

その1.入力テキストファイルの目的変数の値を0/1からTrue/Falseなどの文字列に変える.

その2.as.factor関数でデータ型を変更する

> data1$CorrectTag<-as.factor(data1$CorrectTag)
> sapply(data1,class)
condition1 condition2 condition3 condition4 condition5 CorrectTag
"integer" "integer" "integer" "integer" "integer" "factor"

 

先ほどと同じコマンドで決定木を表示してみる.

f:id:akusenkutou:20151218112255p:plain

結果の帯グラフが正しく表示されるようになった.

 

【感想】

これで表示される帯グラフは決定木作成に使ったデータの分類結果なんだけど,別データで作成された決定木を使ってpredictした結果をこんな感じの帯グラフで表示する方法があればすごく知りたい.