4. Software Adaptativo

Cuando aprendemos a programar, enseguida aprendemos ciertos principios básicos que hacen que nuestro software aumente su valor de uso: reutilización, abstracción, que sea usable para el usuario final, ... Sin embargo, no nos suelen preparar para que el software se adapte de manera automática a los cambios en las necesidades de usuario, en sus objetivos, ó en el entorno.

Según Peter Norvig director de calidad de búsqueda de Google: [El software adaptativo usa información disponible acerca de cambios en su entorno para mejorar su comportamiento]. Es decir, el software tiene capacidad de adaptarse al comportamiento del usuario sin que éste lo pida de una manera explícita, entendiendo como usuario a una persona u otro sistema.

El software adaptativo ha tenido su caldo de cultivo en la minería de datos (data mining), esto es, la extracción no trivial, implícita, previamente desconocida y potencialmente usable de información de interés en grandes cantidades de datos. El proceso de extraer esa información se basa en aplicar algoritmos de aprendizaje automático.

Todo esto que puede estar pareciendo un poco de ciencia ficción está teniendo una fuerte eclosión en aplicaciones populares para el usuario final. Fijémonos, por ejemplo, en el problema del spam, actualmente evolution, mozilla, kmail y otros lectores de correo están introduciendo facilidades para separar el spam del ham, es decir, el correo electrónico "no" deseado, del "sí" deseado. Para ello normalmente se aplica un algoritmo de aprendizaje automático denominado Naive Bayes. Muchos sitios web también están incorporando estos métodos para incrementar ventas ó visitas. Es conocido el caso de Amazon que utiliza filtrado colaborativo para encontrar usuarios con perfiles de compra similares y recomendar productos personalizados. Un ejemplo un poco más hispano es la Guia Campsa que utiliza una neurona articial para ordenar el orden de rutas que prefieren los usuarios.

Ahora que se tiene un poco más claro para que puede ser útil hoy el aprendizaje automático, se verá cómo crear un sistema que aprenda a decidir si es un buen día para jugar al tenis en función de una serie de atributos: fuerza del viento (wind), humedad (humidity), temperatura (temperature) y previsión del cielo (outlook). Para ello vamos a utilizar el algoritmo ID3 implementado en lisp por Tom Mitchell, uno de los padres del aprendizaje automático. Para ello es necesario instalar un intérprete de lisp (si usamos debian y queremos cmucl) apt-get install cmucl y ahora se descarga el programa lisp en cuestión wget -c http://www-2.cs.cmu.edu/afs/cs/project/theo-11/www/decision-trees.lisp. Finalmente, se ejecuta la traza que viene en el propio fichero:

Ejemplo 3. Traza de ID3 dada


[18:41][darroyo@turing:~/programacion/lisp]$ lisp
CMU Common Lisp CVS release-19a 19a-release-20040728 + minimal debian patches, running on turing
With core: /usr/lib/cmucl/lisp.core
Dumped on: Fri, 2004-10-08 11:51:05+02:00 on turing
For support see http://www.cons.org/cmucl/support.html Send bug reports to the debian BTS.
or to pvaneynd@debian.org
type (help) for help, (quit) to exit, and (demo) to see the demos

Loaded subsystems:
    Python 1.1, target Intel x86
    CLOS based on Gerd's PCL 2004/04/14 03:32:47
* (load "decision-trees.lisp")

; Loading #p"/home/darroyo/programacion/lisp/decision-trees.lisp".
Warning:  Declaring *DATA* special.
T
* *training.examples*

(D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1)
* (print.entity 'd6)

(PLAY.TENNIS? NO WIND STRONG HUMIDITY NORMAL TEMPERATURE COOL OUTLOOK RAIN)
(PLAY.TENNIS? NO WIND STRONG HUMIDITY NORMAL TEMPERATURE COOL OUTLOOK RAIN)
* (setq tree (id3 *training.examples*
                'play.tennis?
                '(outlook temperature humidity wind)))
Warning:  Declaring TREE special.

(OUTLOOK (SUNNY (HUMIDITY (NORMAL YES) (HIGH NO))) (OVERCAST YES)
 (RAIN (WIND (STRONG NO) (WEAK YES))))
* (print.tree tree)
OUTLOOK
 = SUNNY
     HUMIDITY
      = NORMAL => YES
      = HIGH => NO
 = OVERCAST => YES
 = RAIN
     WIND
      = STRONG => NO
      = WEAK => YES
NIL
* (classify 'd6 tree)

NO
      

Este algoritmo de clasificación va construyendo un árbol de clasificación escogiendo en cada paso el atributo que tiene una mayor entropía, es decir, el atributo que tiene valores más variados. Después de haber recibido los ejemplos de entrenamiento ya podemos saber si, por ejemplo, la variable d6 es un ejemplo de día para jugar al tenis ó no: (classify 'd6 tree).

Os animo a modificar un poco el código, cambiando los ejemplos de entrenamiento, para familiarizarse con el mecanismo. El lector interesado en librerías de aprendizaje automático, puede visitar las siguientes referencias que, además, son libres:

El software adaptativo permite solucionar problemas dónde el conocimiento estático no llega. El caso del spam es tal vez el más popular, no obstante, sistemas expertos, sistemas web, firewalls, encaminadores, etc. están incluyendo enfoques adaptativos para mejorar la eficacia de sus sistemas.

El objetivo de este apartado ha sido vislumbrar el modo en que puede aprender una máquina y, la aplicación que tiene este aprendizaje de máquinas en el software que utilizamos en nuestra vida cotidiana.