datos bonitos, datos feos

noviembre 9, 2010

Cuando vas a analizar, explorar, conocer conjuntos de datos, lo primero con lo que te encuentras (entre otras cosas) es que los datos no son tan bonitos como los que R incluye para experimentar. La mayor parte de los datos que escogí tienen formato csv, que es un simple formato tabular. Los datos bonitos son, por ejemplo:

surgery,age,hnumber,rectal-temp
no,adult,530101,38.5
yes,adult,534817,39.2
no,adult,530334,38.3
yes,young,5290409,39.1

Pero, ¿qué tiene de bonito el atributo sobre temperatura rectal (rectal-temp)? ¿Cuál es el criterio para decir que el archivo es bonito? En el ejemplo, todas las columnas están correctamente separadas por comas, con el mismo número de columnas por renglón y no hay caracteres raros. Este archivo puede usarse inmediatamente para análisis sin ninguna inversión de tiempo. Pero los conjuntos de datos en la realidad no son así, la mayoría es imperfecto y feo en mayor o menor medida. Veamos el siguiente:

User-ID,Location,Age
5262,&#turkey,27
9311,Ł,ódź,, lodzkie, poland,17
9335,san diego california usa,54

9396,, ,,44
9387,southlake texas usa,38

Horror. El archivo está plagado de símbolos raros que en nada ayudan a su proceso. Además, hay algunos registros que tienen más de tres columnas. Si eso no basta para decir que es feo, tiene renglones vacíos, que aunque para el ojo humano es “nada” generalmente para un programa si significa “algo” y no precisamente bondadoso. Por ejemplo, algunos programas nos dirán que este archivo feo tiene seis registros cuando en realidad tiene cinco.

Este archivo necesita un preproceso urgente que le quite lo feo para que se puedan hacer análisis confiables. Y así, ya que aceptamos que los datos reales difícilmente son bonitos,  entonces hay que decidir cómo los haremos bonitos. Eso depende de nuestras necesidades y de lo que hayamos visto que ocurre con más frecuencia en los datos disponibles: 1) ¿todas las columnas requieren limpieza?, tengo un archivo en el que una columna contiene URLs por lo que limpiarlo deformaría el dato, 2) ¿me importa que el valor del atributo se entienda?, 3) ¿qué caracteres debo eliminar?, 4) ¿qué caracteres debo sustituir?, 5) si un renglón no tiene la misma cantidad de atributos, ¿lo quito?,¿lo corrijo?,¿es relevante? Al primer vistazo puede parecer muy simple, sin embargo, las decisiones que se tomen son relevantes para los resultados de todo análisis.

¿Ven por qué es feo? el primer archivo no genera tanta interrogante. El segundo archivo es todo lo contrario, decisiones y más decisiones. No cabe duda, en un simple conjunto de datos se resume la vida misma.

Pues bien, como el punto es que hay que decidir, mi decisión inicial consiste en: 1) elimino los renglones vacíos, 2) elijo qué columnas limpiaré y 3) la limpieza consiste en eliminar los caracteres no-alfanuméricos. ¿Cómo hacerlo? No, ni lo piensen, hoja de cálculo no. Si tienes solamente un archivo pequeño y ese es tu único interés tal vez. Pero si el número de conjunto de datos a usar es indeterminado y no son pequeños entonces pensar siquiera en usar una hoja de cálculo sería un suicidio. Hice un script inicial en Python que hace la limpieza básica descrita; está disponible en el repositorio. R no es bueno para preprocesamiento, supone que los archivos llegan ya listos.

Lo bueno de todo es que esa fase de preprocesamiento permite que conozcas mejor los datos, que les conozcas sus defectos, que los veas de cerca, que te metas en ellos. Cuando los datos son bonitos, ni los miras (pero salen más rápido los resultados).

A veces, lo que creemos que es basura, no lo es

Imagen

Anuncios

R: tutoriales básicos y ejemplos de scripts

octubre 19, 2010

Cuando estás aprendiendo algo nuevo, un tutorial es de gran ayuda. Sin embargo, encontrar documentos que te faciliten el proceso de aprendizaje no siempre es sencillo. Después de revisar varios tutoriales de R, encontré algunos que permiten hacer cosas rápidamente, sentir y experimentar el lenguaje de forma inmediata.

Mis tutoriales básicos de R favoritos son los siguientes: tutorial 1, tutorial 2

Ahora sigue la parte interesante. Una herramienta es solamente el medio; la representación de la información, su análisis e interpretación no es responsabilidad del software.

En el git están disponibles los scripts.


Compilando y ejecutando el ejemplo básico: Protege-OWL API

octubre 18, 2010

Hacía mucho tiempo que no usaba Java y hoy, al tratar de ejecutar el ejemplo más simple (Tutorial), no me salía. No uso IDEs y uso Linux (Ubuntu) por lo que la configuración del entorno tenía que ser distinta.

No bastaba con agregar el directorio de los JAR por lo que un script solucionó el asunto. A continuación se muestra el archivo .java y el script.

El archivo de ejemplo es OWLAPIDemoApplication.java:

import edu.stanford.smi.protege.exception.OntologyLoadException;
import edu.stanford.smi.protegex.owl.jena.*;
import edu.stanford.smi.protegex.owl.ProtegeOWL;
import edu.stanford.smi.protegex.owl.model.*;

public class OWLAPIDemoApplication {

public static void main(String[] args) {

try {
OWLModel owlModel = ProtegeOWL.createJenaOWLModel();
owlModel.getNamespaceManager().setDefaultNamespace(“http://hello.com#”);
OWLNamedClass worldClass = owlModel.createOWLNamedClass(“World”);
System.out.println(“Class URI: ” + worldClass.getURI());
}
catch (OntologyLoadException oe){
oe.printStackTrace();
}
}
}

El siguiente script agrega los JAR, compila y ejecuta. Estoy suponiendo que el .class está en el mismo directorio del proyecto.

#!/bin/bash

export JAR_HOME=/home/blanca/Protege_3.4.4
export JAR_PLUGINS=/home/blanca/Protege_3.4.4/plugins/edu.stanford.smi.protegex.owl

for f in $JAR_HOME/*.jar

do
A=$A:$f
done

for g in $JAR_PLUGINS/*.jar

do
B=$B:$g
done

JAR_CLASSPATH=$A$B:”/home/blanca/cenidpd/talkprotege”
export JAR_CLASSPATH

#echo the classpath $JAR_CLASSPATH

javac -classpath $JAR_CLASSPATH OWLAPIDemoApplication.java
java -Dprotege.dir=$JAR_HOME -classpath $JAR_CLASSPATH OWLAPIDemoApplication

La salida es:

Class URI: http://hello.com#World

==========

Ajusta paths y ejecuta el script. Aquí no sale identado.

También se encuentra en el github.


Eligiendo herramientas

octubre 13, 2010

Encontrar las herramientas adecuadas para realizar una tarea no siempre es sencillo. Puedes usar lo que ya conoces sin importar si es lo más indicado o no. Con buena suerte, lo que ya conoces es lo adecuado y todo sale bien. Sin embargo, si no es así, el tiempo que ganarías según tú por conocer bien la herramienta en cuestión, se perdería al tener que trabajar más para cubrir sus deficiencias. Recientemente me encontré en una situación semejante.

Perl ha sido mi lenguaje de scripts favorito desde hace varios años. Su flexibilidad hace que puedas obtener resultados rápidamente. Una desventaja es que fácilmente puedes tener un código muy críptico y desordenado que al poco tiempo no entiendas. Mi dilema surgió recientemente: ¿seguiría usando Perl para el proyecto actual?, si era así, ¿era lo indicado?. Así, tratando de evitar aspectos emocionales como “… es que en Perl hice la transformación de datos que más me ha divertido …” y cosas parecidas, decidí buscar lo que luce más conveniente al proyecto.

 

Perl: el hippy, liberal, relajado

Buscaba algo que hiciera énfasis en el análisis estadístico y también que, como Perl, permitiera pegar cosas (Glue Language). Así, después de considerar distintas alternativas, he escogido Python como lenguaje de propósito general y R para la parte estadística. A diferencia de Perl, Python te exige mayor formalidad; es como la dama de La dama y el vagabundo. Por ejemplo, en Perl puedes escribir el código identado o sin identar, es indistinto.  En Python, por el contrario, la identación es un deber, no cuestión de estilo ni de buenas prácticas. Lo ideal sería que se tuvieran buenos hábitos con todos los lenguajes pero sabemos que en la práctica, eso difícilmente se cumple. Después de hacer algunos pininos,  he sentido las ventajas de Python, pero lo admito, Perl sigue siendo mi favorito.

 

Python: el formal, el elegante

En cuanto a R, su fortaleza radica en el análisis estadístico y  lo poco que he probado hasta ahora, me ha convencido. Sobre R ya había leído diversos comentarios, la mayoría positivos; sin embargo, fue un  análisis estadístico muy interesante lo que me hizo volver a poner mis ojos en él.

Pero, ¿cómo usar R desde Python? todo indica que rpy es lo que busco para aprovechar lo mejor de ambos mundos.

La experiencia y los resultados que se logren mostrarán si son buenas elecciones.

===

Imagen hippy, del usuario de flickr gabbahey


Imagen corbata
, del usuario de flickr fhashemi


Software libre para aprendizaje automático

mayo 9, 2010

En la comunidad científica, la publicación de artículos es una actividad central. Quienes se dedican al aprendizaje automático, generalmente asocian a sus artículos, software para resolver un problema determinado, mostrar pruebas de concepto, algoritmos nuevos, combinar técnicas, entre muchas aplicaciones. Sin embargo, pocos son los investigadores que ponen el software a disposición del público. El objetivo principal es obtener resultados para el artículo en turno mientras que el desarrollo y distribución del software no es una prioridad. Este esquema de trabajo constituye un obstáculo para el avance científico ya que:

  • Impide que se reproduzcan con fidelidad los resultados presentados en el artículo.
  • Genera la necesidad de implementación incesante.
  • Dificulta la combinación de diferentes enfoques.
  • Dificulta la comparación entre algoritmos.

Las principales excusas que se suelen poner para liberar el código son:

  • Mi software está horrible. La existencia de un esquema de software libre forzaría a generar mejor código.
  • Nos robarán las ideas. El enfoque debería ser: se extenderán nuestras ideas.
  • No tengo tiempo, además ya lo publiqué. El enfoque debería ser: lo haré y eso me permitirá generar nuevos resultados y experimentos en menor tiempo.

A raíz de esta carencia, en el 2007 se propuso la plataforma MLOSS (Machine Learning Open Source Software). Desde entonces, lentamente ha ido creciendo el interés de la comunidad; en principio, por probar el software disponible; posteriormente, por difundir el propio. Lo importante es que se va ganando terreno en este aspecto.

Confesión: Esta nota surgió del remordimiento que tengo porque no he pulido el software generado en mi tesis para ponerlo a disposición libre.

Referencia: The Need for Open Source Software in Machine Learning


A %d blogueros les gusta esto: