我正在考虑减少训练模型的大小(即this和this帖子),并且我在插入符号列功能中遇到了trim
参数。具体来说,这是在documentation:
如果
TRUE
object\$finalModel
中的最终模型可能包含某些组件 删除对象,以减少保存对象的大小。该predict
方法仍然有效,但模型的其他一些功能 可能行不通。trim
仅适用于具有此功能的模型 已经实施。
我意识到使用trim
的结果可能因使用的方法而异。在使用trim
参数后,是否有资源确定最终模型中包含和排除的内容?我可以节省多少空间?什么(如果有的话)功能丢失了?
在以前的问题中,如果参数甚至可以节省空间,那就不明确了。例如,这是一个简单的示例,其中trim=T
和trim=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)
答案 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
无效
从模型中修剪出对预测不必要的数据输出,使得拟合模型的大小相对于训练数据大小是恒定的。修剪功能是
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:
包含了具有修剪功能的其他方法的修剪函数function(x) {
x$call <- NULL
x$df <- NULL
x$dev.ratio <- NULL
x
}
function(x) {
x$boostResults <- NULL
x$size <- NULL
x$call <- NULL
x$output <- NULL
x
}
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
}