【问题标题】:AODE Machine Learning in RR 中的 AODE 机器学习
【发布时间】:2020-06-24 02:25:05
【问题描述】:

我想知道 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?提前谢谢你

【问题讨论】:

    标签: r machine-learning probability


    【解决方案1】:

    如果您查看该功能的小插图:

    train: data.frame :训练数据。它应该是一个数据框。奥德 仅适用于离散数据。最好是 在将数据帧传递给此之前对其进行离散化 函数。但是,如果没有完成,aode 会将数据离散化 之前。它使用称为离散化的 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 个错误。对我来说,这是一个在不过度拟合的情况下进行离散化的问题,这可能很棘手..

    【讨论】:

    • 精彩的解释!所以实际上首先要做的是用正确的中断离散化数据集,谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 2018-10-02
    • 1970-01-01
    • 2015-11-05
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多