我想知道AODE是否真的如描述所说,在某种程度上比朴素贝叶斯更好:
https://cran.r-project.org/web/packages/AnDE/AnDE.pdf
–> “AODE通过平均一个小空间的所有值来实现高度准确的分类。”
https://www.quora.com/What-is-the-difference-between-a-Naive-Bayes-classifier-and-AODE
–> “AODE是以一种奇怪的方式放宽了朴素贝叶斯的独立性假设。它不再是一个生成模型,但它以一种与逻辑回归略有不同(且不那么有原则)的方式放宽了独立性假设。它用一个二次(基于特征数量)的依赖性替代了训练逻辑回归分类器时使用的凸优化问题,这种依赖性在训练和测试时都会出现。”
但是当我实验时,我发现预测结果似乎不太对,我用以下代码实现了它:
library(gmodels)library(AnDE)AODE_Model = aode(iris)predict_aode = predict(AODE_Model, iris)CrossTable(as.numeric(iris$Species), predict_aode)
谁能解释一下这是怎么回事?或者有没有好的实际解决方案来实现AODE?提前感谢
回答:
如果你查看该函数的小册子:
train: data.frame : 训练数据。它应该是一个数据框。AODE仅适用于离散化数据。最好在将其传递给此函数之前对数据框进行离散化。然而,如果事先没有进行离散化,aode会对数据进行离散化。它使用一个名为discretization的R包来实现这一目的。它使用众所周知的MDL离散化技术。(有时可能会失败)
默认情况下,来自arules的离散化函数将其分为3段,这对于iris数据集可能不够。所以我首先用arules的离散化重现你得到的结果:
library(arules)library(gmodels)library(AnDE)set.seed(111)trn = sample(1:nrow(indata),100)test = setdiff(1:nrow(indata),trn)indata <- data.frame(lapply(iris[,1:4],discretize,breaks=3),Species=iris$Species)AODE_Model = aode(indata[trn,])predict_aode = predict(AODE_Model, indata[test,])CrossTable(as.numeric(indata$Species)[test], predict_aode) | predict_aode as.numeric(indata$Species)[test] | 1 | 3 | Row Total | ---------------------------------|-----------|-----------|-----------| 1 | 15 | 5 | 20 | | 0.500 | 4.500 | | | 0.750 | 0.250 | 0.400 | | 0.333 | 1.000 | | | 0.300 | 0.100 | | ---------------------------------|-----------|-----------|-----------| 2 | 11 | 0 | 11 | | 0.122 | 1.100 | | | 1.000 | 0.000 | 0.220 | | 0.244 | 0.000 | | | 0.220 | 0.000 | | ---------------------------------|-----------|-----------|-----------| 3 | 19 | 0 | 19 | | 0.211 | 1.900 | | | 1.000 | 0.000 | 0.380 | | 0.422 | 0.000 | | | 0.380 | 0.000 | | ---------------------------------|-----------|-----------|-----------| Column Total | 45 | 5 | 50 | | 0.900 | 0.100 | | ---------------------------------|-----------|-----------|-----------|
你可以看到预测中缺少了一个类别。我们将其增加到4段:
indata <- data.frame(lapply(iris[,1:4],discretize,breaks=4),Species=iris$Species)AODE_Model = aode(indata[trn,])predict_aode = predict(AODE_Model, indata[test,])CrossTable(as.numeric(indata$Species)[test], predict_aode) | predict_aode as.numeric(indata$Species)[test] | 1 | 2 | 3 | Row Total | ---------------------------------|-----------|-----------|-----------|-----------| 1 | 20 | 0 | 0 | 20 | | 18.000 | 4.800 | 7.200 | | | 1.000 | 0.000 | 0.000 | 0.400 | | 1.000 | 0.000 | 0.000 | | | 0.400 | 0.000 | 0.000 | | ---------------------------------|-----------|-----------|-----------|-----------| 2 | 0 | 10 | 1 | 11 | | 4.400 | 20.519 | 2.213 | | | 0.000 | 0.909 | 0.091 | 0.220 | | 0.000 | 0.833 | 0.056 | | | 0.000 | 0.200 | 0.020 | | ---------------------------------|-----------|-----------|-----------|-----------| 3 | 0 | 2 | 17 | 19 | | 7.600 | 1.437 | 15.091 | | | 0.000 | 0.105 | 0.895 | 0.380 | | 0.000 | 0.167 | 0.944 | | | 0.000 | 0.040 | 0.340 | | ---------------------------------|-----------|-----------|-----------|-----------| Column Total | 20 | 12 | 18 | 50 | | 0.400 | 0.240 | 0.360 | | ---------------------------------|-----------|-----------|-----------|-----------|
它只有3个错误。对我来说,这是玩弄离散化而不引起过拟合的问题,这可能有点棘手..