R语言中的AODE机器学习

我想知道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个错误。对我来说,这是玩弄离散化而不引起过拟合的问题,这可能有点棘手..

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注