Reputation: 217
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.
Upvotes: 1
Views: 318
Reputation: 60492
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.
Upvotes: 3