插入列车修剪参数的功能

时间:2018-05-08 22:43:56

标签: r r-caret

我正在考虑减少训练模型的大小(即thisthis帖子),并且我在插入符号列功能中遇到了trim参数。具体来说,这是在documentation

版本6.0-47中添加的
  

如果TRUE object\$finalModel中的最终模型可能包含某些组件   删除对象,以减少保存对象的大小。该   predict方法仍然有效,但模型的其他一些功能   可能行不通。 trim仅适用于具有此功能的模型   已经实施。

我意识到使用trim的结果可能因使用的方法而异。在使用trim参数后,是否有资源确定最终模型中包含和排除的内容?我可以节省多少空间?什么(如果有的话)功能丢失了?

在以前的问题中,如果参数甚至可以节省空间,那就不明确了。例如,这是一个简单的示例,其中trim=Ttrim=F使用randomForests返回相同大小的对象:

library(caret)
library(pryr)

# make a large dataset so iris example is not too trivial
large_iris <-  iris[rep(seq_len(nrow(iris)), 10), ]
object_size(large_iris) # 1.38 MB

set.seed(1234)
mdl1 <- train(Species~.,data=large_iris,method="rf",trControl=trainControl(trim=F))
object_size(mdl1) # 1.24 MB
attributes(mdl1)

set.seed(1234)
mdl2 <- train(Species~.,data=large_iris,method="rf",trControl=trainControl(trim=T))
object_size(mdl2) # 1.24 MB
attributes(mdl2)

2 个答案:

答案 0 :(得分:0)

trim选项(目前为止)不适用于randomForest

如果您在github上搜索修剪问题,您会发现list of issues

Issue 90提及修剪:

  

这已经针对型号bayesglm,C5.0,C5.0Cost,   C5.0Rules,C5.0Tree,glm,glmnet,rpart,rpart2和treebag。该   目前的回归测试正在通过。

这证实了我对代码的调查,你可以在测试中看到插入符号的功能,这些是经过测试的模型,看到修剪结果会产生较小的对象大小,并且预测结果仍然正确。

同样使用非公式接口可能会减少占用空间。如果您使用公式界面,Caret会做一些额外的工作。

答案 1 :(得分:0)

我对caret package以及@phiver列出的方法进行了一些挖掘。 tldr;有关在bayesglm,C5.0,C5.0Cost,C5.0Rules,C5.0Tree,glm,glmnet,rpart,rpart2和treebag上使用trim的详细信息,请参见下文。否则,为其他方法设置trim=T无效

bayesglm和glm

从模型中修剪出对预测不必要的数据输出,使得拟合模型的大小相对于训练数据大小是恒定的。修剪功能是

function(x) {
    x$y = c()
    x$model = c()

    x$residuals = c()
    x$fitted.values = c()
    x$effects = c()
    x$qr$qr = c()
    x$linear.predictors = c()
    x$weights = c()
    x$prior.weights = c()
    x$data = c()

    x$family$variance = c()
    x$family$dev.resids = c()
    x$family$aic = c()
    x$family$validmu = c()
    x$family$simulate = c()
    attr(x$terms,".Environment") = c()
    attr(x$formula,".Environment") = c()
    x$R <- c() #Not in a glm
    x$xNames <- c()
    x$xlevels <- c()
    x
    }

这主要基于this post,其中包含有此限制的有趣分析:

  

有一点需要注意。您可以完全取消model$family;该   预测函数仍将返回其默认值,即链接值   (即predict(model, newdata=data))将起作用)。然而,   predict(model, newdata=data, type='response')将失败。你还可以   通过反向传递链接值来恢复响应   链接功能:在逻辑回归的情况下,这是sigmoid   功能,sigmoid(x) = 1/(1 + exp(-x))

     

警告:许多其他事情除了预测你可能   喜欢使用glm模型会在精简版上失败:in   特别是summary()anova()step()。所以任何表征   你想要在候选模型上做,应该在修剪之前完成   减肥。一旦你决定了一个令人满意的模型,你就可以   将其剥离并保存以供将来预测使用。

我还直接从caret package:

包含了具有修剪功能的其他方法的修剪函数

glmnet

function(x) {
    x$call <- NULL
    x$df <- NULL
    x$dev.ratio <- NULL
    x
  }

C5.0,C5.0Cost,C5.0Rules,C5.0Tree

function(x) {
    x$boostResults <- NULL
    x$size <- NULL
    x$call <- NULL
    x$output <- NULL
    x
    }

rpart,rpart2

function(x) {
    x$call <- list(na.action = (x$call)$na.action)
    x$x <- NULL
    x$y <- NULL
    x$where <- NULL
    x
    }

treebag

function(x) {
    trim_rpart <- function(x) {
      x$call <- list(na.action = (x$call)$na.action)
      x$x <- NULL
      x$y <- NULL
      x$where <- NULL
      x
    }
    x$mtrees <- lapply(x$mtrees, 
                       function(x){
                         x$bindx <- NULL
                         x$btree <- trim_rpart(x$btree)
                         x
                       } )
    x
    }