选择R中朴素贝叶斯分类的特征

时间:2014-06-24 16:08:00

标签: r bayesian

我想使用朴素贝叶斯分类器进行一些预测。 到目前为止,我可以使用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()调用以获取递归功能消除?

1 个答案:

答案 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], ...)

但是这不记得哪个变量在同一因子中配对,所以它不理想。