Cómo desarrollar un clasificador Bayes ingenuo desde cero en Python

Tweet Share Share

última actualización el 10 de enero de 2020

La clasificación es un problema de modelado predictivo que implica asignar una etiqueta a una muestra de datos de entrada dada.

el problema del modelado predictivo de clasificación se puede enmarcar como el cálculo de la probabilidad condicional de una etiqueta de clase dada una muestra de datos., El Teorema de Bayes proporciona una forma de principio para calcular esta probabilidad condicional, aunque en la práctica requiere un enorme número de muestras (conjunto de datos de gran tamaño) y es computacionalmente caro.

en su lugar, el cálculo del teorema de Bayes se puede simplificar haciendo algunas suposiciones, como que cada variable de entrada es independiente de todas las demás variables de entrada. Aunque es una suposición dramática y poco realista, esto tiene el efecto de hacer que los cálculos de la probabilidad condicional sean manejables y resulta en un modelo de clasificación efectivo conocido como Bayes ingenuo.,

en este tutorial, descubrirá el algoritmo Bayes ingenuo para el modelado predictivo de clasificación.

Después de completar este tutorial, sabrá:

  • cómo enmarcar el modelado predictivo de clasificación como un modelo de probabilidad condicional.
  • Cómo usar el Teorema de Bayes para resolver el modelo de probabilidad condicional de clasificación.
  • Cómo implementar el Teorema de Bayes simplificado para la clasificación, llamado algoritmo de Bayes ingenuo.,

inicia tu proyecto con My new book Probability for Machine Learning, que incluye tutoriales paso a paso y los archivos de código fuente de Python para todos los ejemplos.

comencemos.

  • actualizado en octubre de 2019: solucionado un problema de inconsistencia menor en notación matemática.
  • actualización ENE / 2020: actualizada para cambios en la API scikit-learn v0.22.

Cómo desarrollar un clasificador Bayes ingenuo desde cero en Python
foto de Ryan Dickey, algunos derechos reservados.,

resumen del Tutorial

este tutorial se divide en cinco partes; son:

  1. Modelo de probabilidad condicional de clasificación
  2. Bayes simplificado o ingenuo
  3. Cómo calcular las probabilidades previas y condicionales
  4. Ejemplo trabajado de Bayes ingenuo
  5. 5 consejos al usar Bayes ingenuo

modelo de probabilidad condicional de clasificación

en el aprendizaje automático, a menudo estamos interesados en un problema de modelado predictivo donde queremos predecir una etiqueta de clase para una observación dada., Por ejemplo, clasificar las especies de plantas en función de las medidas de la flor.

Los problemas de este tipo se conocen como problemas de modelado predictivo de clasificación, en oposición a los problemas de regresión que implican predecir un valor numérico. La observación o entrada al modelo se conoce como X y la etiqueta de clase o salida del modelo se conoce como y.

juntos, X e y representan observaciones recogidas del dominio, es decir, una tabla o matriz (columnas y filas o entidades y muestras) de datos de entrenamiento utilizados para adaptarse a un modelo., El modelo debe aprender a asignar ejemplos específicos a etiquetas de clase o y = f (X) que minimicen el error de clasificación incorrecta.

un enfoque para resolver este problema es desarrollar un modelo probabilístico. Desde una perspectiva probabilística, nos interesa estimar la probabilidad condicional de la etiqueta de clase, dada la observación.

por ejemplo, un problema de clasificación puede tener etiquetas de clase k Y1, Y2, variables, YK y N variables de entrada, X1, X2,…, Xn., Podemos calcular la probabilidad condicional para una etiqueta de clase con una instancia dada o conjunto de valores de entrada para cada columna x1, x2, ul, xn de la siguiente manera:

  • P(Yi | x1, x2,., xn)

la probabilidad condicional se puede calcular para cada etiqueta de clase en el problema y la etiqueta con la probabilidad más alta se puede devolver como la clasificación más probable.

la probabilidad condicional se puede calcular usando la probabilidad conjunta, aunque sería intratable. El Teorema de Bayes proporciona una forma de principio para calcular la probabilidad condicional.,

la forma simple del cálculo para el Teorema de Bayes es la siguiente:

  • P(A|B) = P(B|A) * P(A) / P(B)

donde la probabilidad que estamos interesados en calcular P(A|B) se llama la probabilidad posterior y la probabilidad marginal del evento P(A) se llama la anterior.,

podemos enmarcar la clasificación como un problema de clasificación condicional con el Teorema de Bayes de la siguiente manera:

  • P(Yi | x1, x2, x, xn) = P(x1, x2, x, xn | Yi) * P(Yi) / P(x1, x2,…, xn)

El P(Yi) anterior es fácil de estimar a partir de un conjunto de datos, pero la probabilidad condicional de la observación basada en la clase P(x1, x2,…, xn | Yi) no es factible a menos que el número de ejemplos sea extraordinariamente grande, por ejemplo, lo suficientemente grande como para estimar efectivamente la distribución de probabilidad para todas las diferentes combinaciones posibles de valores.,

como tal, la aplicación directa del teorema de Bayes también se vuelve intratable, especialmente a medida que aumenta el número de variables o Características (n).

quiero aprender la probabilidad para el aprendizaje automático

tome mi curso intensivo de correo electrónico gratuito de 7 días ahora (con código de muestra).

Haga clic para inscribirse y también obtenga una versión gratuita en PDF del curso.,

descargue su Mini-Curso Gratuito

Bayes simplificado o ingenuo

la solución para usar el Teorema de Bayes para un modelo de clasificación de probabilidad condicional es simplificar el cálculo.

el Teorema de Bayes asume que cada variable de entrada depende de todas las demás variables. Esta es una causa de complejidad en el cálculo. Podemos eliminar esta suposición y considerar que cada variable de entrada es independiente entre sí.,

esto cambia el modelo de un modelo de probabilidad condicional dependiente a un modelo de probabilidad condicional independiente y simplifica drásticamente el cálculo.

primero, el denominador se elimina del cálculo P (x1, x2, x, xn) ya que es una constante utilizada en el cálculo de la probabilidad condicional de cada clase para una instancia dada y tiene el efecto de normalizar el resultado.,

  • p(Yi | x1, x2, x, xn) = P(x1, x2, ul, xn | Yi) * P(Yi)

a continuación, la probabilidad condicional de todas las variables dada la etiqueta de clase se cambia a probabilidades condicionales separadas de cada valor de variable dada la etiqueta de clase. Estas variables condicionales independientes se multiplican juntas. Por ejemplo:

  • P(yi | x1, x2, …, xn) = P(x1|yi) * P(x2|yi) * … P(xn|yi) * P(yi)

Este cálculo puede ser realizado para cada una de las etiquetas de clase, y la etiqueta con la mayor probabilidad puede ser seleccionado como la clasificación de la instancia dada., Esta regla de decisión se conoce como la regla de decisión máxima a posteriori, o MAP.

esta simplificación del teorema de Bayes es común y ampliamente utilizada para problemas de modelado predictivo de clasificación y generalmente se conoce como Bayes ingenuo.

la palabra «ingenuo «es francesa y típicamente tiene una diéresis (diéresis) sobre la» i», que se omite comúnmente por simplicidad, y» Bayes » está en mayúscula, ya que se llama así por el reverendo Thomas Bayes.,

cómo calcular las probabilidades previas y condicionales

ahora que sabemos lo que es Bayes ingenuo, podemos echar un vistazo más de cerca a cómo calcular los elementos de la ecuación.

el cálculo del P(yi) anterior es sencillo. Se puede estimar dividiendo la frecuencia de las observaciones en el conjunto de datos de entrenamiento que tienen la etiqueta de clase por el número total de ejemplos (filas) en el conjunto de datos de entrenamiento., Por ejemplo:

  • P (Yi) = ejemplos con yi / total Ejemplos

la probabilidad condicional para un valor de entidad dada la etiqueta de clase también se puede estimar a partir de los datos. Específicamente, aquellos ejemplos de datos que pertenecen a una clase dada, y una distribución de datos por variable. Esto significa que si hay k clases y N variables, que K * N diferentes distribuciones de probabilidad deben ser creadas y mantenidas.

se requiere un enfoque diferente dependiendo del tipo de datos de cada entidad., Específicamente, los datos se utilizan para estimar los parámetros de una de las tres distribuciones de probabilidad estándar.

en el caso de variables categóricas, como recuentos o etiquetas, se puede utilizar una distribución multinomial. Si las variables son binarias, como sí/no o Verdadero/Falso, se puede utilizar una distribución binomial. Si una variable es numérica, como una medida, a menudo se utiliza una distribución gaussiana.

  • binario: distribución Binomial.
  • categórico: distribución Multinomial.
  • numérica: distribución gaussiana.,

estas tres distribuciones son tan comunes que la implementación de Bayes ingenua a menudo recibe el nombre de la distribución. Por ejemplo:

  • Binomial Naive Bayes: Naive Bayes que utiliza una distribución binomial.
  • Bayes naive Multinomial: Bayes Naive que utiliza una distribución multinomial.
  • Bayes Naive gaussiano: Bayes Naive que utiliza una distribución gaussiana.

un conjunto de datos con tipos de datos mixtos para las variables de entrada puede requerir la selección de diferentes tipos de distribuciones de datos para cada variable.,

usar una de las tres distribuciones comunes no es obligatorio; por ejemplo, si se sabe que una variable de valor real tiene una distribución específica diferente, como exponencial, entonces esa distribución específica puede usarse en su lugar. Si una variable de valor real no tiene una distribución bien definida, como bimodal o multimodal, entonces se puede usar un estimador de densidad del núcleo para estimar la distribución de probabilidad.

el algoritmo Bayes ingenuo ha demostrado ser efectivo y por lo tanto es popular para tareas de clasificación de texto., Las palabras en un documento pueden ser codificadas como vectores de entrada binarios (word present), count (word occurrence) o frequency (TF/idf) y distribuciones de probabilidad binaria, multinomial o Gaussiana usadas respectivamente.

ejemplo trabajado de Bayes Naive

en esta sección, vamos a hacer el cálculo de Bayes Naive concreto con un pequeño ejemplo en un conjunto de datos de aprendizaje automático.

podemos generar un pequeño problema de clasificación binaria artificial (Clase 2) usando la función make_blobs() de la API scikit-learn.,

el siguiente ejemplo genera 100 ejemplos con dos variables de entrada numéricas, cada una asignada a una de dos clases.

ejecutar el ejemplo genera el conjunto de datos y resume el tamaño, confirmando que el conjunto de datos se generó como se esperaba.

el argumento «random_state» se establece en 1, asegurando que se genere la misma muestra aleatoria de observaciones cada vez que se ejecute el código.

los elementos de entrada y salida de los primeros cinco ejemplos también se imprimen, lo que muestra que, de hecho, las dos variables de entrada son numéricas y las etiquetas de clase son 0 o 1 para cada ejemplo.,

modelaremos las variables numéricas de entrada utilizando una distribución de probabilidad Gaussiana.

esto se puede lograr usando la norma scipy API. Primero, la distribución se puede construir especificando los parámetros de la distribución, por ejemplo, la media y la desviación estándar, luego la función de densidad de probabilidad se puede muestrear para valores específicos utilizando la norma.pdf() función.

podemos estimar los parámetros de la distribución del conjunto de datos utilizando las funciones mean() y std() NumPy.,

la función fit_distribution() a continuación toma una muestra de datos para una variable y ajusta una distribución de datos.

Recordemos que estamos interesados en la probabilidad condicional de cada variable de entrada. Esto significa que necesitamos una distribución para cada una de las variables de entrada, y un conjunto de distribuciones para cada una de las etiquetas de clase, o cuatro distribuciones en total.

primero, debemos dividir los datos en grupos de muestras para cada una de las etiquetas de clase.,

1
2
3
4
5

# ordenar los datos en clases
Xy0 = X
Xy1 = X
print(Xy0.,forma, Xy1.shape)

luego podemos usar estos grupos para calcular las probabilidades previas para una muestra de datos que pertenece a cada grupo.

esto será exactamente del 50% dado que hemos creado el mismo número de ejemplos en cada una de las dos clases; sin embargo, calcularemos estos antecedentes para completar.,

1
2
3
4
5

…,
# calcular los priores
priory0 = len(Xy0) / len(X)
priory1 = len(Xy1) / len(X)
print(priory0, priory1)

por último, podemos llamar a la fit_distribution() función que hemos definido para preparar una distribución de probabilidad para cada variable, para cada clase de etiqueta.

uniendo todo esto, el modelo probabilístico completo del conjunto de datos se muestra a continuación.,

al ejecutar el ejemplo primero se divide el conjunto de datos en dos grupos para las dos etiquetas de clase y se confirma que el tamaño de cada grupo es par y los antecedentes son del 50%.

se preparan distribuciones de probabilidad para cada variable para cada etiqueta de clase y se reportan los parámetros de media y desviación estándar de cada distribución, confirmando que las distribuciones difieren.

a continuación, podemos utilizar el modelo probabilístico preparado para hacer una predicción.,

la probabilidad condicional independiente para cada etiqueta de clase se puede calcular usando el prior para la clase (50%) y la probabilidad condicional del valor para cada variable.

la función probability() a continuación realiza este cálculo para un ejemplo de entrada (matriz de dos valores) dada la distribución de probabilidad previa y condicional para cada variable. El valor devuelto es una puntuación en lugar de una probabilidad, ya que la cantidad no está normalizada, una simplificación que a menudo se realiza al implementar bayes ingenuos.,

Podemos utilizar esta función para calcular la probabilidad de un ejemplo perteneciente a cada clase.

en primer lugar, podemos seleccionar un ejemplo a clasificar; en este caso, el primer ejemplo en el conjunto de datos.,

1
2
3

…,
# clasificar un ejemplo
Xsample, Ysample = X, Y

a continuación, podemos calcular la puntuación del ejemplo perteneciente a la primera clase, luego a la segunda clase, luego reportar los resultados.

la clase con la mayor puntuación será la clasificación resultante.

uniendo esto, el ejemplo completo de ajustar el modelo de Bayes ingenuo y usarlo para hacer una predicción se muestra a continuación.,

ejecutar el ejemplo primero prepara las probabilidades previas y condicionales como antes, luego las usa para hacer una predicción para un ejemplo.

la puntuación del ejemplo perteneciente a y = 0 es aproximadamente 0.3 (recordemos que esta es una probabilidad no normalizada), mientras que la puntuación del ejemplo perteneciente a y=1 es 0.0. Por lo tanto, clasificaríamos el ejemplo como perteneciente a y=0.

en este caso, se conoce el resultado verdadero o real, y = 0, que coincide con la predicción de nuestro modelo de Bayes ingenuo.,

1
2
3

P(y=0 | ) = 0.348
P(y=1 | ) = 0.,000
Truth: y = 0

en la práctica, es una buena idea utilizar implementaciones optimizadas del algoritmo Bayes ingenuo. La biblioteca scikit-learn proporciona tres implementaciones, una para cada una de las tres distribuciones de probabilidad principales; por ejemplo, BernoulliNB, MultinomialNB y GaussianNB para variables de entrada distribuidas binomiales, multinomiales y gaussianas respectivamente.

para usar un modelo scikit-learn Naive Bayes, primero se define el modelo, luego se ajusta al conjunto de datos de entrenamiento., Una vez ajustado, las probabilidades se pueden predecir a través de la función predict_proba() y las etiquetas de clase se pueden predecir directamente a través de la función predict ().

el ejemplo completo de ajustar un modelo gaussiano Naive Bayes (GaussianNB) al mismo conjunto de datos de prueba se muestra a continuación.

ejecutar el ejemplo se ajusta al modelo en el conjunto de datos de entrenamiento, luego hace predicciones para el mismo primer ejemplo que usamos en el ejemplo anterior.

en este caso, la probabilidad de que el ejemplo pertenezca a y = 0 es 1.0 o una certeza. La probabilidad de y=1 es un valor muy pequeño cercano a 0.0.,

finalmente, la etiqueta de clase se predice directamente, de nuevo coincidiendo con la verdad de tierra para el ejemplo.,iv>

1
2
3

Probabilidades pronosticadas: ]
Predicción de la Clase:
la Verdad: y=0

5 Consejos a la hora de Usar Naive Bayes

en Esta sección se enumeran algunos consejos prácticos cuando se trabaja con Bayes Naive de los modelos.,

Use un KDE para distribuciones complejas

si la distribución de probabilidad de una variable es compleja o desconocida, puede ser una buena idea usar un estimador de densidad del núcleo o KDE para aproximar la distribución directamente desde las muestras de datos.

un buen ejemplo sería el KDE gaussiano.

rendimiento disminuido con el aumento de la dependencia Variable

por definición, Naive Bayes asume que las variables de entrada son independientes entre sí.

esto funciona bien la mayor parte del tiempo, incluso cuando algunas o la mayoría de las variables son de hecho dependientes., Sin embargo, el rendimiento del algoritmo se degrada cuanto más dependientes resultan ser las variables de entrada.

Evite el flujo inferior numérico con Log

el cálculo de la probabilidad condicional independiente para un ejemplo para una etiqueta de clase implica multiplicar muchas probabilidades juntas, una para la clase y una para cada variable de entrada. Como tal, la multiplicación de muchos números pequeños juntos puede volverse numéricamente inestable, especialmente a medida que aumenta el número de variables de entrada.,

para superar este problema, es común cambiar el cálculo del producto de probabilidades a la suma de probabilidades de registro. Por ejemplo:

  • P(Yi|x1, x2, …, xn) = log(P(x1|y1)) + log(P(x2|y1)) + log log(P(xn/Y1)) + log(P(Yi))

calcular el logaritmo natural de probabilidades tiene el efecto de crear números más grandes (negativos) y sumar los números significa que las probabilidades más grandes estarán más cerca de cero. Los valores resultantes todavía se pueden comparar y maximizar para dar la etiqueta de clase más probable.,

esto a menudo se llama el log-trick cuando se multiplican las probabilidades.

actualizar distribuciones de probabilidad

a medida que se dispone de nuevos datos, puede ser relativamente sencillo utilizar estos nuevos datos con los datos antiguos para actualizar las estimaciones de los parámetros para la distribución de probabilidad de cada variable.

esto permite que el modelo utilice fácilmente nuevos datos o las distribuciones cambiantes de datos a lo largo del tiempo.

Use como modelo generativo

las distribuciones de probabilidad resumirán la probabilidad condicional de cada valor de variable de entrada para cada etiqueta de clase.,

estas distribuciones de probabilidad pueden ser útiles de manera más general más allá de su uso en un modelo de clasificación.

por ejemplo, las distribuciones de probabilidad preparadas se pueden muestrear aleatoriamente para crear nuevas instancias de datos plausibles. La suposición de independencia condicional asumida puede significar que los ejemplos son más o menos plausibles basados en cuánta interdependencia real existe entre las variables de entrada en el conjunto de datos.

más información

esta sección proporciona más recursos sobre el tema si desea profundizar.,

tutoriales

  • Naive Bayes Tutorial for Machine Learning
  • Naive Bayes for Machine Learning
  • Better Naive Bayes: 12 Consejos para aprovechar al máximo el algoritmo Naive Bayes

Books

  • Machine Learning, 1997.
  • Machine Learning: a Probabilistic Perspective, 2012.
  • reconocimiento de patrones y aprendizaje automático, 2006.
  • Data Mining: Practical Machine Learning Tools and Techniques, 4th edition, 2016.

API

Artículos

  • teorema de Bayes, la Wikipedia.
  • Naive Bayes classifier, Wikipedia.,
  • estimación máxima a posteriori, Wikipedia.

resumen

en este tutorial, descubrió el algoritmo Bayes ingenuo para el modelado predictivo de clasificación.

Específicamente, aprendiste:

  • cómo enmarcar el modelado predictivo de clasificación como un modelo de probabilidad condicional.
  • Cómo usar el Teorema de Bayes para resolver el modelo de probabilidad condicional de clasificación.
  • Cómo implementar el Teorema de Bayes simplificado para la clasificación llamado algoritmo de Bayes ingenuo.

¿tiene alguna pregunta?,Haga sus preguntas en los comentarios a continuación y haré mi mejor esfuerzo para responder.

Conseguir una Manija en la Probabilidad para el Aprendizaje de Máquina!

desarrolle su comprensión de la probabilidad

…con solo unas pocas líneas de código python

descubre cómo en mi nuevo Ebook:
probabilidad para aprendizaje automático

proporciona tutoriales de autoaprendizaje y proyectos de extremo a extremo sobre:
Teorema de Bayes, optimización Bayesiana, distribuciones, máxima verosimilitud, entropía cruzada, modelos de calibración
y mucho más…,

finalmente aprovecha la incertidumbre en tus proyectos

Sáltate lo académico. Sólo Resultados.Ver Lo que está Dentro de

Tweet Compartir Compartir

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *