AODE Машинное обучение в R - PullRequest
1 голос
/ 12 марта 2020

Я хотел знать, действительно ли 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 - странный способ расслабления наивного байеса " предположения о независимости. Это уже не порождающая модель, но она ослабляет предположения о независимости несколько иным (и менее принципиальным) способом, чем регрессия logisti c. Она заменяет проблему выпуклой оптимизации, используемую при обучении регрессии logisti c классификатор по квадратичной c (от числа функций) зависимости как от времени обучения, так и от времени тестирования. "

Но когда я экспериментировал с этим, я обнаружил, что предсказанные результаты кажутся неправильными, я реализовал их с этими кодами :

library(gmodels)
library(AnDE)
AODE_Model = aode(iris)
predict_aode = predict(AODE_Model, iris)
CrossTable(as.numeric(iris$Species), predict_aode) 

Matrix Table

Может кто-нибудь объяснить мне об этом? или есть хорошие практические решения для реализации AODE? Спасибо заранее

1 Ответ

1 голос
/ 12 марта 2020

Если вы посмотрите виньетку для функции:

train: data.frame: данные обучения. Это должен быть фрейм данных. AODE работает только с дискретными данными. Лучше было бы дискретизировать фрейм данных перед передачей его этой функции. Однако, aode дискретизирует данные, если не было сделано заранее. Для этого он использует пакет R, называемый дискретизацией. Он использует хорошо известный метод дискретизации MDL (иногда он может не работать)

По умолчанию функция дискретизации из arules сокращает ее до 3, что может быть недостаточно для радужной оболочки. Итак, сначала я воспроизвожу полученный результат с дискретизацией по 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 неправильно. Для меня это вопрос игры с дискретизацией без переоснащения, что может быть сложно ..

...