我想使用朴素贝叶斯分类器进行一些预测。 到目前为止,我可以使用R
中的以下(示例)代码进行预测library(klaR)
library(caret)
Faktor<-x <- sample( LETTERS[1:4], 10000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05) )
alter<-abs(rnorm(10000,30,5))
HF<-abs(rnorm(10000,1000,200))
Diffalq<-rnorm(10000)
Geschlecht<-sample(c("Mann","Frau", "Firma"),10000,replace=TRUE)
data<-data.frame(Faktor,alter,HF,Diffalq,Geschlecht)
set.seed(5678)
flds<-createFolds(data$Faktor, 10)
train<-data[-flds$Fold01 ,]
test<-data[flds$Fold01 ,]
features <- c("HF","alter","Diffalq", "Geschlecht")
formel<-as.formula(paste("Faktor ~ ", paste(features, collapse= "+")))
nb<-NaiveBayes(formel, train, usekernel=TRUE)
pred<-predict(nb,test)
test$Prognose<-as.factor(pred$class)
现在我想通过功能选择来改进这个模型。我的真实数据大约有100个功能。 所以我的问题是,选择最重要的朴素贝叶斯分类特征的最佳方法是什么? 有纸张参考吗?
我尝试了以下代码行,不幸的是,这一点不起作用
rfe(train[, 2:5],train[, 1], sizes=1:4,rfeControl = rfeControl(functions = ldaFuncs, method = "cv"))
编辑:它给我以下错误消息
Fehler in { : task 1 failed - "nicht-numerisches Argument für binären Operator"
Calls: rfe ... rfe.default -> nominalRfeWorkflow -> %op% -> <Anonymous>
因为这是德语版,您可以在您的机器上重现这个
如何调整rfe()
调用以获取递归功能消除?
答案 0 :(得分:2)
此错误似乎是由ldaFuncs
引起的。显然他们在使用矩阵输入时不喜欢因素。可以使用
mm <- ldaFuncs$fit(train[2:5], train[,1])
ldaFuncs$pred(mm,train[2:5])
# Error in FUN(x, aperm(array(STATS, dims[perm]), order(perm)), ...) :
# non-numeric argument to binary operator
如果你包含因子变量,这似乎只会发生。例如
mm <- ldaFuncs$fit(train[2:4], train[,1])
ldaFuncs$pred(mm,train[2:4])
不会返回相同的错误(并且似乎正常工作)。同样,当您使用矩阵语法时,这似乎只是一个问题。如果使用公式/数据语法,则不会出现相同的问题。例如
mm <- ldaFuncs$fit(Faktor ~ alter + HF + Diffalq + Geschlecht, train)
ldaFuncs$pred(mm,train[2:5])
似乎按预期工作。这意味着您有几个不同的选择。您可以使用rfe()
公式语法,如
rfe(Faktor ~ alter + HF + Diffalq + Geschlecht, train, sizes=1:4,
rfeControl = rfeControl(functions = ldaFuncs, method = "cv"))
或者你可以用
之类的东西自己扩展虚拟变量train.ex <- cbind(train[,1], model.matrix(~.-Faktor, train)[,-1])
rfe(train.ex[, 2:6],train.ex[, 1], ...)
但是这不记得哪个变量在同一因子中配对,所以它不理想。