首页 文章

插入列车修剪参数的功能

提问于
浏览
2

我正在考虑减少我训练模型的大小(即thisthis帖子),我在插入符号列功能中遇到了 trim 参数 . 具体来说,这是在版本6.0-47中添加的,来自documentation

如果为TRUE,则对象\ $ finalModel中的最终模型可能会删除对象的某些组件,因此请减小已保存对象的大小 . 预测方法仍然有效,但该模型的某些其他功能可能无效 . 只有已实现此功能的模型才会进行调整 .

我意识到使用 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

    trim 选项(现在)不适用于 randomForest .

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

    Issue 90提到这个关于修剪:

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

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

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

  • 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,其中包含有此限制的有趣分析:

    一点一点警告 . 你可以完全取消模型$ family;预测函数仍将返回其默认值,链接值(即predict(model,newdata = data))将起作用) . 但是,预测(model,newdata = data,type ='response')将失败 . 您仍然可以通过反向链接函数传递链接值来恢复响应:在逻辑回归的情况下,这是sigmoid函数,sigmoid(x)= 1 /(1 exp(-x)) . 需要注意的是:除了预测您可能喜欢使用glm模型之外,许多其他事情都会在精简版本上失败:特别是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
        }
    

    树袋

    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
        }
    

相关问题