2016-02-04 73 views
0

我已經安裝了迴歸樹。我試着用save()函數保存擬合的模型,但如果關閉R,加載對象並調用它,我會得到不同的輸出。如何在R中保存擬合模型?

下面的代碼:

training.set=iris[,-5] 

library(tree) 

set.seed(123) 
part1 = sample(1:nrow(training.set), round(nrow(training.set)/2)) 
part2 = setdiff(1:nrow(training.set), part1) 


tree.output = tree("Sepal.Length~.", data=training.set[part1,], 
        control=tree.control(nobs=length(part1), minsize=2, mindev=0.001)) 

prune.t = prune.tree(tree.output, newdata=training.set[part2,]) 
plot(prune.t) 

J = prune.t$size[prune.t$dev == min(prune.t$dev)] 
J 

m.tree = prune.tree(tree.output,best=J) 
save(m.tree,file="my model.RData") 
m.tree 

輸出:

node), split, n, deviance, yval 
     * denotes terminal node 

1) root 75 49.54000 5.756 
    2) Petal.Length < 4.3 41 6.69800 5.161 
    4) Petal.Length < 3.55 31 3.82800 5.019 
     8) Sepal.Width < 3.45 17 1.04900 4.794 
     16) Petal.Length < 1.45 9 0.52220 4.644 * 
     17) Petal.Length > 1.45 8 0.09875 4.962 * 
     9) Sepal.Width > 3.45 14 0.86930 5.293 
     18) Sepal.Width < 3.85 8 0.17880 5.138 * 
     19) Sepal.Width > 3.85 6 0.24000 5.500 * 
    5) Petal.Length > 3.55 10 0.32000 5.600 * 
    3) Petal.Length > 4.3 34 10.83000 6.474 
    6) Petal.Length < 5.7 28 3.46400 6.264 
     12) Petal.Width < 2.05 23 2.42600 6.187 * 
     13) Petal.Width > 2.05 5 0.26800 6.620 * 
    7) Petal.Length > 5.7 6 0.41500 7.450 
     14) Petal.Length < 6.35 4 0.02750 7.275 * 
     15) Petal.Length > 6.35 2 0.02000 7.800 * 

腳本的第二部分:

q() 
rm(list=ls()) 
load("my model.RData") 
m.tree 

輸出:

$frame 
      var n  dev  yval splits.cutleft splits.cutright 
1 Petal.Length 75 49.5448000 5.756000   <4.3   >4.3 
2 Petal.Length 41 6.6975610 5.160976   <3.55   >3.55 
4 Sepal.Width 31 3.8283871 5.019355   <3.45   >3.45 
8 Petal.Length 17 1.0494118 4.794118   <1.45   >1.45 
16  <leaf> 9 0.5222222 4.644444        
17  <leaf> 8 0.0987500 4.962500        
9 Sepal.Width 14 0.8692857 5.292857   <3.85   >3.85 
18  <leaf> 8 0.1787500 5.137500        
19  <leaf> 6 0.2400000 5.500000        
5  <leaf> 10 0.3200000 5.600000        
3 Petal.Length 34 10.8261765 6.473529   <5.7   >5.7 
6 Petal.Width 28 3.4642857 6.264286   <2.05   >2.05 
12  <leaf> 23 2.4260870 6.186957        
13  <leaf> 5 0.2680000 6.620000        
7 Petal.Length 6 0.4150000 7.450000   <6.35   >6.35 
14  <leaf> 4 0.0275000 7.275000        
15  <leaf> 2 0.0200000 7.800000        

$where 
44 118 61 130 138 7 77 128 79 65 134 64 94 142 14 122 33 6 150 126 116 
    8 17 6 16 13 5 13 13 13 10 13 13 6 14 5 13 9 9 13 16 14 
90 82 127 83 89 68 74 36 18 147 108 143 146 3 55 87 25 135 26 16 46 
10 10 13 10 10 10 13 5 8 13 16 13 14 5 13 13 6 13 6 9 5 
45 40 17 15 113 48 28 114 5 132 137 12 54 20 97 71 131 35 60 9 34 
    8 6 9 9 14 5 8 13 8 17 14 6 10 8 10 13 16 6 10 5 9 
24 93 39 69 124 66 112 148 50 56 1 37 
    6 10 5 13 13 13 13 13 5 13 8 8 

$terms 
Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width 
attr(,"variables") 
list(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) 
attr(,"factors") 
      Sepal.Width Petal.Length Petal.Width 
Sepal.Length   0   0   0 
Sepal.Width   1   0   0 
Petal.Length   0   1   0 
Petal.Width   0   0   1 
attr(,"term.labels") 
[1] "Sepal.Width" "Petal.Length" "Petal.Width" 
attr(,"order") 
[1] 1 1 1 
attr(,"intercept") 
[1] 1 
attr(,"response") 
[1] 1 
attr(,".Environment") 
<environment: 0x00000000059480f0> 
attr(,"predvars") 
list(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) 
attr(,"dataClasses") 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
    "numeric" "numeric" "numeric" "numeric" 

$call 
snip.tree(tree = tree.output, nodes = c(19L, 18L, 5L, 16L, 13L, 
12L)) 

$y 
44 118 61 130 138 7 77 128 79 65 134 64 94 142 14 122 33 6 150 126 116 
5.0 7.7 5.0 7.2 6.4 4.6 6.8 6.1 6.0 5.6 6.3 6.1 5.0 6.9 4.3 5.6 5.2 5.4 5.9 7.2 6.4 
90 82 127 83 89 68 74 36 18 147 108 143 146 3 55 87 25 135 26 16 46 
5.5 5.5 6.2 5.8 5.6 5.8 6.1 5.0 5.1 6.3 7.3 5.8 6.7 4.7 6.5 6.7 4.8 6.1 5.0 5.7 4.8 
45 40 17 15 113 48 28 114 5 132 137 12 54 20 97 71 131 35 60 9 34 
5.1 5.1 5.4 5.8 6.8 4.6 5.2 5.7 5.0 7.9 6.3 4.8 5.5 5.1 5.7 5.9 7.4 4.9 5.2 4.4 5.5 
24 93 39 69 124 66 112 148 50 56 1 37 
5.1 5.8 4.4 6.2 6.3 6.7 6.4 6.5 5.0 5.7 5.1 5.5 

$weights 
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
[41] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

attr(,"class") 
[1] "tree" 
attr(,"xlevels") 
attr(,"xlevels")$Sepal.Width 
NULL 

attr(,"xlevels")$Petal.Length 
NULL 

attr(,"xlevels")$Petal.Width 
NULL 

我是否需要使用不同的功能來保存模型? 謝謝。

回答

3

您的對象已被正確存儲,但是它的打印方式不同。對象m.treetree類的列表:

R> class(m.tree) 
[1] "tree" 

當您打印對象,它查找功能print.tree(相通用print功能)。加載tree包後,此功能僅適用於

library(tree) 
load("my model.RData") 
m.tree 

會給你你想要的。


如果你有興趣,運行

getS3method("print", "tree") 

看到打印方法。