Si repasamos el ciclo tecnológico de la Escucha Activa nos encontramos con diversos puntos en los que es precisa la clasificación de información incierta, cuantificando lo que a priori es información cualitativa, y para ello nada mejor que los métodos probabilísticos. En aprendizaje automático, las redes bayesianas son uno de los métodos más comunes para modelar este tipo de problemas por su buen comportamiento a la hora de trabajar con incertidumbre.
Pero en este artículo no vamos a hablar de cómo aprender una red bayesiana, algo muy bien explicado en los libros y sobre todo muy bien implementado en múltiples paquetes de software tanto propietarios como abiertos, como por ejemplo nuestro querido Weka.
No, en este artículo vamos a ver cómo podemos implementar una red bayesiana en base de datos y cómo podemos inferir conocimiento a posteriori a partir de la red bayesiana, que modela el conocimiento a priori, y de la observación de nuevas evidencias, y todo ello mediante consultas SQL.
Partiremos de una red bayesiana sencilla, obtenida por ejemplo del conocimiento de unos expertos (o aprendida automáticamente):

Podemos pensar que la red bayesiana representa un modelo simplificado de clasificación binaria de páginas Web como blogs o no blogs a partir de dos características observables y un valor de clase, en la línea de lo descrito en [*Rangel & Peñas, 2009]. Por ponerle nombre, supongamos que A es la observación de RSS en la página Web y B la observación de la palabra BLOG en su url. Sea pues C la probabilidad de dadas las características descritas, la página sea de tipo Blog.
Tomando una muestra suficientemente grande de páginas Web, podríamos partir de unas probabilidades a priori observadas tales como se presenta a continuación (datos completamente ficticios)
Para A, es decir, la probabilidad que dada una página Web cualquiera, disponga de RSS, podría ser:

Lo que significaría que de la muestra observada, el 55% dispone de RSS y el 45% no, independientemente del tipo de página Web que sea.
Para B, es decir, la probabilidad que dada una página Web cualquiera, presente la palabra BLOG en su url, podría ser:

En este caso el significado sería que de la muestra observada, el 10% contiene la palabra BLOG en su url, por ejemplo blogspot.com, y que el 90% no la contendría, de nuevo, independientemente del tipo de página Web que estemos observando.
El conocimiento de un experto -o un modelo aprendido a partir de los datos- nos podría proporcionar las siguientes probabilidades de clasificación:

Que significaría lo siguiente, empezando por la primera línea:
Si la página NO contiene RSS y NO presenta la palabra BLOG en su url, hay una probabilidad del 5% de que sea un blog
Si la página NO contiene RSS y SÍ presenta la palabra BLOG en su url, hay una probabilidad del 77% de que sea un blog
Si la página SÍ contiene RSS y NO presenta la palabra BLOG en su url, hay una probabilidad del 66% de que sea un blog
Si la página SÍ contiene RSS y SÍ presenta la palabra BLOG en su url, hay una probabilidad del 99% de que sea un blog
La tabla anterior quedaría completa con las clasificaciones negativas, para lo que simplemente se replican las combinaciones y se obtiene por resta con el 100%:

Con lo anterior tendríamos completamente modelada la red bayesiana mediante una representación conceptual.
Una vez modelada, podríamos desear conocer información como “Si sucede que obtenemos una página Web de tipo BLOG, es decir, C=Y, ¿qué sucede con las evidencias A y B?”.
Pues que por la ley de probabilidad condicional de Bayes las probabilidades a priori se recalculan con la nueva evidencia para convertirse en probabilidades a posteriori y son fácilmente son calculables con SQL de la siguiente manera, de modo que podríamos contestar a preguntas como por ejemplo, ¿qué probabilidad a posteriori tendríamos, sabiendo que el documento es un Blog, de que haya contenido un RSS?
Pues bien, es hora de trabajar con SQL. Con cualquier motor de base de datos relacional con el que estemos habituados, por ejemplo MySql, nos creamos las tres siguientes tablas:
create table PA (A varchar(1), P double, primary key (A))
create table PB (B varchar(1), P double, primary key (B))
create table PC (A varchar(1), B varchar(1), C varchar(1), P double, primary key (A, B, C))
Rellenamos los valores con los indicados en los cuadros de arriba y ya tenemos la red implementada en base de datos.
Para inferir el conocimiento anteriormente indicado, que dada la evidencia de que la página en cuestión es un BLOG saber las probabilidades condicionales (a posteriori) de la presencia de RSS, se realizaría del siguiente modo:
SELECT PC.A, SUM(PA.P * PB.P * PC.P)
FROM PA, PB, PC
WHERE PA.A=PC.A AND PB.B=PC.B
AND PC.C=’Y’
GROUP BY PC.A
Es decir, efectuamos una consulta sql que relaciona todas las tablas (PA, PB y PC) por los valores de las evidencias (campos A, B y C), suma la multiplicación de sus prioridades (SUM (PA.P * PB.P * PC.P), agrupa por la evidencia cuya probabilidad a posteriori deseamos conocer (GROUP BY PC.A ó lo que es lo mismo, agrupa por la existencia de RSS) y fija la evidencia observada (PC.C=’Y’ ó que la página observada es de tipo BLOG)
El resultado obtenido es el siguiente:

Que sería equivalente a realizar el cálculo matemático correspondiente:
P(A=Y) = 0.55 · [0.99 · 0.1 + 0.77 · 0.9] = 0.4356
P(A=N) = 0.45 · [0.66 · 0.1 + 0.05 · 0.9] = 0.04995
Y sólo nos quedaría normalizar para que la suma de probabilidades sea 100%:
P(A=Y, B|C=Y) = 0.4356 / (0.4356 + 0.04995) = 0.8971
P(A=N,B|C=Y) = 0.04995 / (0.4356 + 0.04995) = 0.1028
Lo anterior significa que dada la evidencia de una página de tipo blog, a posteriori la probabilidad de que contenga RSS es aprox. del 89,7% y de que no contenga es de aprox. 10,3%
Pero lo más importante aquí ha sido comprobar cómo con SQL podemos modelar e inferir conocimiento desde una red bayesiana.
Por supuesto, si queremos automatizar parte de este cálculo aún más podemos realizarnos un pequeño programita en Java (o PHP para los amantes de ese lenguaje)
* Detecting Blogs Independently from the Language and the Content. Rangel Pardo, F.M., Peñas Padilla, A. 1st International Workshop on Mining Social Media, MSM09-CAEPIA09, 2009