2016-07-08 2 views
2

У меня есть небольшой файл «naivebayestest.txt» с этой структуройНаивный байесовский в Спарк MLlib

10 1:1 
20 1:2 
20 1:2 

Из этих данных я пытаюсь классифицировать (1) вектор. Если я правильно понимаю Байеса, то метка для (1) должна быть 10 (с вероятностью 1!). Программа искрового MLlib:

String path = "/usr/local/spark/data/mllib/bayestest.txt"; 
JavaRDD<LabeledPoint> training = MLUtils.loadLibSVMFile(jsc.sc(), path).toJavaRDD(); 
final NaiveBayesModel model = NaiveBayes.train(training.rdd()); 
Vector v = Vectors.dense(1); 
double prediccion = model.predict(v); 
System.out.println("Vector: "+v+" prediction: "+prediccion); 

показывает Vector: [1.0] prediction: 20.0

я получить тот же результат с обучающим набором 1050 элементов, 350 (1/3) вида 10 1:1, а остальные 20 1:2 (2/3), и я все равно получаю такое же предсказание 20.0 для вектора 1.

Что я делаю неправильно?

ответ

1

Naive Bayes модель будет обучена для всех 3 записей. Ваше предположение

Если я понимаю Байеса правильно ярлык для (1) должно быть 10 (с вероятностью 1!)

неправильно здесь Правильная вероятность будет

P(10|1) = P(1|10) * P(10)/P(1) 

It по определению, но из-за аддитивного сглаживания эта формула может измениться. Я не уверен, какой будет эта формула. Но, по-видимому, из-за аддитивного сглаживания вероятность P (20 | 1) оказывается больше, чем P (10 | 1). Следовательно, вы получили результат так.

И это имеет смысл с большим количеством данных о тренировках.

+1

Вы правы, но р (1 | 10) * р (10)/p (1) = (1 * 1/3)/(1/3) = 1 – RafaelCaballero

+0

Я попытался с большим набором тренировок (1050 элементов) с тем же результатом. В любом случае спасибо за вашу помощь – RafaelCaballero

2

В source code искровой наивной реализации Байеса, вы можете найти ссылку алгоритмов, которые реализуются:

  1. Multinomial NB который может обрабатывать все виды дискретных данных. Например, путем преобразования документов в векторы TF-IDF он может быть , используемый для классификации документов.
  2. Bernoulli NB, делая каждый вектор 0-1 вектор.

Значения входных функций должны быть неотрицательными.

В вашем случае Spark используется Multinomial NB (по умолчанию), поэтому давайте впишем алгоритм.

Наивный байесовский часто используется для классификации документов, позвольте мне объяснить ваше дело в качестве классификационного документа дела:

  1. Скажем, классы ten и twenty
  2. Допустим, входной маркер (только один раз в этом случай) является Spark

Так что для ваших первых данных строк, это будет: Spark
для се Cond и в-третьих, они будут: Spark Spark

Как я понял из ссылки полиномиальной NB, алгоритм может быть суммированы в этом уравнении:
Equation

где:
Р (С): условная вероятность тестовых данных, принадлежащих к классу я
NF: количество терминов в словаре
Sij: суммы термин частоты для класса I и термин J
Si: суммы термина частоты для класса I
λ: лямбды, значение сглаживания
V: входа тестового вектора
ndci: количество строк данных в классе я
я: общего числа строк данных
пс: число классов



То, что произошло в вашем случае

В ваших данных строк, есть только один маркер (или только один вход функция), что означает nf в уравнении равен 1
так: Sij = Si

Это сделает множитель вектора:
ln(Sij+λ) - ln(Si+nf*λ) = ln(Si+λ)-ln(Si+λ) = 0

Как следствие, уравнение теперь:
New Equation

Это означает результат не зависит больше от входного вектора!

Теперь класс, который имеет наибольшее количество данных, выигрывает классификацию.

И поэтому ваш результат прогнозирования составляет 20 вместо 10.



В конце

Чтобы избежать этого, попробуйте использовать линейную регрессию, Decition дерево, Случайные Леса, ББТ и т.д.

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