使用用于预测的最少信息导出插入符R模型

时间:2017-12-04 12:25:09

标签: r r-caret

我想在下面导出以下模型,以便其他用户可以打开它并使用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")

1 个答案:

答案 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的方法。