R - mlr: есть ли простой способ получить переменную важность настроенных моделей машин опорных векторов во вложенной повторной выборке (пространственной)?

Я пытаюсь получить значение переменной для всех предикторов (или переменных, или функций) настроенной модели опорных векторов (svm), используя e1071::svmсквозьmlr-пакет вR, Но я не уверен, правильно ли я делаю оценку. Ну, сначала идея:

Чтобы получить честно настроенную svm-модель, я следую учебнику по вложенной передискретизации, используя пространственную n-кратную перекрестную проверку (SpRepCV) во внешней петле и пространственной перекрестной проверке (SpCV) во внутреннем цикле. Как параметр настройкиgammaа также costнастроены на случайную сетку поиска. В качестве переменной оценки важности для всех предикторов, я хотел бы использоватьpermutation.importance, что относится к описанию, в основном агрегированная разница между признаками перестановки и не перестановки прогнозов.

Вmlr Существуют некоторые функции фильтра для получения важности переменной, но в то же время перед подбором модели создается подмножество на основе пользовательского ввода выбора (пороговое значение или количество переменных). - Тем не менее, я хотел бы получить значение переменной для всех переменных каждой подобранной модели. (Я знаю, что ученикrandom forestважная оценка "включительно")

Щас пользуюсьmlr::generateFeatureImportanceData в extractАргумент в пересчете, который выглядит действительно неловко. Поэтому я спрашиваю, нет ли более легкого пути?

Вот пример использования mlrверсия разработки:

## initialize libraries
# devtools::install_github("mlr-org/mlr) # using developper version of mlr
if(!require("pacman")) install.packages("pacman")
pacman::p_load("mlr", "ParamHelpers", "e1071", "parallelMap")


## create tuning setting
svm.ps <- ParamHelpers::makeParamSet(
  ParamHelpers::makeNumericParam("cost", lower = -12, 
                                 upper = 15, trafo = function(x) 2^x),
  ParamHelpers::makeNumericParam("gamma", lower = -15, 
                                 upper = 6, trafo = function(x) 2^x)
)

## create random search grid, small iteration number for example
ctrl.tune <- mlr::makeTuneControlRandom(maxit = 8) 

# inner resampling loop, "
inner <- mlr::makeResampleDesc("SpCV", iters = 3, predict = "both")

# outer loop, "
outer <- mlr::makeResampleDesc("SpRepCV", folds = 5, reps = 2, predict = "both")


## create learner - Support Vector Machine of the e1071-package
lrn.svm <- mlr::makeLearner("classif.svm", predict.type = "prob")

# ... tuning in inner resampling
lrn.svm.tune <- mlr::makeTuneWrapper(learner = lrn.svm, resampling = inner, 
                                     measures = list(auc),
                                     par.set = svm.ps, control = ctrl.tune, 
                                     show.info = FALSE) 


## create function that calculate variable importance based on permutation 
extractVarImpFunction <- function(x)
{
  list(mlr::generateFeatureImportanceData(task = mlr::makeClassifTask(
                          id = x$task.desc$id, 
                          data = mlr::getTaskData(mlr::spatial.task, subset = x$subset), 
                          target = x$task.desc$target,
                          positive = x$task.desc$positive, 
                          coordinates = mlr::spatial.task$coordinates[x$subset,]),
                        method = "permutation.importance", 
                        learner = mlr::makeLearner(cl = "classif.svm", 
                                                     predict.type = "prob", 
                          cost = x$learner.model$opt.result$x$cost,
                          gamma = x$learner.model$opt.result$x$gamma),
                        measure = list(mlr::auc), nmc = 10
                          )$res
      )
}



## start resampling for getting variable importance of tuned models (outer)

# parallelize tuning
parallelMap::parallelStart(mode = "multicore", level = "mlr.tuneParams", cpus = 8)

res.VarImpTuned <- mlr::resample(learner = lrn.svm.tune, task = mlr::spatial.task, 
                                 extract = extractVarImpFunction,
                                 resampling = outer, measures = list(auc), 
                                 models = TRUE, show.info = TRUE)

parallelMap::parallelStop() # stop parallelization

## get mean auroc decrease
var.imp <- do.call(rbind, lapply(res.VarImpTuned$extract, FUN = function(x){x[[1]]}))
var.imp <- data.frame(AUC_DECR = colMeans(var.imp), Variable = names(colMeans(var.imp))) 

0 ответов

Другие вопросы по тегам