Caret RFE 处理属于同一分类变量水平的虚拟变量
Caret RFE to deal to dummy variables that are levels of the same categorical variable
我有一个分类问题,其中一个预测变量是具有四个级别 A、B、C、D 的分类变量 X,它已转换为三个虚拟变量 A、B、C。我试图使用 caret 包中的递归特征选择(RFE)来进行特征选择。我如何告诉 RFE 函数同时考虑 A、B、C、D?所以如果说 A 被排除在外,B&C 也被排除在外。
折腾了一整天,我还是无路可走……用公式界面填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 此处包含具有多个级别的分类变量。
非常感谢任何帮助!
首先:是的,你是对的,你不能将分类特征与RFE一起使用(Max here on CV对此有一个合理的解释)。有趣的是,将 all 级别编码为虚拟变量确实会导致错误,可以通过删除一个虚拟变量来解决。因此,我也会通过从类别变量中创建虚拟变量而忽略一个级别来预处理您的数据。
但我不会尝试保留全部或 none 最后的虚拟变量。如果 RFE 将其中一些(但不是全部)排除在外,那么某些级别似乎比其他级别包含更有价值的信息。这应该是合理的。想象一下 A、B、C 的级别 A 包含对您的目标变量有价值的信息。如果在虚拟变量创建期间保留了 A,则 B 和 C 可能会被 RFE 丢弃。如果 A 在虚拟变量创建过程中被丢弃,B 和 C 很可能都会被 RFE 保留。
PS:当混合连续和分类信息时,考虑在将数据交给RFE之前相应地缩放你的数据,以确保连续和分类信息对RFE的影响有些相似。
我有一个分类问题,其中一个预测变量是具有四个级别 A、B、C、D 的分类变量 X,它已转换为三个虚拟变量 A、B、C。我试图使用 caret 包中的递归特征选择(RFE)来进行特征选择。我如何告诉 RFE 函数同时考虑 A、B、C、D?所以如果说 A 被排除在外,B&C 也被排除在外。
折腾了一整天,我还是无路可走……用公式界面填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 此处包含具有多个级别的分类变量。
非常感谢任何帮助!
首先:是的,你是对的,你不能将分类特征与RFE一起使用(Max here on CV对此有一个合理的解释)。有趣的是,将 all 级别编码为虚拟变量确实会导致错误,可以通过删除一个虚拟变量来解决。因此,我也会通过从类别变量中创建虚拟变量而忽略一个级别来预处理您的数据。
但我不会尝试保留全部或 none 最后的虚拟变量。如果 RFE 将其中一些(但不是全部)排除在外,那么某些级别似乎比其他级别包含更有价值的信息。这应该是合理的。想象一下 A、B、C 的级别 A 包含对您的目标变量有价值的信息。如果在虚拟变量创建期间保留了 A,则 B 和 C 可能会被 RFE 丢弃。如果 A 在虚拟变量创建过程中被丢弃,B 和 C 很可能都会被 RFE 保留。
PS:当混合连续和分类信息时,考虑在将数据交给RFE之前相应地缩放你的数据,以确保连续和分类信息对RFE的影响有些相似。