2015-09-25 3 views
1

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

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. все работает отлично с example

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

Кодекса

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') 

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

+0

Я думаю, что ваш 'функция naiveBayes' может б неправильно. Обратите внимание, что в связанных примерах всегда есть формула (и ни одна в вашей), а naiveBayes принимает только data.frames или массивы (поэтому 'data [, 'TARGET']' вероятно, не должно работать) – erasmortg

+0

Формула не имеет чтобы быть установленным явно, это видно из примера «iris». В этом же примере показано использование 'iris [, 5]', поэтому 'data [, 'TARGET']' должно работать одинаково. Чтобы быть в безопасности, я проверил, что 'model <- naiveBayes (as.factor (data [, 1]), data [, 2])' приводит к такому же поведению – mskoryk

ответ

2

Это уже слишком долго для комментариев, так что я размещение в качестве ответа. Я вижу два или три вещи, которые можно было бы коммутируемых:

Первый: Я рекомендовал бы называть 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 . ~, данные = данные [2]): naiveBayes формула интерфейс обрабатывает кадры данных или массивы только

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

Ошибка в наивностиBayes.formula (N_INQUIRIES_BIN ~.Данные = данные [, «Мишень»]): 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 

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

#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 
+0

Я изменил код в соответствии с вашими инструкциями и все выглядит хорошо. Я новичок в R, поэтому я не могу сказать, что именно произошло. Формула (но есть пример, который не использует формулу), используя dataframes или что-то еще? Благодаря! – mskoryk

+0

Я вижу, что вызов формулы был фактически наоборот, я отредактирую ответ с правильными данными, рад помочь! – erasmortg

+0

спасибо! Я также добавил правильный ответ в нижней части моего вопроса – mskoryk

 Смежные вопросы

  • Нет связанных вопросов^_^