Tue. Oct 4th, 2022

Mejore el clasificador bayesiano simple liberando su suposición ingenua

A pesar de ser muy simples, los clasificadores de Bayes ingenuos tienden a funcionar decentemente en algunas aplicaciones del mundo real, como la clasificación de documentos o el filtrado de spam. No necesitan muchos datos de entrenamiento y son muy rápidos. Como resultado, a menudo se adoptan como líneas de base simples para las tareas de clasificación. Lo que muchos no saben es que podemos hacerlos mucho menos ingenuos con un simple truco.Naive Bayes es un algoritmo probabilístico simple que hace uso del Teorema de Bayes, de ahí el nombre. El teorema de Bayes es una regla matemática simple que nos dice cómo llegar de P(B|A) a P(A|B). Si conocemos la probabilidad de algo dada otra cosa, podemos revertirla siguiendo esta simple ecuación:Teorema de Bayes Si necesita un repaso de la notación probabilística anterior, no dude en desviarse a este artículo introductorio sobre el tema. El algoritmo Naive Bayes utiliza el Teorema de Bayes de una manera muy sencilla. Utiliza los datos de entrenamiento para calcular la distribución de probabilidad de cada característica dados los objetivos y luego, según el teorema, obtiene lo contrario: la probabilidad del objetivo, dadas las características. Esto es suficiente para predecir las probabilidades de clase de nuevos datos una vez que tengamos las características.Veámoslo en acción. Usaremos el infame conjunto de datos Iris en el que la tarea es clasificar las flores en tres especies de iris en función de las medidas de pétalos y sépalos. Para permitir una visualización intuitiva, solo usaremos dos características: longitud del sépalo y longitud del pétalo. Comencemos cargando los datos y reservando una parte de ellos para probarlos más tarde. Ahora implementemos el algoritmo Naive Bayes. Lo haremos desde cero en lugar de usar una implementación de scikit-learn lista para que podamos desarrollarla más tarde para agregar fácilmente funciones que faltan en sklearn. Usaremos el paqueteempiristist para hacerlo. Es una pequeña herramienta agradable construida sobre pandas que nos permite definir fácilmente y hacer cálculos sobre distribuciones de probabilidad. Si tiene curiosidad, he escrito más sobre esto aquí. Primero, debemos comenzar con una creencia previa sobre las especies de iris. Digamos que es igualmente probable que una flor sea cualquiera de las tres especies antes de que veamos sus medidas.>> anterior
0 0.333333
1 0.333333
2 0.333333
Nombre: , dtype: float64Implementaremos una versión popular del clasificador Naive Bayes conocido como Gaussian Naive Bayes. Asume que cada característica se distribuye normalmente dado el destino, o que dentro de cada clase de destino, cada característica puede describirse mediante una distribución normal. Estimaremos los parámetros de estas distribuciones a partir de los datos de entrenamiento: simplemente necesitamos agrupar los datos por objetivo y calcular la media y la desviación estándar de ambas características para cada clase. Esto nos permite mapear cada combinación de clases de características a una distribución normal parametrizada.>> normales
[{0: <scipy.stats._distn_infrastructure.rv_frozen at 0x136d2be20>,
1: <scipy.stats._distn_infrastructure.rv_frozen at 0x136d07a60>,
2: <scipy.stats._distn_infrastructure.rv_frozen at 0x136cfe1c0>},
{0: <scipy.stats._distn_infrastructure.rv_frozen at 0x136d07a90>,
1: <scipy.stats._distn_infrastructure.rv_frozen at 0x136cda940>,
2: <scipy.stats._distn_infrastructure.rv_frozen at 0x136be3790>}]Tenemos dos diccionarios, cada uno con tres distribuciones normales. El primer diccionario describe las distribuciones de longitud de los sépalos para cada clase objetivo, mientras que el segundo se ocupa de la longitud de los pétalos. Ahora podemos definir las funciones para actualizar nuestro anterior en función de los datos. update_iris() toma el valor de la característica anterior y el diccionario de distribuciones normales correspondientes a esta característica como entradas y calcula la probabilidad para cada clase usando la distribución normal apropiada. Luego, multiplica el anterior con la probabilidad de acuerdo con la fórmula de Bayes para obtener el posterior.update_naive() itera sobre las dos funciones que estamos usando y ejecuta la actualización para cada una de ellas. Ahora podemos iterar sobre el conjunto de prueba y clasificar todo los ejemplos de prueba. Note que las distribuciones normales que estamos usando tienen sus parámetros estimados en base a los datos de entrenamiento. Finalmente, calculemos la precisión en el conjunto de prueba.>> acc
0,9333333333333333 Tenemos una precisión de prueba del 93,3 %. Solo para asegurarnos de que tenemos el algoritmo correcto, comparémoslo con la implementación de scikit-learn.>> acc_sklearn
0.93333333333333333Naive Bayes asume la independencia condicional entre cada par de características dado el objetivo. En pocas palabras, supone que dentro de cada clase, las características no están correlacionadas entre sí. Esto como una suposición fuerte y bastante ingenua. Piense en nuestras flores de iris: no es descabellado esperar que las flores más grandes tengan un sépalo y un pétalo más largos al mismo tiempo. De hecho, la correlación entre las dos características en nuestros datos de entrenamiento es del 88 %. Veamos, echemos un vistazo al diagrama de dispersión de los datos de entrenamiento.Correlación entre características de entrenamiento. Imagen del autor. Parece que para dos de las tres especies de iris, las longitudes de los pétalos y los sépalos muestran una fuerte correlación. Pero nuestro algoritmo ingenuo ignora esta correlación y modela cada característica como distribuida normalmente, independientemente de la otra característica. Para hacer este concepto más visual, mostremos los contornos de estas tres distribuciones conjuntas normales de las características, una para cada clase.Supuestas distribuciones normales independientes. Imagen del autor. Los contornos están alineados con los ejes de la trama, lo que indica la supuesta falta de correlación entre las dos características. ¡La suposición ingenua de Naive Bayes claramente no es válida para el iris versicolor y el iris virginica!Hasta ahora, hemos asumido que cada característica tiene una distribución normal y hemos estimado las medias y las desviaciones estándar de estas distribuciones como las medias y las desviaciones estándar de las características correspondientes dentro de cada clase. La idea puede extenderse simplemente para explicar la correlación entre las características. En lugar de definir dos distribuciones normales separadas para cada una de las dos características, podríamos definir su distribución conjunta con alguna covarianza positiva, indicando la correlación. Una vez más, podemos usar la covarianza de los datos de entrenamiento como una estimación.>> multi_normals
{0: ,
1: ,
2: } El código anterior es muy similar al anterior. Para cada clase, hemos definido una distribución normal multivariante parametrizada con la media y la covarianza de los datos de entrenamiento. Superpongamos los contornos de estas distribuciones en nuestro gráfico de dispersión.Parece que estas distribuciones se ajustan mejor a los datos. Una vez más, podemos iterar sobre el conjunto de prueba y clasificar todos los ejemplos de prueba con un nuevo modelo basado en la distribución normal multivariante conjunta para las características dadas el objetivo. Tenga en cuenta que esta vez, en lugar de usar update_naive(), usamos update_iris() directamente. La única diferencia es que le estamos pasando una única normal multivariada en lugar de llamarla dos veces con dos normales independientes univariadas.>> acc
0.9666666666666667Hemos logrado mejorar la precisión en 3,3 puntos porcentuales. Sin embargo, el punto principal es que podemos deshacernos de la suposición de independencia ingenua de Naive Bayes y, con suerte, hacer que se ajuste mejor a los datos de una manera muy simple. Este enfoque no está disponible en scikit-learn, pero siéntase libre de usar mi implementación simple definido a continuación. Y aquí está cómo usarlo.>> acc
0.9666666666666667Si te ha gustado este post, ¿por qué no? suscríbase para recibir actualizaciones por correo electrónico en mis nuevos artículos? Y por convertirse en un miembro medio, puede apoyar mi escritura y obtener acceso ilimitado a todas las historias de otros autores y mías. ¿Necesita consultoría? Puedes preguntarme cualquier cosa o reservarme para un 1: 1 aquí.También puedes probar uno de mis otros artículos. ¿No puedes elegir? Elige uno de estos: