Tu primer experimento en Azure ML Studio: El caso del Titanic (II): Preparando los datos.

Wednesday, November 22, 2017

Tu primer experimento en Azure ML Studio: El caso del Titanic (II): Preparando los datos.

Continuamos con el tutorial de ejemplo de creación de un modelo de Machine Learning (ML) en Azure ML Workplace aplicado al dataset de pasajeros del Titanic. Tras la introducción a la herramienta que hemos hecho en la primera parte, en ésta segunda, crearemos el experimento, cargaremos los datos y haremos los procesos de depuración y preparación necesarios antes de crear nuestro modelo predictivo.

RMS Titanic departing Southampton on April 10, 1912.(fuente)

1 Creamos un nuevo experimento.

Accedemos al espacio de trabajo MS Azure Machine Learning Studio, donde todavía no tenemos creado ningún experimento:

Figura 1: Creamos un nuevo experimento.
Figura 1: Creamos un nuevo experimento.

Seleccionando el signo “+” que aparece en la parte inferior izquierda, creamos un nuevo experimento en blanco.


Figura 2: Creamos un experimento desde cero.
Figura 2: Creamos un experimento desde cero.

Le damos un nombre fácilmente identificable, por ejemplo: “Titanic: predicción de supervivencia”. también podemos introducir una breve descripción de experimento que puede ser de gran utilidad si después lo compartimos con otras personas.

Figura 3: Creamos un experimento desde cero.


2 Cargamos los datos

Una vez hemos añadido el nombre, cargamos el dataset. Para ello, nuevamente seleccionamos el signo “+”, pero ahora elegimos agregar “DATASET”, desde fichero local.

Figura 4: Agregamos el conjunto de datos desde un fichero local
Figura 4: Agregamos el conjunto de datos desde un fichero local.

Indicamos la ruta del fichero y su formato (puede ser csv con o sin cabeceras, texto plano, fichero zip, o un objeto/Workspace R). En nuestro ejemplo, es un fichero csv.

Figura 5: Elegimos el formato .csv.
Figura 5: Elegimos el formato .csv.

En el espacio de trabajo nos aparece el elemento representado el conjunto de datos que acabamos de cargar "train.csv":

Figura 6: Vemos los datos ya cargados en el espacio de trabajo.
Figura 6: Vemos los datos ya cargados en el espacio de trabajo.

El dataset del Titanic tiene 891 filas. Cada una de ellas corresponde a un pasajero del RMS Titanic en el viaje inaugural del famoso transatlántico, que se hundió la noche del 14 de Abril de 1912. De los 223 personas que iban a bordo, 1514 murieron aquella noche, lo que convierte a esta tragedia en uno de los mayores naufragios de la historia ocurridos en tiempo de paz. Cada una de las columnas (12) registran atributos sobre demográficos y relacionados con el tipo de pasaje: identificador de usuario, edad, género, número de parientes a bordo, identificador de billete, clase, precio, camarote asignado, puerto de embarque y, la variable que queremos predecir con el modelo (target variable), “superviviente” o “no superviviente”.

Todo el mundo conoce la historia del naufragio del Titanic, pero seguro que no es tan conocido el hecho de tengamos tanta información sobre los pasajeros de aquel infausto viaje. En la web Encyclopedia Titanica, podemos humanizar el ejemplo, y ver la lista de pasajeros, sus edades, incluso sus fotos.

Figura 7: Listado de pasajeros.
Figura 7: Listado de pasajeros.









3 Tratamiento de los datos: exploración y pre-procesamiento.

3.1 Reducción de columnas


Vamos a ver qué aspecto tiene el dataset. Nos interesa identificar y eliminar las columnas que no aportan valor, ya que pueden añadir ruido o generar correlaciones falsas. Por ejemplo, las columnas PassengerID, el nombre (a veces se usa para averiguar el género, pero en este caso ya lo sabemos), el número de serie del billete, o el número de camarote. Veamos cómo hacerlo.

Desde el menú contextual del elemento, elegimos: Dataset/Visualize

Figura 8: Visualizamos los datos.
Figura 8: Visualizamos los datos.

Desde esa ventana podemos ver detalles como el número de filas y columnas, sus nombres, estadísticas como el tipo de variable (”Feature Type”), cuántos valores faltan (“Missing Values”), comparar unas columnas con otras para ver si puede haber alguna correlación (Histogram/Compare to) …

Así, podemos ver que la columna que indica el camarote “Cabin”, tiene demasiados valores vacíos (687). Por tanto, en nuestro caso, que es una primera aproximación, parece una excelente candidata para eliminar.


Figura 9: La columna "Cabin" tiene 687 valores vacíos.
Figura 9: La columna "Cabin" tiene 687 valores vacíos.


En el caso de la edad, por ejemplo, tenemos una variable numérica. Podríamos plantearnos sustituir los valores que faltan por valores estadísticos como la media (mean), o la mediana (median), y luego analizar cómo afecta a los resultados la sustitución por un valor u otro.


Figura 10: La columna "Edad" es de tipo numérico. Vemos su media y su mediana.
Figura 10: La columna "Edad" es de tipo numérico. Vemos su media y su mediana.

Una vez decididas qué columnas vamos a eliminar, procedemos. En el menú “Data Transformation/Manipulation”, elegimos la opción “Select columns in a Dataset”, con lo que se agrega un nuevo módulo al flujo. Lo “conectamos” con el dataset que ya teníamos cargado.


Figura 11: Usaremos el menú "Manipulation" para eliminar algunas columnas.
Figura 11: Usaremos el menú "Manipulation" para eliminar algunas columnas.

Al seleccionar el elemento “Select Columns in Dataset”, nos aparece, a la derecha, un panel de propiedades desde donde podemos lanzar el selector de columnas “Launch Column selector”. Seleccionamos las que queremos eliminar:


Figura 12: En la columna de la derecha deben quedar las columnas sobre las que queremos actuar.
Figura 12: En la columna de la derecha deben quedar las columnas sobre las que queremos actuar.















Si queremos ver el resultado, podemos ejecutar la operación seleccionado “Run” y después volver a visualizar como hemos hecho la primera vez.

Figura 13: Ejecutamos la operación deseada (puede hacerse por partes).
Figura 13: Ejecutamos la operación deseada (puede hacerse por partes).

3.2 Corrección de metadatos – Definición de variables


En este punto tenemos que pararnos a observar el tipo de variables con las que estamos trabajando, ya que el tratamiento matemático va a ser muy distinto según sean valores continuos o no-continuos. Definiremos como variables categóricas aquellas cuyos valores son “no continuos”.

Por ejemplo, la variable Survived sólo tiene dos valores posibles: “1” =superviviente y “0”= fallecido. Un valor “0,5” no tendría sentido (No, no, “medio-muerto” no nos vale).

¿Y qué columnas deberíamos definir como categóricas?


Las candidatas más aparentes son: Survived, Pclass, Sex, y Embarked. Cuando el valor es un literal, como en el caso del sexo (“male” o “female”), no hay dudas, pero cuando es numérico, como en el caso de Pclass, puede no estar tan claro. Esta variable distinguía si el pasaje era de primera (“1”), segunda (“2”), o tercera clase (“3”). Por tanto, aunque sea numérica, no son valores continuos, un valor decimal no tendría sentido. Es también categórica.

Para definir el tipo de variable que representa cada columna usamos el editor de metadatos. Para ello, seguimos los siguientes pasos:

Figura 14: Identificamos las variables categóricas.
Figura 14: Identificamos las variables categóricas.

  1. En el menú “Data Transformation” (a la izquierda) seleccionamos “Edit Metadata”
  2. Lo conectamos con el elemento anterior del flujo
  3. Lanzamos el selector de columnas (en el menú de la derecha, “Select columns in Dataset") para agregar las columnas que hemos elegido y, en el campo “Categorical”, seleccionamos la opción “Make Categorical”

3.3 ¿Qué hacemos con los valores que faltan?


Todos los datasets tienen campos vacíos y hay que tomar una decisión sobre qué hacer con ellos para que no tengan un impacto negativo en los resultados. Normalmente se aplican tres estrategias distintas: sustituirlos por otro valor, excluirlos de la selección o directamente, eliminarlos.
Lo más habitual es intentar sustituir los valores en blanco por otro valor, para minimizar en lo posible la pérdida de información. Cuando se trata de valores numéricos, se suele reemplazar por valores estadísticos como la media, la mediana o la moda. En ML se suele usar mediana, porque respeta la distribución de los datos y queda menos afectada por “outliers” (valores anómalos).

Si recordamos, la mediana de un conjunto finito de valores es aquel valor que divide al conjunto en dos partes iguales, de forma que el número de valores mayor o igual a la mediana es igual al número de valores menores o igual a estos. En un diagrama de caja ("box plot") lo visualizamos así:


Figura 15: Ejemplo de representación box plot de un conjunto de datos.
Figura 15: Ejemplo de representación box plot de un conjunto de datos.

En el apartado 3.1 Visualización de columnas, ya vimos cómo detectar los campos vacíos. Podemos ver que, para la columna “Age” (Edad), el número de valores que faltan es muy alto. Sin embargo, para “Embarqued” sólo nos faltan dos valores.

Figura 16: Las estadísticas muestran un número muy elevado de "missing values" en la columna Age.
Figura 16: Las estadísticas muestran un número muy elevado de "missing values" en la columna Age.

Como vemos también la variable “Age” es de tipo numérico (Feature Type: Numeric Feature), por tanto, resulta muy sencillo sustituir los valores que falta por la mediana (que, en este caso es “28”).
Sin embargo, la variable “Embarked” es categórica (cadena de caracteres). Podríamos sustituir los valores vacíos por “U” de “Unkonwn”, por ejemplo. Pero al ser sólo dos los valores que faltan, resulta más lógico asumir una pérdida de un 0.2% de los datos y, por tanto, decidimos eliminarlos.

Para hacer estos cambios, podemos aplicar un módulo de limpieza “Cleaning”. Si no sé qué opción de menú es, puedo localizarla fácilmente usando el buscador:

Figura 17: Para localizar una opción concreta en el menú, podemos usar el buscador.
Figura 17: Para localizar una opción concreta en el menú, podemos usar el buscador.

Como antes, los pasos son parecidos:
  1. Agregamos el módulo (“Clean Missing Data”)
  2. Lo conectamos con el módulo anterior del flujo
  3. Lanzamos el selector de columnas (en el menú de la derecha) para agregar la columna “Age” y le indicamos que sustituya por la mediana (“Replacement Value”=28). Ojo que las columnas seleccionadas son las que aparecen a la derecha del selector. Hay que pasar todas al lado izquierdo, salvo “Age”.

Figura 18: Sustituimos por la mediana.
Figura 18: Sustituimos por la mediana.

Hacemos la misma operación para eliminar los valores que faltaban en la columna “Embarked”, solo que, en este caso, el “Cleaning Mode” elegido es “Remove Entire Row”. En caso de duda sobre qué valores dar a los parámetros, siempre podemos consultar la ayuda rápida que aparece justo debajo:

Figura 19: En la parte inferior derecha siempre tenemos una "ayuda rápida".
Figura 19: En la parte inferior derecha siempre tenemos una "ayuda rápida".

Para conocer con más detalle los distintos métodos de depuración de datos, podéis consultar un ejemplo muy completo en la galería de Cortana intelligence

3.4 ¿Qué valores queremos predecir?


El último paso que nos queda, antes de construir nuestro modelo ML es definir cuál es el atributo con el que vamos a entrenar el modelo para que sea capaz de hacer predicciones sobre su valor (nuestro "target variable"). Para ello, recurriremos nuevamente al módulo “Metadata Editor”. Seleccionaremos la columna “Survived”, ya que queremos predecir la supervivencia (o no) de un pasajero, basándonos en los otros datos disponibles en el dataset. Descrubir, en definitiva, si había un “patrón de supervivencia”. Después, en el campo “Fields” lo definimos como “Label” (sólo puede haber uno por dataset)


Con esto, ya tenemos todo preparado para construir nuestro modelo ML. El siguiente paso, la elección del algoritmo, en el próximo post. ¡No te lo pierdas!


Puedes seguir el experimento completo en los siguientes enlaces:

No comments:

Post a Comment