Функциональность параметра триммера каретного поезда - PullRequest
0 голосов
/ 09 мая 2018

Я пытался уменьшить размер моих обученных моделей (а именно этот и этот пост), и я наткнулся на параметр trim в функции поезда карет. В частности, это было добавлено в версии 6.0-47 из документации :

Если TRUE конечная модель в object\$finalModel может иметь некоторые компоненты объекта удалены, поэтому уменьшите размер сохраненного объекта. predict метод все равно будет работать, но некоторые другие особенности модели может не работать trim ing будет происходить только для моделей, где эта функция был реализован.

Я понимаю, что результаты использования 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)

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Я немного покопался в пакете caret и методах, перечисленных @phiver. tldr; см. ниже подробности об использовании trim на bayesglm, C5.0, C5.0Cost, C5.0Rules, C5.0Tree, glm, glmnet, rpart, rpart2 и treebag. Иначе, установка 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
    }

Это основано главным образом на этом посте , который содержит интересный анализ с этим ограничением:

Одна точка и одна оговорка. Вы можете полностью обнулить model$family; Функция предсказания по-прежнему будет возвращать значение по умолчанию, значение ссылки (то есть predict(model, newdata=data)) будет работать). Тем не мение, predict(model, newdata=data, type='response') потерпит неудачу. Вы все еще можете восстановить ответ, передав значение ссылки через обратную функция связи: в случае логистической регрессии это сигмовидная кишка функция, sigmoid(x) = 1/(1 + exp(-x)).

Предостережение: многие другие вещи, кроме предсказания, что вы могли бы как делать с моделью GLM не удастся на урезанной версии: в в частности summary(), anova() и step(). Так что любая характеристика, которая Вы хотите сделать на кандидата модель должна быть сделана до обрезки вниз жир. Как только вы определились с удовлетворительной моделью, вы можете раздеть его и сохранить для использования в будущих прогнозах.

Я также включил функции обрезки для других методов, которые имеют возможности обрезки непосредственно из пакета :

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
    }
0 голосов
/ 09 мая 2018

Параметр trim (на данный момент) не работает с randomForest.

Если вы ищете на github проблемы с отделкой, вы найдете этот список проблем .

Выпуск 90 упоминает об отделке:

Это было реализовано для моделей bayesglm, C5.0, C5.0Cost, C5.0Rules, C5.0Tree, glm, glmnet, rpart, rpart2 и treebag. текущие регрессионные тесты проходят.

Это подтверждает мое исследование кода, и вы можете видеть в тесте, что функциональность карета - это модели, которые тестируются, чтобы увидеть, что результат обрезки создает меньший размер объекта и что прогнозируемый результат по-прежнему верен.

Также использование интерфейса без формул может немного уменьшить занимаемую площадь. Caret выполняет дополнительную работу, если вы используете интерфейс формулы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...