Preparación de 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 lo 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 del modelo.

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:
    • Sustituirlos por un reemplazo adecuado, ya sea interpolando un valor de una serie, utilizando un valor medio (o mediana) o creando algún otro valor adecuado.
    • Quitar filas incompletas por completo (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 errores puede ser difícil y normalmente implica un examen sustancial de los datos mediante consultas y visualizaciones para resumir los datos y buscar valores que no se alinean con la mayoría de los demás valores de un campo determinado.
  • Valores atípicos: los valores atípicos son valores que están significativamente fuera (por encima o por debajo) 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 tener un valor con un cero adicional o se omite un separador decimal) y, a veces, son valores originales que son 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 aprendizaje automático; por lo tanto, normalmente es mejor controlarlos restableciéndolos a un valor de umbral superior o inferior, o quitando 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 común que los conjuntos de datos basados en archivos de texto que contienen errores o valores nulos conviertan incorrectamente los campos numéricos a un tipo de dato cadena, y a menudo los valores que representan enteros discretos se convierten erróneamente en números decimales (o viceversa). Debe examinar el esquema de los datos y asignar los tipos de datos adecuados que reflejen de forma más eficaz los valores de datos.
  • Datos desequilibrados: el entrenamiento de aprendizaje automático funciona mejor si los datos de entrenamiento tienen una representación adecuada para todas las distintas combinaciones de características y etiquetas que podrían encontrarse. En un conjunto de datos desequilibrado, los registros que incluyen un valor categórico determinado o una combinación de campos están sobrerrepresentados; que puede influir en el algoritmo de entrenamiento e introducir sesgos en el modelo. Una técnica común para mitigar este problema consiste en sobremuestrear los valores infrarrepresentados mediante la inclusión de filas duplicadas, o bien en submuestrear las filas sobrerrepresentadas eliminándolas del conjunto de datos.

En Azure Databricks, la manera 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 la trama de datos de Spark.

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

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 dataframe:

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

Una vez cargados los datos en una trama de datos, 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 cualquier fila que incluya valores NULL y asigne tipos de datos específicos a columnas del 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 trama de datos 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 y errores para determinar qué columnas de características tienen valor predictivo y cómo representar mejor las características. Entre las tareas comunes de ingeniería de características y preprocesamiento se incluyen:

  • Derivar 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 puede no ser un factor predictivo importante para identificar la etiqueta, pero que el día de la semana podría ser. Puede crear una nueva variable day_of_week derivada de la fecha y probar su teoría.

  • Características numéricas de discretización: 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, puede tomar los valores numéricos en una característica de precio y asignarlos a categorías bajas, medias y altas en función de los umbrales adecuados.

  • Codificación de características categóricas: 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". Puede codificar estos valores mediante códigos enteros simples como 0 para "Verde", 1 para "Rojo" y 2 para "Azul". Como alternativa, puede usar una técnica de codificación única en la que se crea una nueva columna para cada categoría posible y asignar 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 numéricos de datos 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 más grandes 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 medidores y kilos. Puede convertir ambas características en un valor escalado entre 0 y 1 de la siguiente manera:

    largura 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 simple basada en enteros para 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 Spark MLlib pueden incluir evaluadores que se ajustan a 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 de la columna catCol del dataframe para determinar los cálculos específicos necesarios para generar una nueva columna catColCode que contiene 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 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 y preprocesamiento de características que necesita para preparar los datos. La canalización puede terminar con un algoritmo de aprendizaje automático que actúa de evaluador para determinar las operaciones necesarias para predecir una etiqueta a partir de los atributos preparados. La salida de la canalización es un modelo de aprendizaje automático, que de hecho es un transformador que se puede usar para aplicar la función del modelo a las características de un conjunto de datos y predecir los valores correspondientes de las etiquetas.