2016-05-19 2 views
0

У меня есть проблема классификации, и один из предикторов является категориальной переменной 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 здесь, содержит категориальные переменные, которые имеют несколько уровней.

Любая помощь очень ценится!

+0

Благодаря @grubjesic для редактирования. – ybeybe

+0

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

+0

a) Вы имели в виду, что у вас есть 4 уровня, преобразованных в 3 фиктивные переменные? Получение 4 фиктивных переменных было бы общим путем. б) Действительно ли ваш классификатор нуждается в фиктивных переменных? В противном случае вы можете рассмотреть возможность их преобразования в одну переменную с несколькими уровнями. c) Есть ли причина, по которой вы * нуждаетесь *, чтобы исключить все или не из фиктивных переменных? Я не могу себе представить, зачем это нужно делать при использовании RFE. – geekoverdose

ответ

0

Во-первых: да, вы правы, что не можете использовать категориальные функции с RFE (это разумное объяснение этого Max here on CV). И что интересно, кодировка всех уровней в фиктивные переменные действительно вызывает ошибку, которую можно устранить, удалив одну фиктивную переменную. Следовательно, я также предварительно обработал ваши данные, создав фиктивные переменные из категориальной переменной, оставив один уровень.

Но в конце я бы не попытался сохранить либо все, либо никакие фиктивные переменные. Если RFE выбрасывает некоторые из них (но не все), то некоторые уровни, похоже, содержат более ценную информацию, чем другие. Это должно быть разумным. Представьте, что уровень A из A, B, C содержит ценную информацию для вашей целевой переменной. В случае сохранения A во время создания произвольной переменной B и C, вероятно, будут отброшены RFE. В случае, если A был отброшен при создании фиктивной переменной, B и C, вероятно, будут поддерживаться RFE.

PS: при смешивании непрерывной и категориальной информации, необходимо масштабировать свои данные, прежде чем передавать ее на радиопомех, чтобы убедиться, что воздействие непрерывной и категориальной информации на радиопомех несколько похоже.

+0

Спасибо @geekoverdose за ваш ответ. Это нормально, если RFE выбрасывает некоторые уровни с точки зрения прогнозирования/машинного обучения; однако это сделает интерпретацию остальных коэффициентов бессмысленными (по крайней мере, до некоторой степени). см. http: //stats.stackexchange.com/questions/213362/logistic-regression-категориальная переменная-интерпретация-после-преобразованная-в-d/213371? noredirect = 1 # comment405246_213371 для моего связанного вопроса о crossvidated.Since моей главной целью является предсказание, я мог бы просто оставить его как вы предположили. Я также рассмотрю масштабирование переменных. Благодаря! – ybeybe

+0

Чем больше я думаю об этом, тем больше я чувствую, что оба действия (оставьте некоторые уровни выше или оставите всю переменную). Только один использует подход машинного обучения (т. Е. Точность предсказания важнее, чем вывод), в то время как другая имеет больше смысла со статистической точки зрения. Я приму ответ здесь, но если кто-то захочет поделиться другими комментариями/литературой по этой проблеме, не стесняйтесь делать это. – ybeybe

+0

Я только что пришел к аналогичному выводу после прочтения превью. вопрос (о котором я раньше не знал). Из моего более ориентированного на прогнозирование pov * not * использования частей информации не было бы смысла, в то время как из интерпретируемой интерпретации интерпретация могла бы быть хуже. – geekoverdose