简体   繁体   中英

How do I save fitted models in R?

I've fitted a regression tree. I've tried to save the fitted model with the save() function but if I close R, load the object and recall it I get a different output.

Here's the code:

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

Output:

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 *

Second part of the script:

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

Output:

$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

Do I need to use a different function to save the model? Thank you.

Your object has been stored correctly, however, it is being printed out differently. The object m.tree is a list with class tree :

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

When you print the object, it looks for the function print.tree (vis the generic print function). This function is only available after you load the tree package.

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

will give you what you want.


If you are interested, run

getS3method("print", "tree")

to see the print method.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM