En la anterior entrada del blog hablamos de la importancia que tiene la limpieza de datos y su preprocesamiento para el correcto funcionamiento de los métodos de aprendizaje. Tras aplicar todas las herramientas de limpieza necesarias conseguimos tener un conjunto de datos (dataset) validado, estructurado y sin ningún dato aberrante que nos condicione el entrenamiento. Sin embargo, solo aplicando técnicas de limpieza de datos no se puede garantizar el correcto funcionamiento de los métodos de aprendizaje automático. En este punto, las herramientas de transformación de datos son imprescindibles, no solo para mejorar la eficacia del aprendizaje, sino incluso para permitir que se pueda llevar a cabo.
Técnicas de transformación de datos
Existen múltiples técnicas de transformación de datos. Las hay que aplican a características concretas de nuestro conjunto de datos y otras que se aplican de forma global a todos los datos para modificarlos.
- Escalado MinMax: Es muy habitual que los valores numéricos que hay en nuestros datos estén en diferentes rangos. Imaginemos que tenemos un conjunto de datos relacionados con la salud de un grupo de personas. Una de las mediciones que estamos registrando es el número de hematíes en sangre, cuyo valor medio es de unos 4,5 millones. Otra de las mediciones es el ácido úrico, cuyos valores están comprendidos entre 4,2 y 8 mg/dL. Si intentamos entrenar un sistema que tenga en cuenta estos datos, la diferencia que existe entre los valores de los hematíes y los valores del ácido úrico hará que estos últimos sean prácticamente despreciables. El escalado MinMax, permite acotar todos los valores entre 0 y 1 manteniendo la forma original de la distribución de los datos.
- Escalado estándar: En otras ocasiones, el problema con el que nos encontramos es que el rango de alguna de las variables es mayor que el del resto. Si seguimos con el ejemplo anterior, los niveles normales de hierro oscilan entre 65-170 mg/dL mientras que los valores habituales de glucosa suelen estar entre 74-106 mg/dL. En este caso, ambos campos tienen una magnitud similar; sin embargo, el rango de posibles valores del hierro es mucho más amplio que el de los valores de glucosa. Esta diferencia puede repercutir en el modelo de aprendizaje automático que tiene que entender que variar un parámetro relacionado con la variable de glucosa no afecta del mismo modo a variar otro en la misma cantidad, dependiente de la variable hierro. Para facilitar esto y hacer que todos los datos preserven una distribución similar se utiliza el escalado estándar, que transforma los datos originales en otros cuya distribución estadística tiene una media 0 y una desviación estándar igual a 1.
- Discretización de los datos: Muchas veces ocurre que alguno de los datos con los que contamos aportan más información de la que realmente necesitamos. Supongamos que estamos en el mismo caso de antes (datos clínicos) y para nuestro problema nos interesa saber si el paciente tiene bien el nivel de colesterol en sangre y nuestros datos son la cantidad de miligramos por decilitro. Puede ser que a nosotros no nos interese saber el número concreto y simplemente queramos saber si los valores son normales o no. Discretizar los datos consiste en convertir una variable continua a un conjunto finito de valores. En este caso se podrían fijar tres categorías: “Sano” cuando el valor es inferior a 200mg/dL, “Alerta” cuando está entre 200 y 239 mg/dL y “Peligro” cuando supera los 240mg/dL. Haciendo esto reducimos la complejidad del problema y podemos conseguir mejores resultados en un tiempo mucho menor.
- Codificación de los datos: Como dijimos en el post anterior sobre limpieza de datos, para poder trabajar con modelos de aprendizaje automático como las redes neuronales artificiales es necesario que los datos sean numéricos. Es muy frecuente que tengamos variables en nuestros datos que sean fechas, categorías, textos. Para poder tener estos datos en cuenta es necesario realizar procesos de transformación que nos permitan convertir todos estos tipos de datos a datos numéricos. Existen muchas técnicas para convertir este tipo de datos a números:
- Fechas: Los campos de fecha se pueden convertir fácilmente a número usando el tiempo UNIX, que es la cantidad de segundos transcurridos desde la medianoche UTC del 1 de enero de 1970. Aunque existen otros métodos, como el uso de funciones sigmoideas que representen la fecha de forma cíclica.
- Textos: Para codificar textos a números se pueden utilizar técnicas como Bag of Words que cuentan la frecuencia con que se repiten las palabras en el texto. Existe un campo de investigación muy importante relacionado con el tratamiento de textos denominado NLP de las siglas en inglés de “Procesamiento de Lenguaje Natural”. De este tema hablaremos en futuras publicaciones del blog.
- Categorías: Para codificar categorías como la que hemos creado tras discretizar los datos del colesterol se puede convertir cada categoría a un valor numérico (Sano = 0; Alerta = 1; Peligro = 2). En esta ocasión la categorización tiene sentido ya que las categorías guardan una relación de orden. Estar en “peligro” está más cerca de “alerta” que de “sano”. Sin embargo, hay muchas ocasiones en las que las categorías no tienen ninguna relación lógica de orden. Si tenemos una mascota y la codificamos como (Perro = 0; Gato = 1; Pájaro = 2; Pez = 3) esto indicaría que el pez está más cerca de ser un pájaro que de ser un perro, cosa que no tiene ningún sentido.
Para solucionar esto, se utiliza una técnica denominada OneHotEncoding, que convierte cada categoría a una nueva característica booleana del dataset. Por lo tanto, si tenemos un registro con el valor Pájaro en el campo mascota, tras aplicarle el OneHotEncoding nos aparecería el campo pájaro con valor 1 (True) y las otras tres columnas de mascotas con valor 0 (False). Esto puede aumentar considerablemente el número de características de nuestro conjunto de datos, pero nos permite tratar de manera correcta campos categóricos. En caso de que el número de características aumente demasiado se pueden utilizar técnicas de reducción de dimensionalidad que nos permita describir cada registro con tan solo las características más relevantes. De estas técnicas hablaremos en futuras entradas del blog.
En los dos últimos posts de Inteligencia Artificial hemos visto un resumen de qué pasos debemos seguir cuando nos enfrentamos a un nuevo conjunto de datos:
- Buscar campos vacíos.
- Validar que los valores se ajusten al tipo de campo.
- Eliminar datos duplicados.
- Detectar outliers.
- Escalar cada una de las características.
- Discretizar datos que aportan más información de la necesaria.
- Codificar las características que no sean numéricas para poder introducírselas al sistema de aprendizaje automático.
- Seleccionar las características más relevantes
Estas técnicas de preprocesamiento de datos son el primer paso que llevamos a cabo en el departamento de Inteligencia Artificial de Xeridia a la hora de abordar un proyecto de Machine Learning, extrayendo la información de valor para desarrollar con éxito los proyectos de nuestros clientes. Si quieres saber cómo podemos ayudarte a mejorar tus procesos con aplicaciones de inteligencia artificial o conocer los casos de éxito de Xeridia en IA, puedes contactar con nosotros a través del formulario web.
Oscar García-Olalla Olivera es Científico de datos, ingeniero de I+D en Xeridia