我想在下面导出以下模型,以便其他用户可以打开它并使用predict
函数来预测新观察的类。这是唯一可以使用的东西。我可以保存mod_fit,但它会占用大量空间,最终用户可以访问我不想要的信息。有什么简单的方法吗?
library(caret)
library(dplyr)
iris2 <- iris %>% filter(Species != "setosa") %>% mutate(Species = as.character(Species))
mod_fit <- train(Species ~., data = iris2, method = "glm")
答案 0 :(得分:2)
以下是从目标使用可能不需要的数据中删除R对象的一般过程。它本质上是启发式的,但我已经成功地应用了两次,并且运气好一点。
您可以使用名为object.size
的函数测量对象大小:
> object.size(mod_fit)
528616 bytes
确实,对于具有四个预测变量的线性模型来说,相当多。您可以使用例如str
函数检查对象内部的内容:
> str(mod_fit)
List of 23
$ method : chr "glm"
$ modelInfo :List of 15
..$ label : chr "Generalized Linear Model"
..$ library : NULL
..$ loop : NULL
..$ type : chr [1:2] "Regression" "Classification"
..$ parameters:'data.frame': 1 obs. of 3 variables:
.. ..$ parameter: Factor w/ 1 level "parameter": 1
.. ..$ class : Factor w/ 1 level "character": 1
[…]
$ coefnames : chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
$ xlevels : Named list()
- attr(*, "class")= chr [1:2] "train" "train.formula"
相当多的数据。因此,让我们检查每个元素占用多少空间:
> sort(sapply(mod_fit, object.size))
pred preProcess yLimits dots maximize method
0 0 0 40 48 96
modelType metric perfNames xlevels coefnames levels
104 104 160 192 296 328
call bestTune results times resample resampledCM
936 1104 1584 2024 2912 4152
trainingData terms control modelInfo finalModel
5256 6112 29864 211824 259456
现在我们可以尝试逐个删除此对象中的元素,并检查predict
工作所需的元素,从最大的开始:
> test_obj <- mod_fit; test_obj$finalModel <- NULL; predict(test_obj, iris2)
Error in if (modelFit$problemType == "Classification") { :
argument is of length zero
哎呀,finalModel
似乎很重要。 此处的任何类错误都告诉您无法删除该元素。那么,control
怎么样?
> test_obj <- mod_fit; test_obj$control <- NULL; predict(test_obj, iris2)
[1] versicolor versicolor versicolor versicolor versicolor versicolor
[7] versicolor versicolor versicolor versicolor versicolor versicolor
[13] versicolor versicolor versicolor versicolor versicolor versicolor
[…]
[97] virginica virginica virginica virginica
Levels: versicolor virginica
因此,似乎不需要control
。您可以递归执行此过程,例如:
> sort(sapply(mod_fit$finalModel, object.size))
offset contrasts param rank
0 0 40 48
[…]
model family
17056 163936
> sort(sapply(mod_fit$finalModel$family, object.size))
link family valideta linkfun linkinv mu.eta dev.resids
96 104 272 560 560 560 1992
variance validmu initialize aic simulate
2064 6344 18712 27512 103888
> test_obj <- mod_fit; test_obj$finalModel$family$simulate <- NULL; predict(test_obj, iris2)
[1] versicolor versicolor versicolor versicolor versicolor versicolor
[…]
[97] virginica virginica virginica virginica
Levels: versicolor virginica
如果有足够的尝试,您将知道对象的哪些部分是必要的,哪些不是 - 并在存储模型之前删除它们。
注意:虽然这可能会减少对象的不必要部分,但您可能会意外删除仅有有时用于预测的部分。对于总是以相同方式工作的简单模型,例如glm
,这不应该发生。
此外,不保证此过程的结果不会泄露有关您不希望模型用户查看的模型的信息。一般来说没有这样的保证,并且有reconstructing significant information about models and training data even from black-box models that are not usually easy to interpret的方法。