Preparar datos
Fase de Data Preparation
En el método CRISP-DM, la fase de Data Preparation (Preparar Datos) nos permite pasar de los datos brutos, tal como se extraen de las fuentes de datos, a los datos que pueden utilizar los distintos algoritmos de Machine Learning.
Esta preparación es necesaria por dos razones principales:
-
La mayoría de los algoritmos tienen restricciones sobre el formato de los datos de entrada. Esto puede referirse a su tipo: por ejemplo, puede que solo acepten variables numéricas, o restricciones en su formato, como la necesidad de normalizar las entradas reales entre 0 y 1.
-
Preparar los datos puede mejorar mucho los resultados de los algoritmos, al extraer o crear columnas que se adapten mejor al problema.
Esta fase debe estar bien documentada. Es vital saber exactamente qué decisiones se han tomado y por qué. Esto permite validar estas decisiones desde el punto de vista empresarial antes de poner los modelos en producción, y garantiza la coherencia de los resultados.
También es durante la preparación cuando se toma la decisión de limitar los datos utilizados para el resto del proceso. Igualmente, en este caso deben documentarse todas las decisiones tomadas.
Esta fase puede llevar mucho tiempo, hasta el 50% de la duración del proyecto.
Suprimir datos
No todos los datos brutos se utilizarán necesariamente para el resto del proceso. Para optimizar el trabajo realizado, conviene suprimirlos al inicio de la fase de preparación de los datos.
Por tanto, es posible limitarlos eliminando filas, denominadas registros, o columnas, llamadas características.
A continuación, se ofrece una lista no exhaustiva de motivos para suprimir registros (filas):
-
No corresponden a los casos que hay que tratar, porque son demasiado específicos.
-
Contienen errores como edades negativas.
-
Faltan demasiados datos, lo que resta interés.
Para las características, puede tener sentido eliminar columnas por las siguientes razones:
-
No tienen nada que ver con el dominio.
-
No son utilizables en su estado actual, como los nombres propios.
-
Son demasiado incompletas y, por tanto, solo proporcionan información muy parcial.
-
Son demasiado uniformes, como una variable con un único valor posible
-
Se trata de un identificador único.
-
Y así sucesivamente.
Sin embargo, hay una excepción: si existe riesgo de sesgo, es aconsejable mantener la columna en el dataset, aunque vaya a suprimirse del entrenamiento (por ejemplo, el sexo o el origen étnico). Esta información puede utilizarse después de la modelización mediante algoritmos de eXplainable AI (IA eXplicable; XAI) para garantizar que el modelo está libre de sesgos y discriminación....
Separar datasets
Antes de seguir adelante, es esencial disponer de al menos dos conjuntos de datos:
-
Un dataset de entrenamiento, que se utilizará para crear el modelo.
-
Un dataset de prueba, para probar el modelo.
El dataset de prueba no se debe volver a utilizar hasta el final de todo el proceso, y sobre todo no hay que usarlo para modificar los modelos (que entonces estarían muy sesgados). Tampoco debe utilizarse para elegir cuáles son las mejores preparaciones de datos.
En inglés, analizar los datos con demasiada precisión sin haber extraído el dataset de prueba se denomina «data snooping». Normalmente, esta separación debería tener lugar incluso antes de la fase de análisis de los datos, para evitar incluir demasiados sesgos estadísticos en el resto del proceso.
Durante el proceso de modelización, el dataset de entrenamiento se separará de nuevo en aprendizaje y validación; la validación permitirá elegir los hiperparámetros de los distintos modelos.
1. Proporción Entrenamiento/Prueba
Durante muchos años, los textos de referencia indicaban que era necesaria una proporción de 80/20, es decir, el 80% de los datos para el entrenamiento y el 20% para las pruebas. Esto sigue siendo cierto cuando el número de muestras es pequeño, pero hoy en día, con la llegada de Big Data, esto sucede cada vez menos.
Con un dataset de 150 valores como Iris, parece importante disponer de al menos 30 registros para probar los modelos. Esto representa unas diez filas por clase.
Sin embargo, en un dataset de un millón de puntos de datos, no es necesario disponer de 200.000 muestras de prueba.
Por lo tanto, la proporción de registros en el dataset de prueba debe ser del 20% para conjuntos de datos pequeños. Cuanto mayor sea el número de registros del dataset, menor será...
Tratar los datos faltantes
Existen varias estrategias para tratar los datos faltantes:
-
Suprimir la columna infractora.
-
Suprimir las filas que contienen valores vacíos.
-
Rellenar los valores faltantes (lo que se conoce como imputación (imputation)) utilizando un valor decidido de antemano.
La primera estrategia se trata de la misma forma que eliminar una columna (función drop). Suele utilizarse cuando una columna no está muy llena y su importancia parece baja. Es el caso, por ejemplo, del número de camarote del dataset del Titanic, que tiene poca repercusión en las posibilidades de supervivencia.
Además, si la columna tiene una proporción significativa de valores perdidos, no parece pertinente crear un modelo con ella. En general, si el valor falta en más de la mitad de los casos, debe eliminarse. Si los valores faltantes representan menos de la mitad de los datos (por ejemplo, el 25%), la decisión dependerá de una serie de parámetros: tamaño del dataset, distribución de la variable objetivo, importancia comercial de la variable, etc.
Para suprimir filas, también se puede utilizar la función dropna vista anteriormente. Esta suele ser la mejor opción cuando los datos faltantes se encuentran en registros no específicos y ya hay muchos datos. Solo se tiene que comprobar de antemano que la presencia de un valor vacío para estas filas no tiene ningún...
Preparar atributos numéricos
Las variables numéricas pueden utilizarse potencialmente tal cual, en los modelos, pero a menudo se obtienen mejores resultados preparándolas. Existen varias posibilidades acumulativas:
-
Validar datos, que consiste en comprobar que los datos numéricos son correctos (o al menos lo parezcan).
-
Feature Engineering, que consiste en crear nuevos datos a partir de los existentes.
-
Discretizar, que consiste en transformar datos numéricos en datos categoriales.
-
Y normalizar, que consiste en reducir los datos a intervalos equivalentes para compararlos mejor. Para algunos algoritmos, la normalización es un requisito previo.
1. Validar datos
La validación de datos se realiza en dos aspectos:
-
Semánticamente: los valores de los datos corresponden a lo esperado.
-
Estadísticamente: los datos no parecen tener valores extremos o periféricos.
a. Validar semánticamente los datos
Para el análisis semántico, hay que comprobar que los valores proporcionados corresponden al significado de la columna y a su contexto.
Por tanto, el tamaño debe ser positivo. En el caso de un producto de mano, como una pelota, el tamaño debe estar entre 5 y 10 centímetros (cm). Un tamaño de 70 cm sería incoherente.
A menudo, los datos no pasan ese filtro. Pueden producirse errores durante el proceso de adquisición.
Este puede ser el caso si el sensor se ha averiado o no ha habido mediciones, y se ha establecido un tamaño «predefinido». También puede ocurrir si los datos proceden de dos sensores que miden en unidades distintas (centímetros y pulgadas), o que utilizan un proceso diferente, lo que provoca un desfase entre las mediciones.
En caso de incoherencia, es importante volver a la fase de comprensión de los datos y/o hablar con el cliente, interno o externo, que proporcionó los datos para aclarar cualquier cuestión pendiente. Por lo general, los datos incorrectos se eliminarán si no pueden corregirse.
Hay una expresión en la Ciencia de Datos: «Garbage In, Garbage Out» (basura entra, basura sale). Esta resume un punto crucial: la calidad de los datos es primordial, por lo que es importante asegurarse de ella de antemano. Nunca es una pérdida de tiempo.
b. Validar estadísticamente los datos
La validación estadística...
Preparar variables categoriales
No todos los algoritmos de Machine Learning pueden utilizar datos categoriales. Pueden aplicarse distintos tratamientos previos, como en el caso de las variables numéricas:
-
Validar datos, para comprobar que los datos son correctos.
-
Modificar determinados valores (fusión, reordenación, etc.), también conocida como feature engineering.
-
Cuantificar variables categoriales.
1. Validar datos
Al igual que los datos numéricos, los datos categoriales deben validarse a dos niveles:
-
Desde un punto de vista semántico: todas las categorías tienen un significado.
-
Desde un punto de vista estadístico: el desglose entre categorías parece corresponder a la realidad.
Para la validación semántica, puede ser útil pedir una lista de posibles categorías y comprobar que corresponden a la realidad:
iris_df['class'].cat.categories
> Index(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'],
dtype='object')
Como era de esperar, hay tres clases que corresponden a los tres tipos de flores del dataset Iris.
Para la validación estadística, a diferencia de lo que ocurre con los datos numéricos, no existe la noción de valores atípicos. Los valores se colocan automáticamente en una de las categorías existentes.
Sin embargo, puede detectarse un error por la presencia de categorías con índices de uso muy bajos. Así, si un dataset contiene un solo elemento, es sin duda un signo de error.
Por lo tanto, es útil, para este punto, calcular la frecuencia de cada aparición en una serie utilizando value_counts:
iris_df['class'].value_counts()
> Iris-virginica 50
Iris-versicolor 50
Iris-setosa 50
Name: class, dtype: int64
Como se anuncia en el dataset, cada clase está presente 50 veces (de los 150 elementos de datos).
2. Modificar categorías
Se pueden introducir varios cambios en las categorías.
a. Ordenar o reordenar categorías
Para algunos algoritmos, puede ser útil establecer un orden para las categorías. En el caso de la clase de pasajeros en el dataset Titanic, naturalmente...
Datos particulares
En la Ciencia de Datos, hay dos tipos de datos que suelen ser particulares en su proceso:
-
Fechas en sentido amplio, que pueden corresponder a fechas (del día), a la hora o a la combinación fecha + hora. Estas variables pueden verse, según el caso, como datos numéricos, por ejemplo, una marca de tiempo, o como datos categoriales ordenados con un valor por día.
-
Textos, que no corresponden a valores precisos en una lista predefinida. Se trata de variables categoriales no ordenadas, que tienen tantos valores como registros (o casi).
Estos dos formatos suelen requerir un tratamiento especial durante la fase de preparación de los datos.
1. Preparar las fechas
Las fechas pueden estar en múltiples formatos, y Pandas ofrece una serie de utilidades para trabajar con ellas. Esto simplifica las operaciones diarias.
Para ilustrar estas posibilidades, cargaremos el dataset «acc-2018», que contiene la lista de accidentes de tráfico de 2018. El dataset original, procedente de data.gouv.fr, contiene numerosas variables que aquí se han simplificado para conservar únicamente las siguientes:
-
Num_Acc: el número de accidente.
-
año, mes, día: el día del accidente, en tres columnas numéricas.
-
hrmn: la hora del accidente en forma de número entero (por ejemplo, 1505 significa 15:05, 425 significa 4:25).
-
lat / long: latitud y longitud del accidente.
-
dep: el departamento del accidente multiplicado por 10 para incluir Córcega (así, 590 indica el departamento 59 y, para Córcega, 201 representa Córcega del Sur y 202 Alta Córcega).
Para cargar el dataset, que utiliza punto y coma como separadores, utilice el siguiente comando:
acc_df = pd.read_csv('acc-2018.csv', sep=';')
a. El formato datetime64
Para gestionar las fechas, deben almacenarse en una única variable (en formato datetime64 utilizando la biblioteca Pandas).
Los conjuntos de datos contienen a menudo campos disjuntos, como es el caso de la base de datos de accidentes. Primero hay que unir cada parte de la fecha y, a continuación, convertir el conjunto al formato correcto.
Usando Pandas, esto se puede hacer en dos líneas: la primera consiste en crear un nuevo campo que contenga las variables día,mes y año separadas por ’-’ y la segunda consiste en convertir las fechas creadas al formato correcto:...
Automatizar la preparación
1. Crear pipelines de tratamiento
En una fase de preparación de datos, es importante poder probar varias preparaciones para distintas variables. Del mismo modo, es necesario crear varios modelos que pueden tener diferentes restricciones en cuanto al formato de entrada. Se trata de fases muy iterativas.
Usar Pandas y Jupyter ahorra tiempo y es una combinación práctica, siempre que se lleve un registro del trabajo realizado y de las distintas iteraciones en un gestor de versiones como git.
Una vez creado e implantado el modelo, habrá que suministrarle datos reales, en tiempo real o por medio de batch (lotes). Pero estos datos también tendrán que ser preprocesados, ya que tendrán que estar en el mismo formato que los datos de entrenamiento utilizados para crear el modelo.
Por ejemplo, si una de las transformaciones consiste en sustituir los valores faltantes por la media de los datos de entrenamiento, necesitamos poder acceder a este valor.
Se trata del pipeline (canal o tubería) de preparación: la secuencia de todos los pasos necesarios para pasar de un archivo en bruto (o de un único dato en bruto en tiempo real) al formato esperado por el modelo.
Esta canalización garantizará que todos los datos pasen por las mismas etapas y puedan supervisarse. De este modo, el modelo en producción será utilizable y ofrecerá resultados coherentes.
2. Parámetros de las operaciones y código Pandas
Algunos pasos no dependen de los datos utilizados, como cambiar el texto a minúsculas, convertir un número a otro formato, etc. Pero hay varios pasos que dependen en gran medida del dataset de entrenamiento, como la normalización, que requiere conocer, según el tipo elegido. el mínimo y el máximo, la media y la desviación estándar, o el primer y el tercer cuartil.
En el caso de la normalización min-max, el 0 debe corresponder a los datos de entrenamiento mínimos. Si los datos de entrenamiento están entre 27 y 53, por ejemplo, entonces 0 debe corresponder a 27. Al aplicar el modelo a otro dataset (ya sea el dataset de prueba o los datos reales), 27 debe transformarse en 0. Así, con datos reales cuyo mínimo es 23, este debe corresponder a un número negativo.
No solo es necesario conservar los pasos que hay que seguir para pasar de los datos...