Compartir a través de


Caracterización de datos en aprendizaje automático automatizado

SE APLICA A: SDK de Python azureml v1

En este artículo se explica cómo personalizar la configuración de caracterización de datos en Azure Machine Learning para los experimentos de aprendizaje automático automatizado (AutoML).

Ingeniería de características y caracterización

Los datos de entrenamiento constan de filas y columnas. Cada fila es una observación o registro, y las columnas de cada fila son las características que describen cada registro. Normalmente, las características que mejor caracterizan los patrones de los datos se seleccionan para crear modelos predictivos.

Aunque muchos de los campos de datos sin procesar se pueden usar directamente para entrenar un modelo, a menudo es necesario crear otras características (diseñadas) que proporcionan información que diferencia mejor los patrones de los datos. Este proceso se denomina ingeniería de características, donde el uso de conocimientos de dominio de los datos se usa para crear características que, a su vez, ayudan a los algoritmos de aprendizaje automático a aprender mejor.

En Azure Machine Learning, se aplican técnicas de escalado de datos y normalización para facilitar la ingeniería de características. En conjunto, estas técnicas y esta ingeniería de características se denominan caracterización en experimentos de aprendizaje automático automatizado (ML).

Requisitos previos

En este artículo se da por supuesto que ya sabe cómo configurar un experimento de ML automatizado.

Importante

Los comandos de Python de este artículo requieren la versión más reciente del paquete azureml-train-automl.

Para obtener información sobre la configuración, vea los artículos siguientes:

Configuración de la caracterización

En todos los experimentos de aprendizaje automático automatizado se aplican técnicas de escalado automático y normalización a los datos de forma predeterminada. Estas técnicas son tipos de caracterización que ayudan a ciertos algoritmos que son sensibles a las características a diferentes escalas. Puede habilitar una caracterización adicional, como la atribución de valores que faltan, la codificación y las transformaciones.

Nota

Los pasos de la caracterización del aprendizaje automático automatizado (tales como la normalización de características, el control de los datos que faltan o la conversión de valores de texto a numéricos) se convierten en parte del modelo subyacente. Cuando se usa el modelo para realizar predicciones, se aplican automáticamente a los datos de entrada los mismos pasos de caracterización que se aplican durante el entrenamiento.

En el caso de los experimentos configurados con el SDK de Python, se puede habilitar o deshabilitar el valor de caracterización y especificar con más detalle los pasos de caracterización que se van a usar para el experimento. Si usa Azure Machine Learning Studio, vea los pasos para habilitar la caracterización.

En la tabla siguiente se muestran los valores aceptados para featurization en la clase AutoMLConfig:

Configuración de la caracterización Descripción
"featurization": 'auto' Especifica que, como parte del preprocesamiento, los límites de protección de datos y los pasos de caracterización se van a realizar automáticamente. Esta es la configuración predeterminada.
"featurization": 'off' Especifica que los pasos de caracterización no se deben realizar automáticamente.
"featurization": 'FeaturizationConfig' Especifica que se van a usar los pasos de caracterización personalizados. Aprenda a personalizar la caracterización.

Características automáticas

En la tabla siguiente se resumen las técnicas que se aplican automáticamente a los datos. Estas técnicas se aplican para los experimentos que se configuran mediante el SDK o la interfaz de usuario de Studio. Para deshabilitar este comportamiento, establezca "featurization": 'off' en el objeto AutoMLConfig.

Nota

Si tiene previsto exportar los modelos creados mediante AutoML a un modelo de ONNX, solo se admiten las opciones de caracterización indicadas con un asterisco ("*") en el formato ONNX. Más información sobre la conversión de modelos a ONNX.

Pasos de caracterización Descripción
Eliminación de las características de cardinalidad alta o sin variación* Permite eliminar estas características de los conjuntos de entrenamiento y validación. Se aplican a características en las que faltan todos los valores, que tienen el mismo valor en todas las filas o que tienen una cardinalidad alta (por ejemplo, hashes, id. o GUID).
Atribución de los valores que faltan* Para las características numéricas, se atribuyen con el promedio de los valores de la columna.

Para las características de categorías, se atribuyen con el valor más frecuente.
Generación de más características* Para las características de fecha y hora: año, mes, día, día de la semana, día del año, trimestre, semana del año, hora, minuto, segundo.

En el caso de las tareas de previsión, se crean estas características adicionales de fecha y hora: año ISO, semestre, mes natural como cadena, semana, día de la semana como cadena, día del trimestre, día del año, AM/PM [0 si la hora es antes de mediodía (12 p. m.); 1, en caso contrario], AM/PM como cadena, hora del día (formato de 12 h)

Para las características de texto: Frecuencia de término basada en unigramas, bigramas y trigramas. Más información sobre cómo se hace esto con BERT.
Transformación y codificación* Permite transformar las características numéricas con pocos valores únicos en características de categorías.

La codificación "one-hot" se utiliza para las características de categoría de cardinalidad baja. La codificación "one-hot-hash" se utiliza para las características de categorías de cardinalidad alta.
Inserciones de palabras Caracterizador de texto que convierte los vectores de tokens de texto en vectores de oración mediante un modelo previamente entrenado. El vector de inserción de cada palabra en un documento se agrega con el resto para producir un vector de característica de documento.
Distancia del clúster Entrena un modelo de agrupación en clústeres k-means en todas las columnas numéricas. Genera k nuevas características (una característica numérica nueva por grupo), que contienen la distancia de cada muestra hasta el centroide de cada clúster.

En todos los experimentos de aprendizaje automático automatizado, los datos se escalan y se normalizan automáticamente para ayudar a que los algoritmos funcionen bien. Durante el entrenamiento del modelo, se aplica una de las siguientes técnicas de escalado o normalización para todos los modelos.

Escalado y procesamiento Descripción
StandardScaleWrapper Normalice las características mediante la eliminación de la media y el escalado a la varianza unitaria.
MinMaxScalar Transforma las características mediante el escalado de cada característica por el mínimo y máximo de esa columna.
MaxAbsScaler Escale cada característica por su valor absoluto máximo.
RobustScalar Escala las características por su intervalo cuantil.
PCA Reducción de la dimensionalidad lineal mediante la descomposición de valores singulares de los datos para proyectarlos en un espacio dimensional inferior.
TruncatedSVD Este transformador realiza la reducción de la dimensionalidad lineal mediante la descomposición de valores singulares truncados (SVD). Al contrario que PCA, este estimador no centra los datos antes de calcular la descomposición del valor singular, lo que significa que puede funcionar con matrices scipy.sparse de forma eficaz.
SparseNormalizer Cada muestra (es decir, cada fila de la matriz de datos) con al menos un componente distinto de cero se vuelve a escalar independientemente de otras muestras para que su norma (l1 o l2) sea igual a una.

Límites de protección de datos

Los límites de protección de datos permiten identificar posibles incidencias con los datos (por ejemplo, valores que faltan o desequilibrio de clases). También ayudan a tomar acciones correctivas para mejorar los resultados.

Se aplican límites de protección de datos:

  • Para experimentos del SDK: Cuando se especifican los parámetros "featurization": 'auto' o validation=auto en el objeto AutoMLConfig
  • Para experimentos de Studio: Cuando se habilita la caracterización automática

Puede revisar los límites de protección de datos del experimento:

  • Mediante el establecimiento de show_output=True cuando se envía un experimento con el SDK.
  • En Studio, en la pestaña Límites de protección de datos de la ejecución del ML automatizado.

Estados de límites de protección de datos

Los límites de protección de datos muestran uno de los tres estados siguientes:

State Descripción
Superado No se ha detectado ningún problema con los datos y no se requiere ninguna acción por su parte.
Listo Los cambios se han aplicado a los datos. Se recomienda revisar las acciones correctivas que ha realizado ML automatizado para asegurarse de que los cambios se alineen con los resultados esperados.
Con alertas Se ha detectado una incidencia con los datos, pero no se ha podido resolver. Se recomienda revisar y solucionar la incidencia.

Límites de protección de datos admitidos

En la tabla siguiente se describen los límites de protección de datos admitidos actualmente, así como los estados asociados que podría ver al enviar el experimento:

Límite de protección Estado Condición para el desencadenador
Atribución de los valores de características que faltan Pasado


¡Listo!
No se ha detectado que falten valores de característica en los datos de entrenamiento. Obtenga más información sobre la imputación de valores que faltan.

Se han detectado valores de característica que faltan en los datos de entrenamiento y se han imputado.
Detección de características de alta cardinalidad Pasado


¡Listo!
Se han analizado las entradas y no se han detectado características de cardinalidad alta.

Se han detectado características de cardinalidad alta en las entradas y se han controlado.
Control de división de validación ¡Listo! La configuración de validación se ha establecido en 'auto' y los datos de entrenamiento contenían menos de 20 000 filas.
Todas las iteraciones del modelo entrenado se han validado mediante validación cruzada. Obtenga más información sobre la validación de datos.

La configuración de validación se ha establecido en 'auto' y los datos de entrenamiento contenían más de 20 000 filas.
Los datos de entrada se han dividido en un conjunto de datos de entrenamiento y un conjunto de datos de validación para comprobar el modelo.
Detección de equilibrio de clases Pasado




Con alertas



¡Listo!
Se analizaron las entradas y todas las clases están equilibradas en los datos de entrenamiento. Se considera que un conjunto de datos está equilibrado si todas las clases tienen una representación adecuada en el conjunto de datos según el número y proporción de las muestras.

Se han detectado clases desequilibradas en las entradas. Para corregir el sesgo del modelo, corrija el problema de equilibrio. Obtenga más información sobre datos desequilibrados.

Se detectaron clases desequilibradas en las entradas, y la lógica de barrido ha determinado aplicar el equilibrio.
Detección de problemas de memoria Pasado



¡Listo!
Se han analizado los valores seleccionados (horizonte, retardo y ventana con desplazamiento) sin que se hayan detectado incidencias potenciales de memoria insuficiente. Obtenga más información sobre las configuraciones de previsión de series temporales.

Se han analizado los valores seleccionados (horizonte, retardo y ventana con desplazamiento) y pueden provocar que el experimento se quede sin memoria. Las configuraciones de retardo o de ventana gradual están desactivadas.
Detección de frecuencias Pasado


¡Listo!
Se ha analizado la serie temporal y todos los puntos de datos están alineados con la frecuencia detectada.

Se ha analizado la serie temporal y se han detectado puntos de datos que no están alineados con la frecuencia detectada. Estos puntos de datos se quitaron del conjunto de datos.
Validación cruzada Listo Para evaluar con precisión los modelos entrenados por AutoML, usamos un conjunto de datos en el que el modelo no está entrenado. Por lo tanto, si el usuario no proporciona un conjunto de datos de validación explícito, se usa una parte del conjunto de datos de entrenamiento para lograrlo. En el caso de conjuntos de datos más pequeños (menos de 20 000 muestras), se usa la validación cruzada; de lo contrario, se divide un único conjunto de espera de los datos de entrenamiento para servir como conjunto de datos de validación. Por lo tanto, para los datos de entrada usamos la validación cruzada con 10 plegamientos, si el número de muestras de entrenamiento es inferior a 1000 y 3 plegamientos en todos los demás casos.
División de datos de entrenamiento y pruebas Listo Para evaluar con precisión los modelos entrenados por AutoML, usamos un conjunto de datos en el que el modelo no está entrenado. Por lo tanto, si el usuario no proporciona un conjunto de datos de validación explícito, se usa una parte del conjunto de datos de entrenamiento para lograrlo. En el caso de conjuntos de datos más pequeños (menos de 20 000 muestras), se usa la validación cruzada; de lo contrario, se divide un único conjunto de espera de los datos de entrenamiento para servir como conjunto de datos de validación. Por lo tanto, los datos de entrada se dividen en un conjunto de datos de entrenamiento y en un conjunto de datos de validación de retención.
Detección de id. de serie temporal Pasado


Fijo
Se analizó el conjunto de datos y no se detectó ningún índice de tiempo duplicado.

Se encontraron varias series temporales en el conjunto de datos y los identificadores de serie temporal se crearon automáticamente para el conjunto de datos.
Agregación de serie temporal Pasado


Fijo
La frecuencia del conjunto de datos se alinea con la frecuencia especificada por el usuario. No se realizó ninguna agregación.

Los datos se agregaron para cumplir con la frecuencia proporcionada por el usuario.
Control de series breves Pasado


Fijo
El ML automatizado ha detectado suficientes puntos de datos para cada serie en los datos de entrada para continuar con el entrenamiento.

Ml automatizado detectó que algunas series no contenían suficientes puntos de datos para entrenar un modelo. Para continuar con el entrenamiento, estas series cortas se quitaron o acolcharon.

Personalización de la caracterización

Se pueden personalizar los valores de la caracterización para asegurarse de que los datos y las características que se usan a fin de entrenar el modelo de Machine Learning generen predicciones pertinentes.

Para personalizar las caracterizaciones, especifique"featurization": FeaturizationConfig en el objeto AutoMLConfig. Si usa Azure Machine Learning Studio para el experimento, vea el artículo de procedimiento. Para personalizar la caracterización de los tipos de tarea de previsión, consulte el procedimiento de previsión.

Las personalizaciones compatibles incluyen:

Personalización Definición
Actualización del propósito de la columna Invalida el tipo de característica detectado automáticamente para la columna especificada.
Actualización de parámetros del transformador Actualizar los parámetros para el transformador especificado. Actualmente admite Imputer (media, más frecuente y mediana) y HashOneHotEncoder.
Quitar columnas Especifica las columnas que se van a eliminar de la caracterización.
Transformadores de bloque Especifica los transformadores de bloque que se van a usar en el proceso de características.

Nota

La funcionalidad Quitar columnas está en desuso a partir de la versión 1.19 del SDK. Quite columnas del conjunto de datos como parte de la limpieza de datos antes de consumirlos en el experimento de aprendizaje automático automatizado.

Cree el objeto FeaturizationConfig mediante llamadas API:

featurization_config = FeaturizationConfig()
featurization_config.blocked_transformers = ['LabelEncoder']
featurization_config.drop_columns = ['aspiration', 'stroke']
featurization_config.add_column_purpose('engine-size', 'Numeric')
featurization_config.add_column_purpose('body-style', 'CategoricalHash')
#default strategy mean, add transformer param for 3 columns
featurization_config.add_transformer_params('Imputer', ['engine-size'], {"strategy": "median"})
featurization_config.add_transformer_params('Imputer', ['city-mpg'], {"strategy": "median"})
featurization_config.add_transformer_params('Imputer', ['bore'], {"strategy": "most_frequent"})
featurization_config.add_transformer_params('HashOneHotEncoder', [], {"number_of_bits": 3})

Transparencia de caracterización

Cada modelo AutoML tiene una caracterización aplicada automáticamente. La caracterización incluye ingeniería de características automatizada (cuando "featurization": 'auto') y escalado y normalización que, a su vez, afecta al algoritmo seleccionado y a sus valores de hiperparámetro. AutoML admite distintos métodos para asegurarse de que tiene visibilidad sobre lo que se aplicó al modelo.

Considere este ejemplo de previsión:

  • Hay cuatro características de entrada: A (numérico), B (numérico), C (numérico), D (fecha y hora).
  • La característica numérica C se quita porque es una columna Id. con todos los valores únicos.
  • A las características numéricas A y B les faltan valores y, por tanto, los atribuye la media.
  • La característica de fecha y hora D se divide en 11 diferentes características de diseño.

Para obtener esta información, use la salida fitted_model de la ejecución del experimento de aprendizaje automático automatizado.

automl_config = AutoMLConfig(…)
automl_run = experiment.submit(automl_config …)
best_run, fitted_model = automl_run.get_output()

Diseño de características automatizadas

get_engineered_feature_names() devuelve una lista de nombres de características diseñadas.

Nota

Utilice 'timeseriestransformer' para la tarea = 'forecasting'; en caso contrario, utilice 'datatransformer' para la tarea 'regression' o 'classification'.

fitted_model.named_steps['timeseriestransformer']. get_engineered_feature_names ()

En esta lista se incluyen todos los nombres de las características de diseño.

['A', 'B', 'A_WASNULL', 'B_WASNULL', 'year', 'half', 'quarter', 'month', 'day', 'hour', 'am_pm', 'hour12', 'wday', 'qday', 'week']

get_featurization_summary() obtiene un resumen de características de todas las características de entrada.

fitted_model.named_steps['timeseriestransformer'].get_featurization_summary()

Resultados

[{'RawFeatureName': 'A',
  'TypeDetected': 'Numeric',
  'Dropped': 'No',
  'EngineeredFeatureCount': 2,
  'Tranformations': ['MeanImputer', 'ImputationMarker']},
 {'RawFeatureName': 'B',
  'TypeDetected': 'Numeric',
  'Dropped': 'No',
  'EngineeredFeatureCount': 2,
  'Tranformations': ['MeanImputer', 'ImputationMarker']},
 {'RawFeatureName': 'C',
  'TypeDetected': 'Numeric',
  'Dropped': 'Yes',
  'EngineeredFeatureCount': 0,
  'Tranformations': []},
 {'RawFeatureName': 'D',
  'TypeDetected': 'DateTime',
  'Dropped': 'No',
  'EngineeredFeatureCount': 11,
  'Tranformations': ['DateTime','DateTime','DateTime','DateTime','DateTime','DateTime','DateTime','DateTime',ateTime','DateTime','DateTime']}]
Output Definición
RawFeatureName Nombre de columna o característica de entrada desde el conjunto de datos proporcionado.
TypeDetected Tipo de datos detectado de la característica de entrada.
Dropped Indica si la característica de entrada se ha quitado o se ha utilizado.
EngineeringFeatureCount Número de características que se generan por las transformaciones de diseño de características automatizadas.
Transformaciones Lista de transformaciones aplicadas a las características de entrada para generar características de diseño.

Escalado y normalización

Para entender el escalado o normalización y el algoritmo seleccionado con sus valores de hiperparámetro, use fitted_model.steps.

La siguiente salida de ejemplo procede de la ejecución de fitted_model.steps para una ejecución elegida:

[('RobustScaler', 
  RobustScaler(copy=True, 
  quantile_range=[10, 90], 
  with_centering=True, 
  with_scaling=True)), 

  ('LogisticRegression', 
  LogisticRegression(C=0.18420699693267145, class_weight='balanced', 
  dual=False, 
  fit_intercept=True, 
  intercept_scaling=1, 
  max_iter=100, 
  multi_class='multinomial', 
  n_jobs=1, penalty='l2', 
  random_state=None, 
  solver='newton-cg', 
  tol=0.0001, 
  verbose=0, 
  warm_start=False))]

Para más información, use esta función auxiliar:

from pprint import pprint

def print_model(model, prefix=""):
    for step in model.steps:
        print(prefix + step[0])
        if hasattr(step[1], 'estimators') and hasattr(step[1], 'weights'):
            pprint({'estimators': list(e[0] for e in step[1].estimators), 'weights': step[1].weights})
            print()
            for estimator in step[1].estimators:
                print_model(estimator[1], estimator[0]+ ' - ')
        elif hasattr(step[1], '_base_learners') and hasattr(step[1], '_meta_learner'):
            print("\nMeta Learner")
            pprint(step[1]._meta_learner)
            print()
            for estimator in step[1]._base_learners:
                print_model(estimator[1], estimator[0]+ ' - ')
        else:
            pprint(step[1].get_params())
            print()   

Esta función auxiliar devuelve el siguiente resultado para una ejecución determinada usando LogisticRegression with RobustScalar como algoritmo específico.

RobustScaler
{'copy': True,
'quantile_range': [10, 90],
'with_centering': True,
'with_scaling': True}

LogisticRegression
{'C': 0.18420699693267145,
'class_weight': 'balanced',
'dual': False,
'fit_intercept': True,
'intercept_scaling': 1,
'max_iter': 100,
'multi_class': 'multinomial',
'n_jobs': 1,
'penalty': 'l2',
'random_state': None,
'solver': 'newton-cg',
'tol': 0.0001,
'verbose': 0,
'warm_start': False}

Predicción de la probabilidad de las clases

Los modelos generados mediante el aprendizaje automático automatizado tienen objetos contenedores que reflejan la funcionalidad de su clase de origen de código abierto. La mayoría de los objetos contenedores de modelos de clasificación devueltos por el aprendizaje automático automatizado implementan la función predict_proba(), que acepta una muestra de datos similares a una matriz o de matriz dispersa de las características (valores X), y devuelve una matriz de n dimensiones de cada muestra y la probabilidad de la clase respectiva.

Suponiendo que recuperó el mejor modelo de ejecución y ajustado con las mismas llamadas, puede llamar a predict_proba() directamente desde el modelo ajustado, proporcionando una muestra de X_test en el formato adecuado en función del tipo de modelo.

best_run, fitted_model = automl_run.get_output()
class_prob = fitted_model.predict_proba(X_test)

Si el modelo subyacente no admite la función predict_proba() o el formato es incorrecto, se produce una excepción específica de clase de modelo. Vea los documentos de referencia RandomForestClassifier y XGBoost para obtener ejemplos de cómo se implementa esta función para los distintos tipos de modelos.

Integración de BERT en el aprendizaje automático automatizado

BERT se usa en la capa de caracterización del ML automatizado. En esta capa, si una columna contiene texto libre u otros tipos de datos, como marcas de tiempo o números simples, la caracterización se aplica en consecuencia.

En el caso de BERT, el modelo se ajusta y se entrena con las etiquetas proporcionadas por el usuario. Desde aquí, las inserciones de documentos se muestran como características junto con otras, como las basadas en marcas de tiempo, día de la semana.

Aprenda a Configurar AutoML para entrenar un modelo de procesamiento de lenguaje natural con Python.

Pasos para invocar BERT

Para invocar BERT, establezca enable_dnn: True en automl_settings y use un proceso de GPU (vm_size = "STANDARD_NC6" o una GPU superior). Si en lugar de BERT se usa un proceso de CPU, AutoML habilita el caracterizador BiLSTM DNN.

El ML automatizado realiza los siguientes pasos para BERT.

  1. El preprocesamiento y la tokenización de todas las columnas de texto. Por ejemplo, el transformador de StringCast se puede encontrar en el resumen de caracterización del modelo final. Puede encontrar un ejemplo de cómo generar el resumen de caracterización del modelo en este cuaderno.

  2. Concatene todas las columnas de texto en una sola columna de texto, por lo tanto, StringConcatTransformer en el modelo final.

    Nuestra implementación de BERT limita la longitud total del texto de un ejemplo de entrenamiento a 128 tokens. Esto significa que todas las columnas de texto, cuando se concatenan, deben tener una longitud máxima de 128 tokens. Si existen varias columnas, cada columna debe eliminarse de forma que se satisfaga esta condición. En caso contrario, en las columnas concatenadas de más de 128 tokens, la capa del tokenizador de BERT trunca esta entrada a 128 tokens.

  3. Como parte del barrido de características, AutoML compara BERT con la línea de base (características de contenedor de palabras) en una muestra de los datos. Esta comparación determina si BERT proporcionaría mejoras en la precisión. Si BERT funciona mejor que la línea de base, AutoML usa BERT para la caracterización de texto para todos los datos. En ese caso, verá el PretrainedTextDNNTransformer en el modelo final.

Normalmente, BERT se ejecuta más tiempo que otros administradores de características. Para mejorar el rendimiento, se recomienda usar STANDARD_NC24r o STANDARD_NC24rs_V3 para sus funcionalidades de RDMA.

AutoML distribuye el entrenamiento de BERT en varios nodos si están disponibles (hasta un máximo de ocho nodos). Esto se puede hacer en el objeto AutoMLConfig estableciendo el parámetro max_concurrent_iterations en un valor mayor que 1.

Idiomas compatibles para BERT en el aprendizaje automático automatizado

AutoML admite actualmente unos 100 idiomas y, en función del idioma del conjunto de datos, elige el modelo BERT adecuado. Para los datos en alemán, se usa el modelo BERT en alemán. Para inglés, se usa el modelo BERT en inglés. Para todos los demás idiomas, se usa el modelo multilingüe de BERT.

En el código siguiente, se desencadena el modelo BERT en alemán, ya que el idioma del conjunto de datos se especifica como deu, el código de idioma de 3 letras para el alemán según la clasificación ISO:

from azureml.automl.core.featurization import FeaturizationConfig

featurization_config = FeaturizationConfig(dataset_language='deu')

automl_settings = {
    "experiment_timeout_minutes": 120,
    "primary_metric": 'accuracy',
# All other settings you want to use
    "featurization": featurization_config,
    
    "enable_dnn": True, # This enables BERT DNN featurizer
    "enable_voting_ensemble": False,
    "enable_stack_ensemble": False
}