sklearn naive example ejemplo clasificador bayesiano bayes algorithm machine-learning dataset classification naivebayes

algorithm - example - naive bayes python



Una explicación simple de la Clasificación Naive Bayes. (5)

Me resulta difícil entender el proceso de Naive Bayes, y me preguntaba si alguien podría explicarlo con un simple proceso paso a paso en inglés. Entiendo que las comparaciones según los tiempos ocurrieron como una probabilidad, pero no tengo idea de cómo se relacionan los datos de entrenamiento con el conjunto de datos real.

Por favor, dame una explicación de qué papel juega el conjunto de entrenamiento. Estoy dando un ejemplo muy simple para las frutas aquí, como el plátano, por ejemplo.

training set--- round-red round-orange oblong-yellow round-red dataset---- round-red round-orange round-red round-orange oblong-yellow round-red round-orange oblong-yellow oblong-yellow round-red


Intento explicar la regla de Bayes con un ejemplo.

Supongamos que sabes que el 10% de las personas son fumadores. También sabe que el 90% de los fumadores son hombres y el 80% tienen más de 20 años.

Ahora ves a alguien que es un hombre y 15 años. Quieres saber la posibilidad de que él sea un fumador:

X = smoker | he is a man and under 20

Como sabe que el 10% de las personas son fumadoras, su estimación inicial es del 10% ( probabilidad previa , sin saber nada acerca de la persona), pero las otras pruebas (que es un hombre y él 15) pueden afectar esta estimación.

Cada evidencia puede aumentar o disminuir esta posibilidad. Por ejemplo, este hecho de que es un hombre puede aumentar la probabilidad, siempre que este porcentaje (siendo un hombre) entre los no fumadores sea más bajo, por ejemplo, 40%. En otras palabras, ser un hombre debe ser un buen indicador de ser un fumador en lugar de un no fumador.

Podemos mostrar esta contribución de otra manera. Para cada característica, debe comparar la similitud (probabilidad) de esa característica (f) sola con su concordancia en las condiciones dadas. ( P(f) vs. P(f | x) . Por ejemplo, si sabemos que la probabilidad de ser un hombre es del 90% en una sociedad y el 90% de los fumadores también son hombres, entonces saber que alguien es un hombre no lo hace No nos ayude (10% * (90% / 90%) = 10%) . Pero si los hombres contribuyen al 40% de la sociedad, pero al 90% de los fumadores, saber que alguien es un hombre aumenta la posibilidad de ser un fumador (10% * (90% / 40%) = 22.5% ) . De la misma manera, si la probabilidad de ser un hombre era del 95% en la sociedad, independientemente del hecho de que el porcentaje de hombres entre los fumadores sea alto (90%)! la evidencia de que alguien es un hombre disminuye la probabilidad de que sea un fumador! (10% * (90% / 95%) = 9.5%) .

Entonces tenemos:

P(X) = P(smoker)* (P(being a man | smoker)/P(being a man))* (P(under 20 | smoker)/ P(under 20))

Tenga en cuenta que en esta fórmula asumimos que ser hombre y ser menor de 20 años son características independientes, por lo que los multiplicamos, lo que significa que saber que alguien es menor de 20 años no tiene ningún efecto en adivinar que es hombre o mujer. Pero puede que no sea cierto, por ejemplo, tal vez la mayoría de la adolescencia en una sociedad son hombres ...

Para utilizar esta fórmula en un clasificador.

El clasificador se da con algunas características (ser hombre y tener menos de 20 años) y debe decidir si es fumador o no. Utiliza la fórmula anterior para encontrar eso. Para proporcionar las probabilidades requeridas (90%, 10%, 80% ...) utiliza el conjunto de entrenamiento. Por ejemplo, cuenta las personas en el conjunto de capacitación que son fumadores y encuentran que contribuyen con el 10% de la muestra. Luego, para los fumadores, verifique cuántos de ellos son hombres o mujeres ... cuántos son mayores de 20 o menores de 20 ...


Me doy cuenta de que esta es una pregunta antigua, con una respuesta establecida. La razón por la que estoy publicando es que la respuesta aceptada tiene muchos elementos de k-NN ( k -vecinos más cercanos), un algoritmo diferente.

Tanto k-NN como NaiveBayes son algoritmos de clasificación. Conceptualmente, k-NN usa la idea de "cercanía" para clasificar nuevas entidades. En k-NN, la ''cercanía'' se modela con ideas como la distancia euclidiana o la distancia del coseno. Por el contrario, en NaiveBayes, el concepto de ''probabilidad'' se usa para clasificar nuevas entidades.

Dado que la pregunta es sobre Naive Bayes, he aquí cómo describiría las ideas y los pasos a alguien. Trataré de hacerlo con la menor cantidad de ecuaciones y en un lenguaje sencillo tanto como sea posible.

Primero, probabilidad condicional y regla de Bayes

Antes de que alguien pueda entender y apreciar los matices de los ingenuos de Bayes, primero deben conocer un par de conceptos relacionados, a saber, la idea de probabilidad condicional y la regla de Bayes. (Si está familiarizado con estos conceptos, vaya a la sección titulada Cómo llegar a Naive Bayes )

Probabilidad condicional en inglés simple: ¿Cuál es la probabilidad de que algo suceda, dado que algo más ya ha sucedido?

Digamos que hay algún Resultado O. Y alguna Evidencia E. De la forma en que se definen estas probabilidades: La Probabilidad de tener tanto el Resultado O como la Evidencia E es: (Probabilidad de que O ocurra) multiplicada por el (Probabilidad de E dado que O sucedió)

Un ejemplo para entender la probabilidad condicional:

Digamos que tenemos una colección de senadores de Estados Unidos. Los senadores podrían ser demócratas o republicanos. También son hombres o mujeres.

Si seleccionamos un senador completamente al azar, ¿cuál es la probabilidad de que esta persona sea demócrata? La probabilidad condicional puede ayudarnos a responder eso.

Probabilidad de (demócrata y mujer senadora) = Prob (senador es demócrata) multiplicada por la probabilidad condicional de ser mujer dado que son demócratas.

P(Democrat & Female) = P(Democrat) * P(Female | Democrat)

Podríamos calcular exactamente lo mismo, a la inversa:

P(Democrat & Female) = P(Female) * P(Democrat | Female)

Entendiendo la regla de Bayes

Conceptualmente, esta es una manera de pasar de P (Evidencia | Resultado conocido) a P (Resultado | Evidencia conocida). A menudo, sabemos con qué frecuencia se observa alguna evidencia en particular, dado un resultado conocido . Tenemos que usar este hecho conocido para calcular lo contrario, para calcular la posibilidad de que ocurra ese resultado , dadas las pruebas.

P (Resultado dado que conocemos alguna Evidencia) = P (Evidencia dado que conocemos el Resultado) veces Prob (Resultado), escalado por la P (Evidencia)

El ejemplo clásico para entender la Regla de Bayes:

Probability of Disease D given Test-positive = Prob(Test is positive|Disease) * P(Disease) _______________________________________________________________ (scaled by) Prob(Testing Positive, with or without the disease)

Ahora, todo esto fue solo un preámbulo, para llegar a Naive Bayes.

Cómo llegar a Naive Bayes ''

Hasta ahora, solo hemos hablado de una pieza de evidencia. En realidad, tenemos que predecir un resultado dada la evidencia múltiple. En ese caso, la matemática se vuelve muy complicada. Para sortear esa complicación, un enfoque es "desacoplar" varias pruebas y tratar cada una de las pruebas como independientes. Este enfoque es por eso que se llama Bayes ingenuo .

P(Outcome|Multiple Evidence) = P(Evidence1|Outcome) * P(Evidence2|outcome) * ... * P(EvidenceN|outcome) * P(Outcome) scaled by P(Multiple Evidence)

Muchas personas eligen recordar esto como:

P(Likelihood of Evidence) * Prior prob of outcome P(outcome|evidence) = _________________________________________________ P(Evidence)

Note algunas cosas sobre esta ecuación:

  • Si el Prob (evidencia | resultado) es 1, entonces solo estamos multiplicando por 1.
  • Si el Prob (alguna evidencia particular | resultado) es 0, entonces todo el prob. se convierte en 0. Si ve evidencia contradictoria, podemos descartar ese resultado.
  • Ya que dividimos todo por P (Evidencia), podemos incluso alejarnos sin calcularlo.
  • La intuición detrás de la multiplicación por lo anterior es para que demos alta probabilidad a resultados más comunes y bajas probabilidades a resultados poco probables. Estas también se llaman base rates y son una forma de escalar nuestras probabilidades predichas.

¿Cómo aplicar NaiveBayes para predecir un resultado?

Simplemente ejecute la fórmula anterior para cada resultado posible. Ya que estamos tratando de clasificar , cada resultado se llama una class y tiene una class label. Nuestro trabajo es examinar la evidencia, considerar la probabilidad de que sea esta clase o esa clase y asignar una etiqueta a cada entidad. Nuevamente, tomamos un enfoque muy simple: la clase que tiene la mayor probabilidad es declarada "ganadora" y esa etiqueta de clase se asigna a esa combinación de evidencias.

Ejemplo de fruta

Probemos con un ejemplo para aumentar nuestra comprensión: el OP solicitó un ejemplo de identificación "fruto".

Digamos que tenemos datos sobre 1000 piezas de fruta. Suceden que son bananas , naranjas o alguna otra fruta . Sabemos 3 características de cada fruta:

  1. Si es largo
  2. Si es dulce y
  3. Si su color es amarillo.

Este es nuestro ''conjunto de entrenamiento''. Usaremos esto para predecir el tipo de cualquier fruta nueva que encontremos.

Type Long | Not Long || Sweet | Not Sweet || Yellow |Not Yellow|Total ___________________________________________________________________ Banana | 400 | 100 || 350 | 150 || 450 | 50 | 500 Orange | 0 | 300 || 150 | 150 || 300 | 0 | 300 Other Fruit | 100 | 100 || 150 | 50 || 50 | 150 | 200 ____________________________________________________________________ Total | 500 | 500 || 650 | 350 || 800 | 200 | 1000 ___________________________________________________________________

Podemos pre-calcular muchas cosas acerca de nuestra colección de frutas.

Las llamadas probabilidades "previas". (Si no conociéramos ninguno de los atributos de la fruta, esta sería nuestra suposición). Estas son nuestras base rates.

P(Banana) = 0.5 (500/1000) P(Orange) = 0.3 P(Other Fruit) = 0.2

Probabilidad de "evidencia"

p(Long) = 0.5 P(Sweet) = 0.65 P(Yellow) = 0.8

Probabilidad de "Probabilidad"

P(Long|Banana) = 0.8 P(Long|Orange) = 0 [Oranges are never long in all the fruit we have seen.] .... P(Yellow|Other Fruit) = 50/200 = 0.25 P(Not Yellow|Other Fruit) = 0.75

Dado un fruto, ¿cómo clasificarlo?

Digamos que se nos dan las propiedades de una fruta desconocida y se nos pide que la clasifiquemos. Se nos dice que la fruta es larga, dulce y amarilla. ¿Es un plátano? ¿Es una naranja? ¿O es alguna otra fruta?

Simplemente podemos ejecutar los números para cada uno de los 3 resultados, uno por uno. Luego elegimos la probabilidad más alta y "clasificamos" nuestra fruta desconocida como perteneciente a la clase que tenía la probabilidad más alta en base a nuestra evidencia previa (nuestro conjunto de entrenamiento de 1000 frutas)

P(Banana|Long, Sweet and Yellow) P(Long|Banana) * P(Sweet|Banana) * P(Yellow|Banana) * P(banana) = _______________________________________________________________ P(Long) * P(Sweet) * P(Yellow) = 0.8 * 0.7 * 0.9 * 0.5 / P(evidence) = 0.252 / P(evidence) P(Orange|Long, Sweet and Yellow) = 0 P(Other Fruit|Long, Sweet and Yellow) P(Long|Other fruit) * P(Sweet|Other fruit) * P(Yellow|Other fruit) * P(Other Fruit) = ____________________________________________________________________________________ P(evidence) = (100/200 * 150/200 * 50/200 * 200/1000) / P(evidence) = 0.01875 / P(evidence)

Por un margen abrumador ( 0.252 >> 0.01875 ), clasificamos esta fruta dulce / larga / amarilla como probable que sea un plátano.

¿Por qué es tan popular el clasificador de Bayes?

Mira a lo que eventualmente se reduce. Solo un poco de conteo y multiplicación. Podemos pre-computar todos estos términos, por lo que la clasificación es fácil, rápida y eficiente.

Let z = 1 / P(evidence). Ahora calculamos rápidamente las siguientes tres cantidades.

P(Banana|evidence) = z * Prob(Banana) * Prob(Evidence1|Banana) * Prob(Evidence2|Banana) ... P(Orange|Evidence) = z * Prob(Orange) * Prob(Evidence1|Orange) * Prob(Evidence2|Orange) ... P(Other|Evidence) = z * Prob(Other) * Prob(Evidence1|Other) * Prob(Evidence2|Other) ...

Asigne la etiqueta de clase de la que sea el número más alto y listo.

A pesar del nombre, Naive Bayes resulta excelente en ciertas aplicaciones. La clasificación de texto es un área donde realmente brilla.

Espero que ayude a entender los conceptos detrás del algoritmo Naive Bayes.


Ram Narasimhan explicó muy bien el concepto que se encuentra a continuación, es una explicación alternativa a través del ejemplo de código de Naive Bayes en acción.
Utiliza un problema de ejemplo de este libro en la página 351
Este es el conjunto de datos que usaremos.

En el conjunto de datos anterior, si damos la hipótesis = {"Age":''<=30'', "Income":"medium", "Student":''yes'' , "Creadit_Rating":''fair''} entonces cuál es la probabilidad que comprará o no comprará una computadora.
El siguiente código responde exactamente a esa pregunta.
Simplemente cree un archivo llamado new_dataset.csv y pegue el siguiente contenido.

Age,Income,Student,Creadit_Rating,Buys_Computer <=30,high,no,fair,no <=30,high,no,excellent,no 31-40,high,no,fair,yes >40,medium,no,fair,yes >40,low,yes,fair,yes >40,low,yes,excellent,no 31-40,low,yes,excellent,yes <=30,medium,no,fair,no <=30,low,yes,fair,yes >40,medium,yes,fair,yes <=30,medium,yes,excellent,yes 31-40,medium,no,excellent,yes 31-40,high,yes,fair,yes >40,medium,no,excellent,no

¡Aquí está el código que los comentarios explican todo lo que estamos haciendo aquí! [pitón]

import pandas as pd import pprint class Classifier(): data = None class_attr = None priori = {} cp = {} hypothesis = None def __init__(self,filename=None, class_attr=None ): self.data = pd.read_csv(filename, sep='','', header =(0)) self.class_attr = class_attr '''''' probability(class) = How many times it appears in cloumn __________________________________________ count of all class attribute '''''' def calculate_priori(self): class_values = list(set(self.data[self.class_attr])) class_data = list(self.data[self.class_attr]) for i in class_values: self.priori[i] = class_data.count(i)/float(len(class_data)) print "Priori Values: ", self.priori '''''' Here we calculate the individual probabilites P(outcome|evidence) = P(Likelihood of Evidence) x Prior prob of outcome ___________________________________________ P(Evidence) '''''' def get_cp(self, attr, attr_type, class_value): data_attr = list(self.data[attr]) class_data = list(self.data[self.class_attr]) total =1 for i in range(0, len(data_attr)): if class_data[i] == class_value and data_attr[i] == attr_type: total+=1 return total/float(class_data.count(class_value)) '''''' Here we calculate Likelihood of Evidence and multiple all individual probabilities with priori (Outcome|Multiple Evidence) = P(Evidence1|Outcome) x P(Evidence2|outcome) x ... x P(EvidenceN|outcome) x P(Outcome) scaled by P(Multiple Evidence) '''''' def calculate_conditional_probabilities(self, hypothesis): for i in self.priori: self.cp[i] = {} for j in hypothesis: self.cp[i].update({ hypothesis[j]: self.get_cp(j, hypothesis[j], i)}) print "/nCalculated Conditional Probabilities: /n" pprint.pprint(self.cp) def classify(self): print "Result: " for i in self.cp: print i, " ==> ", reduce(lambda x, y: x*y, self.cp[i].values())*self.priori[i] if __name__ == "__main__": c = Classifier(filename="new_dataset.csv", class_attr="Buys_Computer" ) c.calculate_priori() c.hypothesis = {"Age":''<=30'', "Income":"medium", "Student":''yes'' , "Creadit_Rating":''fair''} c.calculate_conditional_probabilities(c.hypothesis) c.classify()

salida:

Priori Values: {''yes'': 0.6428571428571429, ''no'': 0.35714285714285715} Calculated Conditional Probabilities: { ''no'': { ''<=30'': 0.8, ''fair'': 0.6, ''medium'': 0.6, ''yes'': 0.4 }, ''yes'': { ''<=30'': 0.3333333333333333, ''fair'': 0.7777777777777778, ''medium'': 0.5555555555555556, ''yes'': 0.7777777777777778 } } Result: yes ==> 0.0720164609053 no ==> 0.0411428571429

Espero que ayude a entender mejor el problema.

paz


Su pregunta, según tengo entendido, está dividida en dos partes. Una es que necesitas más comprensión para el clasificador Naive Bayes y, en segundo lugar, la confusión que rodea al conjunto de entrenamiento.

En general, todos los Algoritmos de aprendizaje automático deben estar capacitados para tareas de aprendizaje supervisado como clasificación, predicción, etc. o para tareas de aprendizaje no supervisado como agrupamiento.

Entrenando significa entrenarlos en insumos particulares para que luego podamos evaluarlos en insumos desconocidos (que nunca han visto antes) para que puedan clasificar o predecir, etc. (en caso de aprendizaje supervisado) según su aprendizaje. Esto es en lo que se basan la mayoría de las técnicas de Aprendizaje Automático como Redes Neuronales, SVM, Bayesianas, etc.

Por lo tanto, en un proyecto de Aprendizaje automático general, básicamente tiene que dividir su conjunto de entrada en un Conjunto de desarrollo (Conjunto de entrenamiento + Conjunto de prueba de desarrollo) y un Conjunto de prueba (o Conjunto de evaluación). Recuerde que su objetivo básico sería que su sistema aprenda y clasifique las entradas nuevas que nunca antes habían visto, ya sea en el conjunto de desarrolladores o en el conjunto de pruebas.

El conjunto de prueba normalmente tiene el mismo formato que el conjunto de entrenamiento. Sin embargo, es muy importante que el conjunto de pruebas sea distinto del corpus de entrenamiento: si simplemente reutilizamos el conjunto de pruebas como conjunto de pruebas, entonces un modelo que simplemente memorice su entrada, sin aprender a generalizar a nuevos ejemplos, recibirá información engañosa puntuaciones altas.

En general, para un ejemplo, el 70% puede ser casos de entrenamiento conjunto. También recuerde dividir el conjunto original en los conjuntos de entrenamiento y prueba al azar .

Ahora vengo a tu otra pregunta sobre Naive Bayes.

Fuente, por ejemplo, a continuación : http://www.statsoft.com/textbook/naive-bayes-classifier

Para demostrar el concepto de Clasificación de Naïve Bayes, considere el siguiente ejemplo:

Como se indica, los objetos pueden clasificarse como GREEN o RED . Nuestra tarea es clasificar los nuevos casos a medida que llegan, es decir, decidir a qué etiqueta de clase pertenecen, según los objetos existentes en la actualidad.

Ya que hay el doble de objetos GREEN que RED , es razonable creer que un caso nuevo (que aún no se ha observado) tiene el doble de probabilidades de ser miembro GREEN lugar de RED . En el análisis bayesiano, esta creencia se conoce como la probabilidad previa. Las probabilidades anteriores se basan en la experiencia previa, en este caso, el porcentaje de objetos GREEN y RED , y se utilizan a menudo para predecir los resultados antes de que realmente ocurran.

Así, podemos escribir:

Probabilidad previa de GREEN : number of GREEN objects / total number of objects

Probabilidad previa de RED : number of RED objects / total number of objects

Dado que hay un total de 60 objetos, 40 de los cuales son GREEN y 20 RED , nuestras probabilidades previas para ser miembro de una clase son:

Probabilidad previa para GREEN : 40 / 60

Probabilidad previa para RED : 20 / 60

Habiendo formulado nuestra probabilidad previa, ahora estamos listos para clasificar un nuevo objeto (círculo WHITE en el diagrama a continuación). Dado que los objetos están bien agrupados, es razonable suponer que GREEN más objetos GREEN (o RED ) se encuentren cerca de X, es más probable que los nuevos casos pertenezcan a ese color en particular. Para medir esta probabilidad, dibujamos un círculo alrededor de X que abarca un número (a elegir a priori) de puntos independientemente de sus etiquetas de clase. Luego calculamos el número de puntos en el círculo que pertenece a cada etiqueta de clase. A partir de esto calculamos la probabilidad:

De la ilustración anterior, está claro que la probabilidad de X dada en GREEN es más pequeña que la probabilidad de X dada en RED , ya que el círculo abarca 1 objeto GREEN y 3 RED . Así:

Aunque las probabilidades anteriores indican que X puede pertenecer a GREEN (dado que hay el doble de GREEN comparación con RED ), la probabilidad indica lo contrario; que la membresía de clase de X es RED (dado que hay más objetos RED en la vecindad de X que GREEN ). En el análisis Bayesiano, la clasificación final se produce combinando ambas fuentes de información, es decir, el anterior y la probabilidad, para formar una probabilidad posterior utilizando la llamada regla de Bayes (nombrada después del Rev. Thomas Bayes 1702-1761).

Finalmente, clasificamos X como RED ya que su pertenencia de clase logra la mayor probabilidad posterior.


Naive Bayes: Naive Bayes se encarga de supervisar el aprendizaje automático, que solía realizar clasificaciones de conjuntos de datos. Se utiliza para predecir cosas sobre la base de sus supuestos de conocimiento previo e independencia.

Lo llaman ingenuo porque sus suposiciones (asume que todas las características en el conjunto de datos son igualmente importantes e independientes) son realmente optimistas y rara vez son ciertas en la mayoría de las aplicaciones del mundo real.

Es el algoritmo de clasificación el que toma la decisión para el conjunto de datos desconocido. Se basa en el teorema de Bayes, que describe la probabilidad de un evento en base a su conocimiento previo.

El siguiente diagrama muestra cómo funciona el ingenuo Bayes.

Fórmula para predecir NB:

¿Cómo utilizar el algoritmo ingenuo de Bayes?

Tomemos un ejemplo de cómo NB funciona

Paso 1: Primero averiguamos la probabilidad de tabla que muestra la probabilidad de sí o no en el diagrama a continuación. Paso 2: Encuentra la probabilidad posterior de cada clase.

Problem: Find out the possibility of whether the player plays in Rainy condition? P(Yes|Rainy) = P(Rainy|Yes) * P(Yes) / P(Rainy) P(Rainy|Yes) = 2/9 = 0.222 P(Yes) = 9/14 = 0.64 P(Rainy) = 5/14 = 0.36 Now, P(Yes|Rainy) = 0.222*0.64/0.36 = 0.39 which is lower probability which means chances of the match played is low.

Para más referencia consulte este blog.

Consulte GitHub Repository Naive-Bayes-Examples