r - 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?先感谢您
解决方案
如果您查看该功能的小插图:
火车:data.frame:训练数据。它应该是一个数据框。AODE 只处理离散数据。最好在将数据帧传递给此函数之前对其进行离散化。但是,如果事先没有完成,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个错误。对我来说,这是一个在不过度拟合的情况下进行离散化的问题,这可能很棘手。
推荐阅读
- java - ZipFile 构造函数 - 使用其模式和字符集参数的正确方法
- lua - 如何使用列表修复“'}'预期”
- html - 在 reactjs 中使用固定表头时无法为表头设置宽度
- javascript - 替换不是特定标签子串的子串
- selenium-webdriver - 使用 XPath 查找具有最高值的元素?
- javascript - 发出的事件不会调用 Vue JS 组件中的父方法
- blockchain - 基于区块链的网络的协议栈?
- android - 我应该覆盖 AlertDialog 吗?
- python - 由于服务器问题,TestRail 连接超时 [状态代码 500]
- html - TinyMCE 段落元素在 Internet Explorer 11 中无法聚焦