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

5

我希望使用朴素贝叶斯分类器进行预测。 到目前为止,我可以在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
这个问题似乎不适合在此讨论,因为它涉及到特定统计模型的变量选择;这并不是一个具体的编程问题。您可以考虑发布到[stats.se]。 - MrFlick
我在某种程度上不同意MrFlick的观点,因为这是一个双向问题。由于我不想违反本网站的规则,我将我的问题限制在以下范围内:我需要如何调整ref()才能使上面的代码片段正常工作? - user3008056
EDIT..i mean rfe(..) sorry! - user3008056
@ewuenob 然后请编辑原问题,使您的具体问题非常清晰。不要要求像论文参考文献之类的东西。此外,“不起作用”绝不足够。如果您收到错误消息,请包括它。如果它不能按您期望的方式工作,请描述您认为会发生什么以及实际发生了什么。 - MrFlick
@MrFlick...完成了...因为错误信息是德语,我认为最好的做法是运行我的代码并查看出现了什么错误。 - user3008056
1个回答

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

但是它没有记住哪些变量在同一因子中配对,所以并不理想。

非常感谢您提供这个详细的答案... 这对我的目的来说绝对足够了。只是因为我很好奇,我想问一下是否有一种方法可以对所有可能的特征组合进行一种穷举搜索?我知道这很多(如果我们有n个特征,就有2^n种可能的组合)。但对于小特征尺寸,这可能是一种可行的方式。 - user3008056
@ewuenhob 我自己从来不使用这些函数,所以我无法评论。 - MrFlick
没问题。你的回答帮了我很多!也许我会找到其他方法。由于这个关于穷举搜索的问题不是这篇文章的重点,我可能会开一个新的帖子来讨论穷举搜索。非常感谢! - user3008056

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接