Значение переменной для каретного метода loclda - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь вычислить значение переменной из каретной модели 'loclda'.

Мой обучающий набор данных содержит 20 числовых предикторов и 4 класса дискретных результатов (2500 выборок).

Iпостроил модель и вычислил значение переменной с помощью следующих команд:

# fit the model
control <- trainControl(
                    method="repeatedcv", 
                    number=10, 
                    repeats=3,
                    savePredictions='final',
                    summaryFunction=multiClassSummary,
                    returnData=F,
                    trim=T,
                    allowParallel=F
                )

my_loclda_model <- train(MyClass ~ ., data=trainData, method='loclda', trControl=control, importance=T)

# compute variable importance
varImp(my_loclda_model)
Error : is.list(x) is not TRUE

traceback()
7: stop(msg, call. = FALSE, domain = NA)
6: stopifnot(is.list(x), is.list(val))
5: modifyList(data, lapply(data[, fc], as.numeric))
4: asNumeric(x)
3: filterVarImp(x_dat, y_dat, nonpara = nonpara, ...)
2: varImp.train(model_name)
1: varImp(model_name)

Из руководства пользователя каретки мы можем прочитать следующее:

Для моделей, которые не имеют соответствующих методов varImpсм. filterVarImp

Предполагая, что модель loclda не имеет метода varImp, я попытался использовать функцию filterVarImp непосредственно из окончательной модели:

str(my_loclda_model$finalModel)
List of 12
 $ learn           : num [1:2500, 1:20] -0.404 -0.336 -0.655 -0.618 -0.151 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:2500] "X2" "X3" "X5" "X6" ...
  .. ..$ : chr [1:20] "indexA1" "indexF1" "index4" "index5" ...
 $ grouping        : Factor w/ 4 levels "group1","group2","group3",..: 1 5 2 5 1 1 3 4 3 1 ...
  ..- attr(*, "names")= chr [1:2500] "2" "3" "5" "6" ...
 $ lev             : chr [1:4] "group1" "group2" "group3" ...
 $ weight.func     :function (x)
 $ k               : num 3401
 $ weighted.apriori: logi TRUE
 $ call            : language loclda(x = x, grouping = y, k = floor(param$k), importance = ..1)
 $ xNames          : chr [1:20] "indexA1" "indexF1" "index4" "index5" ...
 $ problemType     : chr "Classification"
 $ tuneValue       :'data.frame':   1 obs. of  1 variable:
  ..$ k: num 3401
 $ obsLevels       : atomic [1:4] group1 group2 group3 ...
  ..- attr(*, "ordered")= logi FALSE
 $ param           :List of 1
  ..$ importance: logi TRUE
 - attr(*, "class")= chr "loclda"


imp_out <- filterVarImp(x=my_loclda_model$finalModel$learn, y=my_loclda_model$finalModel$grouping)

Error in data[, fc] : (subscript) logical subscript too long
traceback()
5: lapply(data[, fc], as.numeric)
4: stopifnot(is.list(x), is.list(val))
3: modifyList(data, lapply(data[, fc], as.numeric))
2: asNumeric(x)
1: filterVarImp(x = model_name$finalModel$learn, y = model_name$finalModel$grouping)

Я не понимаюКакие x и y аргументы я должен передать filterVarImp?

Спасибо!

Примечание: та же проблема возникала и при использовании других методов (например, svmRadial, svmPoly, LogitBoost,regLogistic, ...).

1 Ответ

0 голосов
/ 30 декабря 2018

Указание x=as.data.frame(my_loclda_model$finalModel$learn) вместо матрицы, похоже, решает проблему, хотя в руководстве упоминается, что можно использовать как матрицу, так и фрейм данных.

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