如何在R中保存合适的型号?

时间:2016-02-04 16:16:03

标签: r models

我已经安装了回归树。我尝试使用save()函数保存拟合模型但是如果我关闭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

我是否需要使用其他功能来保存模型? 谢谢。

1 个答案:

答案 0 :(得分:3)

您的对象已正确存储,但正在以不同方式打印。对象m.tree是一个包含类tree的列表:

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

当您打印对象时,它会查找函数print.tree(对于通用print函数)。加载tree包后,此功能仅

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

会给你你想要的东西。

如果您有兴趣,请运行

getS3method("print", "tree")

查看打印方法。