我想使用朴素贝叶斯分类器进行一些预测.
到目前为止,我可以使用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()调用以获得递归功能消除?
最佳答案 此错误似乎是由于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], ...)
但是这不记得哪个变量在同一个因子中配对,因此它并不理想.