Как совместно использовать makeFeatSelWrapper и функцию resample в mlr - PullRequest
0 голосов
/ 12 ноября 2018

Я подгоняю модели классификации для бинарных проблем, используя пакет MLR в R. Для каждой модели я выполняю перекрестную проверку с выбором встроенных функций с помощью функции selectFeatures. В выводе я извлекаю средние значения AUC по наборам тестов и прогнозам. Для этого, получив несколько советов ( Получить прогнозы для тестовых наборов в MLR ), я использую функцию «makeFeatSelWrapper» в сочетании с функцией «resample». Кажется, цель достигнута, но результаты странные. С логистической регрессией в качестве классификатора я получаю AUC 0,5, что означает отсутствие выбранной переменной. Этот результат является неожиданным, поскольку я получаю AUC 0,9824432 с этим классификатором, используя метод, упомянутый в связанном вопросе. С нейронной сетью в качестве классификатора я получаю сообщение об ошибке

Ошибка в сумме (x): недопустимый «тип» (список) аргумента

Что не так?

Вот пример кода:

# 1. Find a synthetic dataset for supervised learning (two classes)
###################################################################

install.packages("mlbench")
library(mlbench)
data(BreastCancer)

# generate 1000 rows, 21 quantitative candidate predictors and 1 target variable 
p<-mlbench.waveform(1000) 

# convert list into dataframe
dataset<-as.data.frame(p)

# drop thrid class to get 2 classes
dataset2  = subset(dataset, classes != 3)

# 2. Perform cross validation with embedded feature selection using logistic regression
#######################################################################################  

library(BBmisc)
library(nnet)
library(mlr)

# Choice of data 
mCT <- makeClassifTask(data =dataset2, target = "classes")

# Choice of algorithm i.e. neural network
mL <- makeLearner("classif.logreg", predict.type = "prob")

# Choice of cross-validations for folds 

outer = makeResampleDesc("CV", iters = 10,stratify = TRUE)

# Choice of feature selection method

ctrl = makeFeatSelControlSequential(method = "sffs", maxit = NA,alpha = 0.001)

# Choice of hold-out sampling between training and test within the fold

inner = makeResampleDesc("Holdout",stratify = TRUE)

lrn = makeFeatSelWrapper(mL, resampling = inner, control = ctrl)
r = resample(lrn, mCT, outer, extract = getFeatSelResult,measures = list(mlr::auc,mlr::acc,mlr::brier),models=TRUE)

# 3. Perform cross validation with embedded feature selection using neural network
##################################################################################

library(BBmisc)
library(nnet)
library(mlr)

# Choice of data 
mCT <- makeClassifTask(data =dataset2, target = "classes")

# Choice of algorithm i.e. neural network
mL <- makeLearner("classif.nnet", predict.type = "prob")

# Choice of cross-validations for folds 

outer = makeResampleDesc("CV", iters = 10,stratify = TRUE)

# Choice of feature selection method

ctrl = makeFeatSelControlSequential(method = "sffs", maxit = NA,alpha = 0.001)

# Choice of sampling between training and test within the fold

inner = makeResampleDesc("Holdout",stratify = TRUE)

lrn = makeFeatSelWrapper(mL, resampling = inner, control = ctrl)
r = resample(lrn, mCT, outer, extract = getFeatSelResult,measures = list(mlr::auc,mlr::acc,mlr::brier),models=TRUE)

1 Ответ

0 голосов
/ 13 ноября 2018

Если вы запускаете часть кода с логистической регрессией пару раз, вы также должны получить ошибку Error in sum(x) : invalid 'type' (list) of argument.Однако мне кажется странным, что исправление определенного начального числа (например, set.seed(1)) перед повторной выборкой не гарантирует, что ошибка появляется или не появляется.

Ошибка возникает во внутреннем mlr коде для печативывод выбора функции на консоль.Очень простой обходной путь - просто избежать вывода такого вывода с show.info = FALSE в makeFeatSelWrapper (см. Код ниже).Хотя это устраняет ошибку, возможно, что причина ее возникновения может иметь и другие последствия, хотя, возможно, ошибка влияет только на код печати. ​​

При выполнении кода я получаю AUC только выше 0,90.Ниже вы найдете ваш код для логистической регрессии, слегка реорганизованный и с обходным путем.Я добавил droplevels () к набору данных 2, чтобы удалить недостающий уровень 3 из фактора, хотя это не связано с обходным решением.

library(mlbench)
library(mlr)
data(BreastCancer)

p<-mlbench.waveform(1000)
dataset<-as.data.frame(p)
dataset2  = subset(dataset, classes != 3)
dataset2  <- droplevels(dataset2  )    

mCT <- makeClassifTask(data =dataset2, target = "classes")
ctrl = makeFeatSelControlSequential(method = "sffs", maxit = NA,alpha = 0.001)
mL <- makeLearner("classif.logreg", predict.type = "prob")
inner = makeResampleDesc("Holdout",stratify = TRUE)
lrn = makeFeatSelWrapper(mL, resampling = inner, control = ctrl, show.info = FALSE)
# uncomment this for the error to appear again. Might need to run the code a couple of times to see the error
# lrn = makeFeatSelWrapper(mL, resampling = inner, control = ctrl)
outer = makeResampleDesc("CV", iters = 10,stratify = TRUE)
r = resample(lrn, mCT, outer, extract = getFeatSelResult,measures = list(mlr::auc,mlr::acc,mlr::brier),models=TRUE)

Редактировать: я сообщил о проблеме и создал запрос на получение с исправлением.

...