Наивный Байес в R, библиотека e1071: подобранная модель дает априорные вероятности в качестве прогнозов для каждой записи

Я использую Naive Bayes из библиотеки e1071. У меня есть следующий игрушечный набор данных с именем nb0.csv

N_INQUIRIES_BIN,TARGET
1,0
2,1
2,0
1,0
1,0
1,0
1,1 

Затем я использую следующие строки кода

library(e1071)
data = read.csv('d:/nb0.csv')
model <- naiveBayes(as.factor(data[, 'N_INQUIRIES_BIN']), data[, 'TARGET'])

Когда я набираю model, я вижу, что модель каким-то образом обучалась

> model    
Naive Bayes Classifier for Discrete Predictors

Call:
naiveBayes.default(x = as.factor(data[, "N_INQUIRIES_BIN"]),
    y = data[, "TARGET"])

A-priori probabilities:
data[, "TARGET"]
        0         1
0.7142857 0.2857143

Conditional probabilities:
                x
data[, "TARGET"]   1   2
               0 0.8 0.2
               1 0.5 0.5

Однако, когда я делаю прогнозы по обучающим данным, я получаю априорные вероятности как прогнозы для всех записей.

> predict(model, as.factor(data[, 'N_INQUIRIES_BIN']), type='raw')
             0         1
[1,] 0.7142857 0.2857143
[2,] 0.7142857 0.2857143
[3,] 0.7142857 0.2857143
[4,] 0.7142857 0.2857143
[5,] 0.7142857 0.2857143
[6,] 0.7142857 0.2857143
[7,] 0.7142857 0.2857143

Это ошибка реализации или я упускаю что-то очевидное?

P.S. все отлично работает с примером

Правильный ответ

Код

library(e1071)
data = read.csv('d:/nb0.csv')

data$N_INQUIRIES_BIN <- as.factor(data$N_INQUIRIES_BIN)

model <- naiveBayes(TARGET ~ ., data)
predict(model, data, type='raw')

приводит именно к тому, что я хотел


person mskoryk    schedule 25.09.2015    source источник
comment
Я думаю, что ваша функция naiveBayes может быть неправильной. Обратите внимание, что в связанных примерах всегда есть формула (а в вашем нет), а naiveBayes принимает только data.frames или массивы (поэтому data[,'TARGET'], вероятно, не должно работать)   -  person erasmortg    schedule 25.09.2015
comment
Формулу не обязательно задавать явно, это видно из iris примера. В том же примере показано использование iris[, 5], поэтому data[, 'TARGET'] должно работать таким же образом. Чтобы быть в безопасности, я проверил, что model <- naiveBayes(as.factor(data[, 1]), data[, 2]) приводит к такому же поведению   -  person mskoryk    schedule 25.09.2015


Ответы (1)


Это было слишком долго для комментария, поэтому я отправляю ответ. Я вижу две или три вещи, которые можно было бы поменять местами:

Во-первых: я бы рекомендовал вызывать as.factor() вне модели, например так:

data$N_INQUIRIES_BIN <- as.factor(data$N_INQUIRIES_BIN)

Во-вторых: я не уверен, что это то, что вы хотите, но я не вижу формулы в вашем звонке (обратите внимание, что в приведенных вами примерах всегда есть формула), обратите внимание на разницу между этим:

model <- naiveBayes(as.factor(data[, 'N_INQUIRIES_BIN']), data[, 'TARGET'])

и это:

#Here I can't claim this is the model you are looking for, but for illustration purposes:
model <- naiveBayes(N_INQUIRIES_BIN ~ ., data = data)

Обратите внимание, что, помимо вызова as.factor() ранее, я также переключил вызов данных, так как это вызвало ошибку при попытке вашего метода:

Ошибка в naiveBayes.formula(N_INQUIRIES_BIN ~ ., data = data[, 2]): интерфейс формулы naiveBayes обрабатывает только кадры данных или массивы

Та же ошибка при ссылке по имени:

Ошибка в naiveBayes.formula(N_INQUIRIES_BIN ~ ., data = data[, "TARGET"]): интерфейс формулы naiveBayes обрабатывает только кадры данных или массивы

Однако эта альтернативная модель выводит следующее:

model <- naiveBayes(N_INQUIRIES_BIN ~ ., data = data)
model
#
#Naive Bayes Classifier for Discrete Predictors
#
#Call:
#naiveBayes.default(x = X, y = Y, laplace = laplace)
#
#A-priori probabilities:
#Y
#        1         2 
#0.7142857 0.2857143 
#
#Conditional probabilities:
#   TARGET
#Y   [,1]      [,2]
#  1  0.2 0.4472136
#  2  0.5 0.7071068

Еще раз обратите внимание, что условные и априорные вероятности, рассчитанные с помощью этого вызова функции, отличаются от ваших.

Наконец, предскажите (опять же, следуя примерам из файла справки):

#Here, all of the dataset is taken into account
predict(model, data, type='raw')
#             1         2
#[1,] 0.8211908 0.1788092
#[2,] 0.5061087 0.4938913
#[3,] 0.8211908 0.1788092
#[4,] 0.8211908 0.1788092
#[5,] 0.8211908 0.1788092
#[6,] 0.8211908 0.1788092
#[7,] 0.5061087 0.4938913

Для полноты и, что касается мотива публикации, формула из модели была отличной от того, что хотел OP, вот фактический вызов:

#Keep the as.factor call outside of the model
data$N_INQUIRIES_BIN <- as.factor(data$N_INQUIRIES_BIN)
#explicitly state the formula in the naivebayes
#note that the especified column is TARGET and not N_INQUIRIES_BIN
model <- naiveBayes(TARGET ~ ., data)
#predict the model, with all the dataset
predict(model, data, type='raw')
#Yields the following:
#       0   1
#[1,] 0.8 0.2
#[2,] 0.5 0.5
#[3,] 0.5 0.5
#[4,] 0.8 0.2
#[5,] 0.8 0.2
#[6,] 0.8 0.2
#[7,] 0.8 0.2
person erasmortg    schedule 25.09.2015
comment
Я изменил код в соответствии с вашими инструкциями, и все выглядит хорошо. Я новичок в R, поэтому не могу сказать, что именно послужило триггером. Формула (но есть пример, в котором формула не используется), с использованием фреймов данных или чего-то еще? Спасибо! - person mskoryk; 25.09.2015
comment
Я вижу, что вызов формулы был на самом деле наоборот, я отредактирую ответ с правильными данными, рад помочь! - person erasmortg; 25.09.2015
comment
Благодарность! Я также добавил правильный ответ в нижней части моего вопроса - person mskoryk; 26.09.2015