2012-08-25 31 views
5

Creo que he implementado la mayor parte correctamente. Una parte me confundió:Naive Bayesian y problema de cero frecuencia

Problema de frecuencia cero: Agregue 1 al recuento para cada combinación de clase de valor de atributo (estimador de Laplace) cuando no se produce un valor de atributo con cada valor de clase.

Aquí es parte de mi código de cliente:

//Clasify 
string text = "Claim your free Macbook now!"; 
double posteriorProbSpam = classifier.Classify(text, "spam"); 
Console.WriteLine("-------------------------"); 
double posteriorProbHam = classifier.Classify(text, "ham"); 

Ahora dicen que la palabra 'libre' está presente en los datos de entrenamiento en algún lugar

//Training 
classifier.Train("ham", "Attention: Collect your Macbook from store."); 
*Lot more here* 
classifier.Train("spam", "Free macbook offer expiring."); 

Pero la palabra está presente en mis datos de entrenamiento para la categoría 'spam' solo no está en 'ham'. Entonces, cuando voy a calcular posteriorProbHam, ¿qué hago cuando me encuentro con la palabra 'gratis'?

enter image description here

Respuesta

5

Aún agregar uno. La razón: Naive Bayes modelos P("free" | spam) y P("free" | ham) como completamente independientes, por lo que desea estimar la probabilidad de cada uno de forma completamente independiente. El estimador de Laplace que está utilizando para P("free" | spam) es (count("free" | spam) + 1)/count(spam); P("ham" | spam) es lo mismo.

Si piensas en lo que significaría no agregar uno, no tendría sentido: ver "gratis" una vez en ham haría que fuera menos probable ver "gratis" en el spam.

+0

Gracias. Acabo de editar para incluir la fórmula que estoy siguiendo. Entonces, por ejemplo, P (viagra | Spam), si los datos de entrenamiento tienen 0 count para viagra en la categoría 'spam', ¿debería agregar 1? –

+0

Si desea usar el suavizado laplaciano, agregue uno a * todos * los numeradores y denominadores, no solo los recuentos cero. Entonces, si tuvieras 10 spam gratuitos, 5 gratis | no spam, 50 spam total, 100 no spam total, estimarías 'P (free | spam) = (10 + 1)/(50 + 1)' , 'P (spam) = (50 + 1)/(150 + 1)', 'P (gratis) = (15 + 1)/(150 + 1)'. También podría usar un número menor que 1 (por ejemplo, 0.1, típicamente llamado "alfa", ya que corresponde al uso de una distribución [Dirichlet-alpha] (http://en.wikipedia.org/wiki/Dirichlet_distribution) como su [anterior ] (http://en.wikipedia.org/wiki/Prior_probability) sobre estas probabilidades.) – Dougal

+0

Sí, eso es lo que terminé haciendo. Las cosas se ven bien algunas veces, sin embargo otras terminan con probabilidades mayores que 1. Mirando la fórmula anterior, esto es fácilmente posible dependiendo del resultado del denominador. –

Cuestiones relacionadas