Preparación de los datos para el aprendizaje automático

Completado

Para poder crear un modelo de Machine Learning, debe preparar los datos que usará para entrenarlo y evaluarlo. Los datos se ingieren en Azure Databricks desde su origen, a menudo como archivos de datos. Opcionalmente, puede crear tablas delta basadas en los archivos de datos para simplificar la exploración y el análisis de datos. Una vez ingeridos los datos, un científico de datos los prepara para el aprendizaje automático.

Normalmente, la preparación de los datos implica dos tareas clave:

  • Limpieza de datos: identificación y mitigación de problemas en los datos que afectarán a su utilidad para el aprendizaje automático.
  • Ingeniería de características y preprocesamiento: selección y transformación de características adecuadas para el entrenamiento de modelos.

Limpieza de datos

Los pasos específicos necesarios para limpiar los datos varían de proyecto a proyecto, pero los problemas típicos que debe solucionar incluyen:

  • Datos incompletos: los datos suelen incluir registros en los que faltan campos individuales (a menudo indicados por la presencia de valores NULL). Debe identificar los valores que faltan y mitigarlos de las siguientes formas:
    • Sustituyéndolos por un reemplazo adecuado, ya sea interpolando un valor en una serie, utilizando un valor medio (o mediana) o creando algún otro valor adecuado.
    • Quitando filas incompletas en su totalidad (suponiendo que esto deja suficientes datos representativos adecuados para el modelado).
  • Errores: no es raro que los datos incluyan errores, causados por errores de entrada de datos o errores en el procesamiento de datos ascendente. La búsqueda de los errores puede resultar difícil y normalmente implica un examen sustancial de los datos mediante consultas y visualizaciones para resumir los datos y buscar valores que no coincidan con la mayoría del resto de valores en un campo determinado.
  • Valores atípicos: los valores atípicos son valores que están significativamente fuera (por encima o por debajo) de la distribución estadística de los datos. A veces, los valores atípicos son una indicación de un error (por ejemplo, alguien puede haber omitido una coma decimal o tener un valor con un cero adicional) y, a veces, son valores originales inusualmente altos o bajos en comparación con la mayoría de las observaciones. En cualquier caso, los valores atípicos extremos pueden afectar negativamente al entrenamiento de un modelo de Machine Learning; por lo tanto, normalmente es mejor controlarlos restableciéndolos a un valor de umbral superior o inferior, o quitando los registros que contienen valores atípicos del conjunto de datos.
  • Tipos de datos incorrectos: los algoritmos de aprendizaje automático pueden ser sensibles a los tipos de datos asignados a los valores de características. Es habitual que los conjuntos de datos basados en archivos de texto con errores o valores NULL conviertan incorrectamente los campos numéricos en un tipo de datos String. Además, con frecuencia, los valores que representan valores enteros discretos pueden convertirse incorrectamente en números decimales (o viceversa). Debe examinar el esquema de los datos y asignar los tipos de datos adecuados que reflejen los valores de datos de la forma más eficaz posible.
  • Datos desequilibrados: el entrenamiento de aprendizaje automático funciona mejor si los datos de entrenamiento tienen una representación adecuada para todas las diferentes combinaciones de características y etiquetas que pueden aparecer. En un conjunto de datos desequilibrado, los registros que incluyen un valor de categoría determinado o una combinación de campos se representan en exceso; esto puede influir en el algoritmo de entrenamiento y presentar un sesgo en el modelo. Una técnica común para mitigar este problema consiste en realizar un sobremuestreo de valores con escasa representación en filas duplicadas incluidas o realizar un submuestreo de filas con exceso de representación (quitándolas del conjunto de datos).

En Azure Databricks, la forma más común de detectar y controlar estos tipos de problemas es escribir código en un cuaderno que explore y manipule los datos. La clase principal que se usa para este tipo de manipulación de datos es el objeto DataFrame de Spark.

Por ejemplo, el código siguiente carga datos de un archivo de texto en un objeto DataFrame:

df = spark.read.format("csv").option("header", "true").load("/myfolder/mydata.csv")

Como alternativa, si los datos se han cargado en una tabla delta en el área de trabajo de Azure Databricks, puede usar una consulta SQL para cargar sus datos en un objeto DataFrame:

df = spark.sql("SELECT * FROM mytable")

Una vez cargados los datos en un objeto DataFrame, puede usar sus métodos y otras funciones en la biblioteca de Spark SQL para explorar y transformar los datos. Por ejemplo, el código siguiente usa el método dropna para quitar las filas que incluyen valores NULL y asigna tipos de datos específicos a columnas del objeto DataFrame.

clean_data = df.dropna().select(col("column1").astype("string"),
                                col("column2").astype("float"))

Sugerencia

Para obtener más información sobre la funcionalidad de DataFrame de Spark, consulte la documentación de Dataframe de Spark.

Ingeniería de características y preprocesamiento

Después de asegurarse de que el conjunto de datos está completo y limpio, puede empezar a preparar las características para el aprendizaje automático. La ingeniería de características es un enfoque iterativo que a menudo implica algunas pruebas de ensayo y error para determinar qué columnas de características tienen valor predictivo y cuál es la mejor forma de representar las características. Entre las tareas comunes de ingeniería de características y preprocesamiento se incluyen:

  • Derivación de nuevas características: a menudo puede derivar características nuevas y más predictivas de las existentes. Por ejemplo, supongamos que un conjunto de datos incluye una columna de fecha y sospecha que la fecha completa tal vez no sea un factor predictivo importante para identificar la etiqueta, pero que el día de la semana puede que sí lo sea. Podría crear una nueva característica day_of_week derivada de la fecha y probar su teoría.

  • Discretización de características numéricas: en algunos casos, un valor numérico podría resultar más predictivo cuando se discretiza en categorías que representan intervalos de valores específicos. Por ejemplo, podría tomar los valores numéricos en una característica de precio y asignarlos en las categorías baja, media y alta en función de los umbrales adecuados.

  • Codificación de características de categorías: muchos conjuntos de datos incluyen datos categóricos representados por valores de cadena. Sin embargo, la mayoría de los algoritmos de aprendizaje automático funcionan mejor con datos numéricos. Por lo tanto, es habitual asignar códigos numéricos para representar categorías en lugar de cadenas. Por ejemplo, un conjunto de datos de detalles del producto podría incluir una característica para el color que puede tener un valor de "Verde", "Rojo" o "Azul". Podría codificar estos valores mediante códigos enteros sencillos, como 0 para "Verde", 1 para "Rojo" y 2 para "Azul". Como alternativa, podría usar una técnica de codificación one-hot en la que se crea una nueva columna para cada categoría posible y se asigna el valor 1 o 0 a cada columna según corresponda para cada fila, como se indica a continuación:

    Columna de color original Verde Rojo Azul
    Verde 1 0 0
    Azul 0 0 1
    Rojo 0 1 0
  • Valores numéricos de escalado (normalización): los valores de datos numéricos suelen estar en diferentes escalas o unidades de medida entre sí. Los algoritmos de aprendizaje automático los procesan como valores numéricos absolutos y las características con valores mayores a menudo pueden dominar el entrenamiento del modelo. Para resolver este problema, es habitual escalar todas las columnas numéricas para que los valores individuales de una sola columna mantengan la misma relación proporcional entre sí, pero todas las columnas numéricas están en una escala similar. Por ejemplo, supongamos que un conjunto de datos contiene valores de longitud y peso medidos en metros y kilogramos. Podría convertir ambas características en un valor escalado entre 0 y 1 de la siguiente manera:

    length peso scaled_length scaled_weight
    250.0 2.1 0,250 0.210
    176.0 0.9 0.176 0,09

Muchas bibliotecas de aprendizaje automático incluyen clases que puede usar para realizar tareas comunes de ingeniería de características. Por ejemplo, la biblioteca MLlib de Spark incluye la clase StringIndexer, que puede usar para realizar una codificación sencilla basada en enteros para los valores de cadena.

from pyspark.ml.feature import StringIndexer

encoder = StringIndexer(inputCol="catCol", outputCol="catColCode")
encoded_data = encoder.fit(data).transform(data)

Nota

Merece la pena explicar el ejemplo de código StringIndexer con un poco más de detalle. Las clases de MLlib Spark pueden incluir evaluadores que ajusten un algoritmo para una operación de transformación específica a algunos datos de ejemplo. En este caso, StringIndexer ajusta un algoritmo de codificación a los valores de cadena discretos en la columna catCol en el objeto DataFrame data para determinar los cálculos específicos necesarios para generar una nueva columna catColCode que contenga los valores codificados. La salida de un evaluador es un transformador que encapsula la función definida por el evaluador, y que puede aplicar esa función a los datos y generar un nuevo objeto DataFrame. En este ejemplo, pasamos los mismos datos usados para determinar la función de codificación al transformador resultante para aplicar realmente la codificación.

En Spark MLLib, puede encadenar una secuencia de evaluadores y transformadores juntos en una canalización que realice todos los pasos de ingeniería de características y preprocesamiento que necesita para preparar los datos. La canalización puede terminar con un algoritmo de aprendizaje automático que actúa como evaluador para determinar las operaciones necesarias para predecir una etiqueta a partir de las características preparadas. La salida de la canalización es un modelo de Machine Learning, que es de hecho un transformador que se puede usar para aplicar la función de modelo a las características de un objeto DataFrame y predecir los valores de etiqueta correspondientes.