У меня есть проблема классификации, и один из предикторов является категориальной переменной X с четырьмя уровнями A, B, C, D, которая была преобразована в три фиктивные переменные А, В, С. Я попытался использовать рекурсивный выбор функций (RFE) в пакете caret для проведения выбора функции. Как я могу сказать функции RFE рассматривать A, B, C, D вместе? поэтому, если говорить, что А исключен, исключены B & C.Caret RFE относится к фиктивным переменным, которые являются уровнями одной и той же категориальной переменной
После борьбы с этим весь день, я все еще никуда не гожу ... Подача RFE с использованием интерфейса формулы также не работает. Я думаю, что RFE автоматически преобразует любые факторы в фиктивные переменные.
Ниже приведен мой пример кода:
#rfe settings
lrFuncs$summary<- twoClassSummary
trainctrl <- trainControl(classProbs= TRUE,
summaryFunction = twoClassSummary)
ctrl<-rfeControl(functions=lrFuncs,method = "cv", number=3)
#Data pre-process to exclude nzv and highly correlated variables
x<-training[,c(1, 4:25, 27:39)]
x2<-model.matrix(~., data = x)[,-1]
nzv <- nearZeroVar(x2,freqCut = 300/1)
x3 <- x2[, -nzv]
corr_mat <- cor(x3)
too_high <- findCorrelation(corr_mat, cutoff = .9)
x4 <- x3[, -too_high]
excludes<-c(names(data.frame(x3[, nzv])),names(data.frame(x3[, too_high])))
#Exclude the variables identified
x_frame<-x[ , -which(names(x) %in% c(excludes))]
#Run rfe
set.seed((408))
#This does not work with the error below
glmProfile<-rfe(x_frame,y,sizes =subsets, rfeControl = ctrl,trControl =trainctrl,metric = "ROC")
Error in { : task 1 failed - "undefined columns selected"
In addition: Warning messages:
1: glm.fit: fitted probabilities numerically 0 or 1 occurred
2: glm.fit: fitted probabilities numerically 0 or 1 occurred
3: glm.fit: fitted probabilities numerically 0 or 1 occurred
#it works if convert x_frame to matrix and then back to data frame, but this way rfe may remove some dummy variables (i.e.remove A but leave B&C)
glmProfile<-rfe(data.frame(model.matrix(~., data = x_frame)[,-1]),y,sizes =subsets, rfeControl = ctrl,trControl =trainctrl,metric = "ROC")
x_frame здесь, содержит категориальные переменные, которые имеют несколько уровней.
Любая помощь очень ценится!
Благодаря @grubjesic для редактирования. – ybeybe
Поскольку ответа пока нет, я упомянул, как я подошел к этому пока. Если функция rfe предложит исключить некоторые уровни категориальной переменной, я бы рассмотрел важность остальных уровней и решил либо исключить все уровни вместе, либо оставить их в модели - в основном запустить несколько экспериментов , Этот подход немного ручной, но я думаю, что это жизнеспособный подход. – ybeybe
a) Вы имели в виду, что у вас есть 4 уровня, преобразованных в 3 фиктивные переменные? Получение 4 фиктивных переменных было бы общим путем. б) Действительно ли ваш классификатор нуждается в фиктивных переменных? В противном случае вы можете рассмотреть возможность их преобразования в одну переменную с несколькими уровнями. c) Есть ли причина, по которой вы * нуждаетесь *, чтобы исключить все или не из фиктивных переменных? Я не могу себе представить, зачем это нужно делать при использовании RFE. – geekoverdose