{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introducción a la inferencia Bayesiana con Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Esta notebook fue creada originalmente como un blog post por [Raúl E. López Briega](http://relopezbriega.com.ar/) en [Matemáticas, análisis de datos y python](http://relopezbriega.github.io). El contenido esta bajo la licencia BSD.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"Teorema" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> \"Las preguntas más importantes de la vida son, en su mayor parte, nada más que problemas de probabilidad.\"\n", "\n", "***[Pierre-Simon Lapace](https://es.wikipedia.org/wiki/Pierre-Simon_Laplace)***\n", "\n", "## Introducción: La incertidumbre y el problema de la inducción\n", "\n", "¿Cómo se deben evaluar las hipótesis?¿Cuál es el papel de la evidencia en este proceso?¿Cuáles son los experimentos que debemos realizar para obtener la mayor información posible?. Éstas son preguntas que están en los cimientos de toda búsqueda científica. \n", "Las hipótesis científicas tienen un carácter general en relación con las observaciones empíricas que se supone deben explicar, teniendo implicaciones sobre fenómenos y acontecimientos que no podemos encontrar en ninguna evidencia real. Existe, por lo tanto, un vacío lógico entre la información derivada de la observación empírica y el contenido de nuestras teorías científicas. ¿Cómo, entonces, esta información nos da una confianza razonable en esas teorías? Éste, es el tradicional [problema de la inducción](https://es.wikipedia.org/wiki/Problema_de_la_inducci%C3%B3n).\n", "\n", "[David Hume](https://es.wikipedia.org/wiki/David_Hume), demostró correctamente, que partiendo solamente de las evidencias del pasado y del presente, no podemos inferir con seguridad nada sobre el futuro. Que hayamos visto solamente miles de cisnes blancos, no quiere decir que todos los cisnes sean blancos; siempre existirá la *posibilidad* de que podamos encontrar un cisne negro que *falsifique* toda nuestra teoría. Este problema, hace que en esencia todas las teorías tengan un carácter [probabilístico](relopezbriega.github.io/blog/2016/11/26/introduccion-a-la-teoria-de-probabilidad-con-python/). \n", "Desde hace ya tiempo se considera que las teorías científicas se extienden más allá de cualquier dato experimental y por lo tanto no pueden ser verificadas (es decir, logicamente implicadas) por ellos. Si bien existe un consenso en que la certeza absoluta no puede ser nunca alcanzable; la mayoría de los científicos coinciden en que las teorías pueden alcanzar un estado intermedio entre la certeza absoluta y la falsificación; el cual dependerá de la calidad de las observaciones y de cómo la teoría se ve afectada por nuevas evidencias. Desde esta perspectiva, entonces la pregunta crucial pasa a ser ¿cómo adaptamos nuestras creencias a medida que vamos incorporando nuevas evidencias sobre nuestras teorías? la respuesta a esta pregunta, la podemos encontrar en el [teorema de Bayes](https://es.wikipedia.org/wiki/Teorema_de_Bayes).\n", "\n", "\n", "## El Teorema de Bayes\n", "\n", "[Thomas Bayes](https://es.wikipedia.org/wiki/Thomas_Bayes) fue un ministro presbiteriano y matemático inglés que estudió la relación íntima que existe entre la [probabilidad](http://relopezbriega.github.io/blog/2016/11/26/introduccion-a-la-teoria-de-probabilidad-con-python/), la predicción y el progreso científico. Su trabajo se centró principalmente en cómo formulamos nuestras creencias probabilísticas sobre el mundo que nos rodea cuando nos encontramos con nuevos datos o evidencias. El argumento de [Bayes](https://es.wikipedia.org/wiki/Thomas_Bayes) no es que el mundo es intrínsecamente probabilístico o incierto, ya que él era un creyente en la divina perfección; sino que aprendemos sobre el mundo a través de la aproximación, acercándonos cada vez más a la verdad a medida que recogemos más evidencias. Este argumento lo expresó matemáticamente a través de su famoso [teorema](https://es.wikipedia.org/wiki/Teorema_de_Bayes):\n", "\n", "\n", "$$P(H|D) = \\frac{P(D|H)P(H)}{P(D)}\n", "$$\n", "\n", "\n", "En donde:\n", "\n", "* $P(H)$ es el **[a priori](https://es.wikipedia.org/wiki/Probabilidad_a_priori)**, la forma de introducir conocimiento previo sobre los valores que puede tomar la hipótesis. A veces cuando no sabemos demasiado se suelen usar *a prioris* que asignan igual probabilidad a todos los valores de la hipótesis; otras veces se puede elegir *a prioris* que restrinjan los valores a rangos razonables, por ejemplo solo valores positivos; y otras veces contamos con información mucho más precisa, como experimentos previos o límites impuesto por alguna teoría.\n", "\n", "\n", "* $P(D|H)$ es el **likelihood**, la forma de incluir nuestros datos en el análisis. Es una expresión matemática que especifica la plausibilidad de los datos. A medida que la cantidad de datos aumenta, el *likelihood* tiene cada vez más peso en los resultados. Debemos tener en cuenta que si bien el *likelihood* se asemeja a una *probabilidad*, en realidad no lo es; el *likelihood* de una hipótesis $H$, dados los datos $D$ va a ser proporcional a la *probabilidad* de obtener $D$ dado que $H$ es verdadera. Como el *likelihood* no es una *probabilidad* tampoco tiene que respetar las leyes de las probabilidades y por lo tanto no necesariamente tiene que sumar 1.\n", "\n", "\n", "* $P(H|D)$ es el **[a posteriori](https://es.wikipedia.org/wiki/Probabilidad_a_posteriori)**, la [distribución de probabilidad](http://relopezbriega.github.io/blog/2016/06/29/distribuciones-de-probabilidad-con-python/) final para la hipótesis. Es la consecuencia lógica de haber usado un conjunto de datos, un *likelihood* y un *a priori*. Se lo suele pensar como la versión actualizada del *a priori* luego de que hemos agregado los datos adicionales.\n", "\n", "\n", "* $P(D)$ es el **likelihood marginal** o **evidencia**, la probabilidad de observar los datos $D$ promediado sobre todas las posibles hipótesis $H$. En general, la *evidencia* puede ser vista como una simple constante de normalización que en la mayoría de los problemas prácticos puede omitirse sin demasiada perdida de generalidad. \n", "\n", "Si los fundamentos filosóficos del [teorema de Bayes](https://es.wikipedia.org/wiki/Teorema_de_Bayes) son sorprendentemente ricos, sus matemáticas son increíblemente simples. En su forma más básica, no es más que una expresión algebraica con tres variables conocidas y una incógnita; y que trabaja con [probabilidades condicionales](https://es.wikipedia.org/wiki/Probabilidad_condicionada); nos dice la probabilidad de que una hipótesis $H$ sea verdadera si algún evento $D$ ha sucedido. El [teorema de Bayes](https://es.wikipedia.org/wiki/Teorema_de_Bayes) es útil porque lo que normalmente sabemos es la [probabilidad](http://relopezbriega.github.io/blog/2016/11/26/introduccion-a-la-teoria-de-probabilidad-con-python/) de los efectos dados las causas, pero lo que queremos saber es la [probabilidad](http://relopezbriega.github.io/blog/2016/11/26/introduccion-a-la-teoria-de-probabilidad-con-python/) de las causas dadas los efectos. Por ejemplo, podemos saber cual es el porcentaje de pacientes con gripe que tiene fiebre, pero lo que realmente queremos saber es la probabilidad de que un paciente con fiebre tenga gripe. El [teorema de Bayes](https://es.wikipedia.org/wiki/Teorema_de_Bayes) nos permite ir de uno a otro con suma facilidad.\n", "\n", "## La inferencia Bayesiana\n", "\n", "Toda forma de [inferencia](https://es.wikipedia.org/wiki/Inferencia) que realicemos sobre el mundo que nos rodea, debe indefectiblemente lidiar con la *incertidumbre*. Existen por lo menos, tres tipos de *incertidumbre* con la que nos debemos enfrentar:\n", "\n", "* **Ignorancia**, los límites de nuestro conocimiento nos llevan a ser ignorantes sobre muchas cosas. \n", "* **Aleatoriedad**, es imposible negar la influencia del azar en casi todo lo que nos rodea; incluso aunque podamos saber todo sobre una moneda y la forma de lanzarla, es imposible predecir con anterioridad si va a caer cara o seca.\n", "* **Vaguedad**, muchos de los conceptos que utilizamos en nuestro pensamiento tienen cierto grado de subjetividad en su definición. ¿cómo calificaríamos si una persona es valiente o no?. Cada uno de nosotros puede tener una apreciación diferente del concepto de valentía.\n", "\n", "La [inferencia bayesiana](https://es.wikipedia.org/wiki/Inferencia_bayesiana) es la filosofía que afirma que para entender la opinión humana como debe ser, limitada por la ignorancia y la incertidumbre; debemos utilizar al [cálculo de probabilidad](http://relopezbriega.github.io/blog/2016/11/26/introduccion-a-la-teoria-de-probabilidad-con-python/) como la herramienta más importante para representar la fortaleza de nuestras creencias.\n", "\n", "En esencia, la [inferencia bayesiana](https://es.wikipedia.org/wiki/Inferencia_bayesiana) combina nuestra experiencia previa, en la forma de la *probabilidad [a priori](https://es.wikipedia.org/wiki/Probabilidad_a_priori)*; con los datos observados, en la forma del *likelihood*; para interpretarlos y arribar a una *probabilidad [a posteriori](https://es.wikipedia.org/wiki/Probabilidad_a_posteriori)*. La [inferencia bayesiana](https://es.wikipedia.org/wiki/Inferencia_bayesiana) no nos va a garantizar que podamos alcanzar la respuesta correcta. En su lugar, nos va a proporcionar la [probabilidad](http://relopezbriega.github.io/blog/2016/11/26/introduccion-a-la-teoria-de-probabilidad-con-python/) de que cada una de un número de respuestas alternativas, sea verdadera. Y luego podemos utilizar esta información para encontrar la respuesta que más probablemente sea la correcta. En otras palabras, nos proporciona un mecanismo para hacer una especie de *adivinación basada en información*.\n", "\n", "\n", "### Bayes en el diagnostico médico\n", "\n", "Para que quede más claro, ilustremos la aplicación de la [inferencia bayesiana](https://es.wikipedia.org/wiki/Inferencia_bayesiana) con un simple ejemplo del diagnostico médico, uno de los campos dónde más éxito ha tenido. Supongamos que nos hicimos un estudio y nos ha dado positivo para una rara enfermedad que solo el 0.3 % de la población tiene. La tasa de efectividad de este estudio es del 99 %, es decir, que solo da [falsos positivos](https://es.wikipedia.org/wiki/Errores_de_tipo_I_y_de_tipo_II) en el 1 % de los casos. ¿Cuán probable es que realmente tengamos la enfermedad?. \n", "\n", "En un principio, nos veríamos tentados a responder que hay un 99 % de probabilidad de que tengamos la enfermedad; pero en este caso nos estaríamos olvidando del concepto importante del *[a priori](https://es.wikipedia.org/wiki/Probabilidad_a_priori)*. Sabemos con anterioridad que la enfermedad es extremadamente rara (solo el 0.3 % la tiene); si incluimos esta información previa en nuestro cálculo de probabilidad y aplicamos el [teorema de Bayes](https://es.wikipedia.org/wiki/Teorema_de_Bayes) podemos llegar a una conclusión totalmente distinta.\n", "\n", "$$ P(\\text{ enfermedad | pos}) = \\frac{P(\\text{ pos | enfermedad})P( \\text{enfermedad})}{P(\\text{pos})}$$\n", "\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.297" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Ejemplo simple teorema de Bayes aplicado a estimación de un sólo parámetro.\n", "a_priori = 0.003\n", "likelihood = 0.99\n", "evidencia = 0.01\n", "\n", "a_posteriori = likelihood * a_priori / evidencia\n", "a_posteriori" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como vemos, luego de aplicar el [teorema de Bayes](https://es.wikipedia.org/wiki/Teorema_de_Bayes) llegamos a la conclusión de que en realidad nuestra probabilidad de estar realmente enfermo es de sólo 30 % y no de 99 %, ya que podemos ser uno de los [falsos positivos](https://es.wikipedia.org/wiki/Errores_de_tipo_I_y_de_tipo_II) del estudio y la enfermedad es realmente muy rara. Como este ejemplo demuestra, la inclusión del *[a priori](https://es.wikipedia.org/wiki/Probabilidad_a_priori)* es sumamente importante para la [inferencia bayesiana](https://es.wikipedia.org/wiki/Inferencia_bayesiana), por lo cual también debemos ser sumamente cuidadosos a la hora de elegirla. **Cuando nuestra *[a priori](https://es.wikipedia.org/wiki/Probabilidad_a_priori)* es fuerte, puede ser sorprendentemente resistente frente a nuevas evidencias.**\n", "\n", "## Redes Bayesianas\n", "\n", "El [teorema de Bayes](https://es.wikipedia.org/wiki/Teorema_de_Bayes) nos permite actualizar las probabilidades de variables cuyo estado no hemos observado dada una serie de nuevas observaciones. Las [redes bayesianas](https://es.wikipedia.org/wiki/Red_bayesiana) automatizan este proceso, permitiendo que el razonamiento avance en cualquier dirección a través de la red de variables. Las [redes bayesianas](https://es.wikipedia.org/wiki/Red_bayesiana) están constituidas por una estructura en forma de [grafo](https://es.wikipedia.org/wiki/Grafo), en la que cada nodo representa [variables aleatorias](https://es.wikipedia.org/wiki/Variable_aleatoria) (discretas o continuas) y cada arista representa las conexiones directas entre ellas. Estas conexiones suelen representar relaciones de causalidad. Adicionalmente, las [redes bayesianas](https://es.wikipedia.org/wiki/Red_bayesiana) también modelan el peso cuantitativo de las conexiones entre las variables, permitiendo que las *creencias probabilísticas* sobre ellas se actualicen automáticamente a medida que se disponga de nueva información.\n", "Al construir una [red bayesiana](https://es.wikipedia.org/wiki/Red_bayesiana), los principales problemas de modelización que surgen son:\n", "1. ¿Cuáles son las variables? ¿Cuáles son sus valores / estados?\n", "2. ¿Cuál es la estructura del [grafo](https://es.wikipedia.org/wiki/Grafo)?\n", "3. ¿Cuáles son los parámetros (probabilidades)?\n", "\n", "Profundicemos un poco en cada uno de estos puntos.\n", "\n", "### Nodos y variables\n", "Lo primero que debemos hacer es identificar las variables de interés. Sus valores deben ser mutuamente excluyentes y exhaustivos. Los tipos de nodos discretos más comunes son:\n", "\n", "* **Nodos booleanos**, que representan proposiciones tomando los valores binarios Verdadero (V) y Falso (F). En el dominio del diagnóstico médico, por ejemplo, un nodo llamado \"Cáncer\" podría representar la proposición del que paciente tenga cáncer. \n", "* **Valores ordenados** Por ejemplo, un nodo \"Contaminación\" podría representar la exposición de un paciente a la contaminación del ambiente y tomar los valores {alta, baja}.\n", "* **Valores enteros**. Por ejemplo, un nodo llamado \"Edad\" puede representar la edad de un paciente y tener valores posibles de 1 a 120. \n", "\n", "Lo importante es elegir valores que representen el dominio de manera eficiente, pero con suficiente detalle para realizar el razonamiento requerido.\n", "\n", "### Estructura\n", "La estructura o topología de la [red](https://es.wikipedia.org/wiki/Red_bayesiana) debe captar las relaciones cualitativas entre las variables. En particular, dos nodos deben conectarse directamente si uno afecta o causa al otro, con la arista indicando la dirección del efecto. Por lo tanto, en nuestro ejemplo de diagnóstico médico, podríamos preguntarnos qué factores afectan la probabilidad de tener cáncer. Si la respuesta es \"Contaminación y Fumar\", entonces deberíamos agregar aristas desde \"Contaminación\" y desde \"Fumador\" hacia el nodo \"Cáncer\". Del mismo modo, tener cáncer afectará la respiración del paciente y las posibilidades de tener un resultado positivo de rayos X. Por lo tanto, también podemos agregar aristas de \"Cáncer\" a \"Disnea\" y \"RayosX\".\n", "\n", "Es deseable construir [redes bayesianas](https://es.wikipedia.org/wiki/Red_bayesiana) lo más compactas posibles por tres razones. Primero, mientras más compacto es el *modelo*, es más fácil de manejar. Segundo, cuando las redes se vuelven demasiado densas, fallan en representar la independencia en forma explícita. Y Tercero, las redes excesivamente densas no suelen representar las dependencias causales del dominio.\n", "\n", "### Probabilidades condicionales\n", "Una vez que tenemos definida la estructura de la [red bayesiana](https://es.wikipedia.org/wiki/Red_bayesiana), el siguiente paso es cuantificar las relaciones entre los nodos interconectados; esto se hace especificando una [probabilidad condicional](https://es.wikipedia.org/wiki/Probabilidad_condicionada) para cada nodo. \n", "Primero, para cada nodo necesitamos mirar todas las posibles combinaciones de valores de los nodos padres. \n", "Por ejemplo, continuando con el ejemplo del diagnostico del cáncer, si tomamos el nodo \"Cáncer\" con sus dos nodos padres \"Contaminación\" y \"Fumador\" podemos calcular los posibles valores conjuntos { (A, V), (A, F), (B, V), (B, F)}. La tabla de probabilidad condicional especifica para cada uno de estos casos podría ser la siguiente: {0,05, 0,02, 0,03, 0,001}. Con estos datos, ya estamos en condiciones de representar el [grafo](https://es.wikipedia.org/wiki/Grafo) de la [red bayesiana](https://es.wikipedia.org/wiki/Red_bayesiana) de nuestro ejemplo.\n", "\n", "\"Red\n", "\n", "### Razonando con redes Bayesianas\n", "La tarea básica de cualquier sistema de [inferencia probabilística](https://es.wikipedia.org/wiki/Inferencia) es la de obtener la [distribución](http://relopezbriega.github.io/blog/2016/06/29/distribuciones-de-probabilidad-con-python/) [a posteriori](https://es.wikipedia.org/wiki/Probabilidad_a_posteriori) para cada conjunto de nodos. Esta tarea se llama *actualización de creencia* o [inferencia probabilística](https://es.wikipedia.org/wiki/Inferencia). En el caso de las [redes bayesianas](https://es.wikipedia.org/wiki/Red_bayesiana), el proceso de [inferencia](https://es.wikipedia.org/wiki/Inferencia) es muy flexible, nueva evidencia puede ser introducida en cualquiera de los nodos mientras que las *creencias* son actualizadas en cualquiera de los otros nodos. En la práctica, la velocidad del proceso de inferencia va a depender de la estructura y complejidad de la red.\n", "\n", "\n", "## Programación probabilística y PyMC3\n", "\n", "A pesar de que las [redes bayesianas](https://es.wikipedia.org/wiki/Red_bayesiana) y demás modelos de [inferencia bayesiana](https://es.wikipedia.org/wiki/Inferencia_bayesiana) son conceptualmente simples; a menudo los cálculos de sus probabilidades conducen a expresiones que no se pueden resolver en forma analítica. Durante muchos años, este fue un gran problema y fue probablemente una de las principales razones que obstaculizaron la adopción de los métodos bayesianos. La llegada de las computadoras y el desarrollo de métodos numéricos que se pueden aplicar para calcular la distribución *[a posteriori](https://es.wikipedia.org/wiki/Probabilidad_a_posteriori)* de casi cualquier modelo, junto con el avance en las técnicas de muestreo de los [métodos de Monte-Carlo](http://relopezbriega.github.io/blog/2017/01/10/introduccion-a-los-metodos-de-monte-carlo-con-python/); han transformado completamente la práctica del [análisis de datos](http://relopezbriega.github.io/category/analisis-de-datos.html) Bayesiano. \n", "\n", "La posibilidad de automatizar la [inferencia probabilística](https://es.wikipedia.org/wiki/Inferencia) ha conducido al desarrollo de la [Programación probabilística](https://en.wikipedia.org/wiki/Probabilistic_programming_language), la cuál utiliza las ventajas de los lenguajes de programación modernos y nos permite realizar una clara separación entre la creación del modelo y el proceso de [inferencia](https://es.wikipedia.org/wiki/Inferencia). En [Programación probabilística](https://en.wikipedia.org/wiki/Probabilistic_programming_language), especificamos un modelo probabilístico completo escribiendo unos cuantos líneas de código y luego la inferencia se realiza en forma automática. \n", "\n", "### PyMC3\n", "\n", "[PyMC3](https://pymc-devs.github.io/pymc3/index.html) es un paquete para [Programación probabilística](https://en.wikipedia.org/wiki/Probabilistic_programming_language) que utiliza el lenguaje de programación [Python](http://python.org/). [PyMC3](https://pymc-devs.github.io/pymc3/index.html) es lo suficientemente maduro para resolver muchos de los principales problemas estadísticos. Permite crear modelos probabilísticos usando una sintaxis intuitiva y fácil de leer que es muy similar a la sintaxis usada para describir modelos probabilísticos.\n", "\n", "Veamos algunos ejemplos:\n", "\n", "#### El problema de la moneda\n", "Los problemas de monedas son clásicos cuando hablamos de [probabilidad y estadística](http://relopezbriega.github.io/category/pobabilidad-y-estadistica.html), nos permiten ejemplificar conceptos abstractos de forma simple. Asimismo, pueden ser muchas veces conceptualmente similares a situaciones *reales*, de hecho cualquier problema en donde obtengamos resultados binarios, 0/1, enfermo/sano, spam/no-spam, puede ser pensado como si estuviéramos hablando de monedas. \n", "En este caso, la idea es utilizar un modelo [bayesiano](https://es.wikipedia.org/wiki/Inferencia_bayesiana) para inferir si la moneda se encuentra sesgada o no.\n", "\n", "Para este ejemplo, vamos a utilizar una [distribución binomial](https://es.wikipedia.org/wiki/Distribuci%C3%B3n_binomial) como *likelihood* y una [distribución beta](https://es.wikipedia.org/wiki/Distribuci%C3%B3n_beta) como *[a priori](https://es.wikipedia.org/wiki/Probabilidad_a_priori)*. Veamos como lo podemos modelar con [PyMC3](https://pymc-devs.github.io/pymc3/index.html)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# \n", "# importando modulos necesarios\n", "import matplotlib.pyplot as plt \n", "import numpy as np \n", "import pandas as pd\n", "import scipy.stats as stats\n", "import seaborn as sns\n", "import pymc3 as pm\n", "import theano.tensor as tt\n", "from sklearn import datasets\n", "from sklearn.naive_bayes import GaussianNB\n", "from sklearn.metrics import confusion_matrix\n", "from sklearn.model_selection import train_test_split\n", "\n", "np.random.seed(1984) #replicar random\n", "\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# El problema de la moneda\n", "# de 100 lanzamientos 80 caras\n", "n = 100\n", "caras = 80" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Creación del modelo\n", "niter = 2000\n", "with pm.Model() as modelo_moneda:\n", " # a priori\n", " p = pm.Beta('p', alpha=2, beta=2)\n", " # likelihood\n", " y = pm.Binomial('y', n=n, p=p, observed=caras)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Auto-assigning NUTS sampler...\n", "Initializing NUTS using advi...\n", "Average ELBO = -4.656: 100%|██████████| 200000/200000 [00:19<00:00, 10433.82it/s] \n", "Finished [100%]: Average ELBO = -4.639\n", "WARNING (theano.tensor.blas): We did not found a dynamic library into the library_dir of the library we use for blas. If you use ATLAS, make sure to compile it with dynamics library.\n", "100%|██████████| 2000/2000 [00:08<00:00, 226.40it/s]\n" ] } ], "source": [ "# Realizando el muestreo para la inferencia\n", "with modelo_moneda:\n", " trace = pm.sample(niter, njobs=4)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Analizando los resultados\n", "pm.traceplot(trace, varnames=['p'], lines={'p':.8})\n", "pass" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "p:\n", "\n", " Mean SD MC Error 95% HPD interval\n", " -------------------------------------------------------------------\n", " \n", " 0.789 0.040 0.001 [0.706, 0.864]\n", "\n", " Posterior quantiles:\n", " 2.5 25 50 75 97.5\n", " |--------------|==============|==============|--------------|\n", " \n", " 0.701 0.764 0.791 0.816 0.861\n", "\n" ] } ], "source": [ "# Información resumen. \n", "#Vemos que hay un 95% de probabilidades de que el valor de sesgo este entre\n", "# .706 y .864\n", "pm.summary(trace)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como vemos el modelo nos indica que la moneda parece tener un claro sesgo hacia cara.\n", "\n", "#### El problema de la hierba mojada\n", "Supongamos que hay dos eventos los cuales pueden causar que la hierba esté húmeda: que el rociador esté activado o que esté lloviendo. También supongamos que la lluvia tiene un efecto directo sobre el uso del rociador (usualmente cuando llueve el rociador se encuentra apagado). Entonces la situación puede ser modelada con la siguiente [red bayesiana](https://es.wikipedia.org/wiki/Red_bayesiana).\n", "\n", "\"Red\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " [-----------------100%-----------------] 20000 of 20000 complete in 8.8 sec\n", "Probabilidad de que la hierba este mojada por la lluvia: 0.38355\n", "Probabilidad de que la hierba este mojada por el rociador: 0.62105\n" ] } ], "source": [ "# Problema de la hierba mojada\n", "# https://es.wikipedia.org/wiki/Red_bayesiana#Ejemplo\n", "niter = 10000 # 10000\n", "tune = 5000 # 5000\n", "\n", "modelo = pm.Model()\n", "\n", "with modelo:\n", " tv = [1]\n", " lluvia = pm.Bernoulli('lluvia', 0.2, shape=1, testval=tv)\n", " rociador_p = pm.Deterministic('rociador_p', \n", " pm.math.switch(lluvia, 0.01, 0.40))\n", " rociador = pm.Bernoulli('rociador', rociador_p, shape=1, testval=tv)\n", " hierba_mojada_p = pm.Deterministic('hierba_mojada_p', \n", " pm.math.switch(lluvia, pm.math.switch(rociador, 0.99, 0.80),\n", " pm.math.switch(rociador, 0.90, 0.0)))\n", " hierba_mojada = pm.Bernoulli('hierba_mojada', hierba_mojada_p,\n", " observed=np.array([1]), shape=1)\n", "\n", " trace = pm.sample(20000, \n", " step=[pm.BinaryGibbsMetropolis([lluvia, rociador])], \n", " tune=tune, random_seed=124)\n", "\n", "# pm.traceplot(trace)\n", "\n", "dictionary = {\n", " 'lluvia': [1 if ii[0] else 0 for ii in trace['lluvia'].tolist() ],\n", " 'rociador': [1 if ii[0] else 0 for ii in trace['rociador'].tolist() ],\n", " 'rociador_p': [ii[0] for ii in trace['rociador_p'].tolist()],\n", " 'hierba_mojada_p': [ii[0] for ii in trace['hierba_mojada_p'].tolist()],\n", " }\n", "df = pd.DataFrame(dictionary)\n", "\n", "p_lluvia = df[(df['lluvia'] == 1)].shape[0] / df.shape[0]\n", "print(\"\\nProbabilidad de que la hierba este mojada por la lluvia: {0}\"\n", " .format(p_lluvia))\n", "\n", "p_rociador = df[(df['rociador'] == 1)].shape[0] / df.shape[0]\n", "print(\"Probabilidad de que la hierba este mojada por el rociador: {0}\"\n", " .format(p_rociador))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "De acuerdo a los resultados de la [red bayesiana](https://es.wikipedia.org/wiki/Red_bayesiana), si vemos que la hierba esta mojada, la probabilidad de que este lloviendo es alrededor del 38%.\n", "\n", "## Clasificador Bayes ingenuo\n", "\n", "Uno de los clasificadores más utilizados en [Machine Learning](http://relopezbriega.github.io/category/machine-learning.html) por su simplicidad y rapidez, es el [Clasificador Bayes ingenuo](https://es.wikipedia.org/wiki/Clasificador_bayesiano_ingenuo). El cual es una técnica de clasificación supervisada basada en el [teorema de Bayes](https://es.wikipedia.org/wiki/Teorema_de_Bayes) que asume que existe una independencia entre los *atributos*. En términos simples, un [Clasificador Bayes ingenuo](https://es.wikipedia.org/wiki/Clasificador_bayesiano_ingenuo) asume que la presencia de una característica particular en una clase no está relacionada con la presencia de cualquier otra característica. Por ejemplo, una fruta puede considerarse como una manzana si es roja, redonda y de aproximadamente 9 cm de diámetro. Incluso si estas características dependen unas de otras o de la existencia de otras características, todas estas propiedades contribuyen independientemente a la probabilidad de que esta fruta sea una manzana. Se lo llama *ingenuo* ya que asumir independencia absoluta entre todos los atributos, no es algo que se suela dar en la realidad. \n", "El modelo [Bayes ingenuo](https://es.wikipedia.org/wiki/Clasificador_bayesiano_ingenuo) es fácil de construir y particularmente útil para conjuntos de datos muy grandes. A pesar de su simplicidad y de su *irealista* postulado de independencia, este clasificador se ha mostrado muy efectivo y se suele utilizar como el estándar para evaluar el rendimiento de otros modelos de [Machine Learning](http://relopezbriega.github.io/category/machine-learning.html).\n", "\n", "El [Clasificador Bayes ingenuo](https://es.wikipedia.org/wiki/Clasificador_bayesiano_ingenuo) se utiliza en múltiples escenarios de la vida real, tales como:\n", "\n", "* **Clasificación de texto:** Es uno de los algoritmos conocidos más exitosos cuando se trata de la clasificación de documentos de texto, es decir, si un documento de texto pertenece a una o más categorías (clases).\n", "* **Detección de spam:** Es un ejemplo de clasificación de texto. Se ha convertido en un mecanismo popular para distinguir el correo electrónico spam del correo electrónico legítimo. \n", "* **Análisis de sentimientos:** Puede ser utilizado para analizar el tono de tweets, comentarios y revisiones, ya sean negativos, positivos o neutrales.\n", "* **Sistema de Recomendaciones:** El algoritmo [Bayes ingenuo](https://es.wikipedia.org/wiki/Clasificador_bayesiano_ingenuo) en combinación con el filtrado colaborativo se utiliza para construir sistemas de recomendación híbridos que ayudan a predecir si un usuario desea un recurso determinado o no.\n", "\n", "Veamos un ejemplo con la ayuda de [Scikit-Learn](http://scikit-learn.org/stable/):" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cantidad de errores de clasificación sobre un total de 105 casos: 7\n", "Efectividad del algoritmo: 0.93\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Ejemplo Naive Bayes usuando iris dataset\n", "iris = datasets.load_iris()\n", "X = iris.data\n", "y = iris.target\n", " \n", "# Dividir los datos en entrenamiento y evaluación\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.7, \n", " random_state=0)\n", "\n", "# inicializar el clasificador Naive Bayes\n", "bayes_ingenuo = GaussianNB()\n", "\n", "# predicción \n", "y_pred = bayes_ingenuo.fit(X_train, y_train).predict(X_test)\n", "\n", "# Matriz de confusión\n", "cnf_matrix = confusion_matrix(y_test, y_pred)\n", "\n", "print(\"Cantidad de errores de clasificación sobre un total de {0} casos: {1}\"\n", " .format(y_test.shape[0],(y_test != y_pred).sum()))\n", "print(\"Efectividad del algoritmo: {0: .2f}\"\n", " .format(1 - (y_test != y_pred).sum()/y_test.shape[0]))\n", "\n", "# Graficando la matriz de confusión\n", "sns.heatmap(cnf_matrix.T, square=True, annot=True, fmt='d', cbar=False)\n", "plt.xlabel('Clase verdadera')\n", "plt.ylabel('Clase predecida')\n", "plt.title('Matriz de Confusión')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En este sencillo ejemplo, podemos ver como el [Clasificador Bayes ingenuo](https://es.wikipedia.org/wiki/Clasificador_bayesiano_ingenuo) ha clasificado correctamente la mayoría de los casos del dataset [iris](https://es.wikipedia.org/wiki/Iris_flor_conjunto_de_datos), obteniendo un efectividad del 93 %.\n", "\n", "Debido a que los [clasificadores bayesianos ingenuos](https://es.wikipedia.org/wiki/Clasificador_bayesiano_ingenuo) hacen suposiciones tan estrictas acerca de los datos, generalmente no funcionarán tan bien con modelos más complicados. Dicho esto, tienen varias ventajas:\n", "\n", "* Son extremadamente rápidos tanto para entrenamiento como para predicción\n", "* Proporcionan una predicción probabilística directa\n", "* A menudo son muy fácilmente interpretables\n", "* Tienen muy pocos parámetros que necesiten optimizarse.\n", "\n", "Estas ventajas significan que un [clasificador bayesiano ingenuo](https://es.wikipedia.org/wiki/Clasificador_bayesiano_ingenuo) es a menudo una buena opción como un modelo de clasificación inicial. Si obtenemos resultados satisfactorios, entonces tenemos un clasificador muy rápido, y muy fácil de interpretar. Si no funciona bien, entonces podemos comenzar a explorar modelos más sofisticados.\n", "\n", "Aquí concluye esta introducción a la [inferencia bayesiana](https://es.wikipedia.org/wiki/Inferencia_bayesiana); como vemos es una teoría sumamente fascinante con serias implicancias filosóficas. La [teoría Bayesiana](https://es.wikipedia.org/wiki/Teorema_de_Bayes) es mucho más que un simple teorema de probabilidad, es una lógica para razonar sobre el amplio espectro de la vida que se encuentra en las áreas grises entre la *verdad absoluta* y la *incertidumbre total*. A menudo tenemos información sobre sólo una pequeña parte de lo que nos preguntamos.\n", "Sin embargo, todos queremos predecir algo basado en nuestras experiencias pasadas; y adaptamos nuestras creencias a medida que adquirimos nueva información. La [inferencia bayesiana](https://es.wikipedia.org/wiki/Inferencia_bayesiana) nos proporciona una forma de pensar racionalmente sobre el mundo que nos rodea.\n", "\n", "Saludos!\n", "\n", "*Este post fue escrito utilizando [Jupyter notebook](http://jupyter.org/). Pueden descargar este [notebook](https://github.com/relopezbriega/relopezbriega.github.io/blob/master/downloads/BayesInf.ipynb) o ver su version estática en [nbviewer](http://nbviewer.ipython.org/github/relopezbriega/relopezbriega.github.io/blob/master/downloads/BayesInf.ipynb).*" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 2 }