0

R の rpart パッケージを使用して作成されたモデルを保存しました。これらの保存されたモデルからいくつかの情報を取得しようとしています。特にrpart.objectから。ドキュメント ( rpart doc ) は役に立ちますが、不明な点がいくつかあります。

  1. どの変数がカテゴリ変数で、どの変数が数値変数かを調べるにはどうすればよいですか? 現在、私がしていることは、分割マトリックスの「インデックス」列を参照することです。数値変数のみの場合、エントリが整数ではないことに気付きました。これを行うためのよりクリーンな方法はありますか?
  2. csplit行列は、カテゴリ変数が整数を使用して取ることができるさまざまな値を参照します。つまり、R は元の名前を整数にマップします。このマッピングにアクセスする方法はありますか? たとえば。たとえば、元の変数Countryが値France, Germany, Japanなどのいずれかを取ることができる場合、csplit マトリックスは、特定の分割が に基づいていることを知らせてくれますCountry == 1, 2。ここで、rpart は参照をそれぞれに置き換えてFrance, Germany1, 2ます。France, Germany, Japanモデル ファイルから元の名前を取得するにはどうすればよいですか? また、名前と整数の間のマッピングが何であるかを知るにはどうすればよいですか?
4

1 に答える 1

2

通常、termsそのような情報を持つのはコンポーネントです。See ?rpart::rpart.object.

fit <- rpart::rpart(Kyphosis ~ Age + Number + Start, data = kyphosis)
fit$terms  # notice that the attribute dataClasses has the information
attr(fit$terms, "dataClasses")
#------------
 Kyphosis       Age    Number     Start 
 "factor" "numeric" "numeric" "numeric" 

この例では、どの変数も因子ではないため、その構造に csplit ノードがありません。かなり簡単に作成できます。

> fit <- rpart::rpart(Kyphosis ~ Age + factor(findInterval(Number,c(0,4,6,Inf))) + Start, data = kyphosis)
> fit$csplit
     [,1] [,2] [,3]
[1,]    1    1    3
[2,]    1    1    3
[3,]    3    1    3
[4,]    1    3    3
[5,]    3    1    3
[6,]    3    3    1
[7,]    3    1    3
[8,]    1    1    3
> attr(fit$terms, "dataClasses")
                                     Kyphosis 
                                     "factor" 
                                          Age 
                                    "numeric" 
factor(findInterval(Number, c(0, 4, 6, Inf))) 
                                     "factor" 
                                        Start 
                                    "numeric" 

as.numeric()整数はファクター変数の値にすぎないため、「マッピング」はファクターの からへのマッピングとまったく同じlevels()です。fit$csplit因子変数のレベルの名前を置き換える -matrixの文字行列バージョンを構築しようとしていた場合、これが成功への 1 つの道となります。

> kyphosis$Numlev <- factor(findInterval(kyphosis$Number, c(0, 4, 6, Inf)), labels=c("low","med","high"))
> str(kyphosis)
'data.frame':   81 obs. of  5 variables:
 $ Kyphosis: Factor w/ 2 levels "absent","present": 1 1 2 1 1 1 1 1 1 2 ...
 $ Age     : int  71 158 128 2 1 1 61 37 113 59 ...
 $ Number  : int  3 3 4 5 4 2 2 3 2 6 ...
 $ Start   : int  5 14 5 1 15 16 17 16 16 12 ...
 $ Numlev  : Factor w/ 3 levels "low","med","high": 1 1 2 2 2 1 1 1 1 3 ...
> fit <- rpart::rpart(Kyphosis ~ Age +Numlev + Start, data = kyphosis)
> Levels <- fit$csplit
> Levels[] <- levels(kyphosis$Numlev)[Levels]
> Levels
     [,1]   [,2]   [,3]  
[1,] "low"  "low"  "high"
[2,] "low"  "low"  "high"
[3,] "high" "low"  "high"
[4,] "low"  "high" "high"
[5,] "high" "low"  "high"
[6,] "high" "high" "low" 
[7,] "high" "low"  "high"
[8,] "low"  "low"  "high"

コメントへの応答: モデルしかない場合は、str() を使用して参照してください。私が作成した例では、「xlevels」という名前の属性に格納された因子ラベルを持つ「順序付けられた」リーフが表示されます。

$ ordered            : Named logi [1:3] FALSE FALSE FALSE
  ..- attr(*, "names")= chr [1:3] "Age" "Numlev" "Start"
 - attr(*, "xlevels")=List of 1
  ..$ Numlev: chr [1:3] "low" "med" "high"
 - attr(*, "ylevels")= chr [1:2] "absent" "present"
 - attr(*, "class")= chr "rpart"
于 2015-04-05T16:34:04.510 に答える