Configuración del entrenamiento de AutoML con la versión 2 del SDK de Python para Azure Machine Learning

SE APLICA A: SDK de Python azure-ai-ml v2 (actual)

En esta guía, aprenderá a configurar un trabajo de entrenamiento de aprendizaje automático automatizado, AutoML, con el SDK v2 de Python para Azure Machine Learning. El aprendizaje automático automatizado elige un algoritmo e hiperparámetros, y genera un modelo listo para la implementación. En esta guía se proporcionan detalles de las distintas opciones que puede usar para configurar experimentos de ML automatizado.

Si prefiere una experiencia sin código, también puede configurar el entrenamiento de AutoML sin código en Estudio de Azure Machine Learning.

Si prefiere enviar trabajos de entrenamiento con la extensión de la CLI v2 de Azure Machine Learning, consulte Entrenamiento de modelos.

Prerrequisitos

Para este artículo, necesitará lo siguiente:

Configurar el área de trabajo

Para conectarse a un área de trabajo, debe proporcionar una suscripción, un grupo de recursos y un nombre para el área de trabajo. Estos detalles se usan en MLClient desde azure.ai.ml para obtener un identificador del área de trabajo necesaria de Azure Machine Learning.

En el ejemplo siguiente, se usa la autenticación predeterminada de Azure junto con la configuración del área de trabajo predeterminada o desde cualquier archivo config.json que haya copiado en la estructura de carpetas. Si no se encuentra config.json, debe introducir manualmente los parámetros subscription_id y resource_group, junto con el área de trabajo al crear MLClient.

from azure.identity import DefaultAzureCredential
from azure.ai.ml import MLClient

credential = DefaultAzureCredential()
ml_client = None
try:
    ml_client = MLClient.from_config(credential)
except Exception as ex:
    print(ex)
    # Enter details of your Azure Machine Learning workspace
    subscription_id = "<SUBSCRIPTION_ID>"
    resource_group = "<RESOURCE_GROUP>"
    workspace = "<AZUREML_WORKSPACE_NAME>"
    ml_client = MLClient(credential, subscription_id, resource_group, workspace)

Formato y origen de datos

Para proporcionar datos de entrenamiento a AutoML en la versión 2 del SDK, debe cargarlos en la nube a través de MLTable.

Requisitos para cargar datos en una tabla MLTable:

  • Los datos deben estar en formato tabular.
  • El valor que se va a predecir, la columna de destino, debe estar en los datos.

Los datos de entrenamiento deben ser accesibles desde el proceso remoto. La versión 2 de Automated ML (SDK de Python y CLI/YAML) acepta recursos de datos MLTable (versión 2), aunque para la compatibilidad con versiones anteriores también admite conjuntos de datos tabulares desde la versión 1 (un conjunto de datos tabular registrado) a través de las mismas propiedades del conjunto de datos de entrada. Sin embargo, la recomendación es usar la versión 2 de MLTable.

El siguiente código YAML es la definición de una tabla MLTable que se puede colocar en una carpeta local o en una carpeta remota en la nube, junto con el archivo de datos (.CSV o archivo Parquet).

# MLTable definition file

paths:
  - file: ./bank_marketing_train_data.csv
transformations:
  - read_delimited:
        delimiter: ','
        encoding: 'ascii'

Por lo tanto, en este escenario, la carpeta MLTable contendría el archivo de definición MLTable y el archivo de datos (en este caso, el archivo bank_marketing_train_data.csv).

A continuación se muestran dos maneras de crear una tabla MLTable.

  • A Proporcionar los datos de entrenamiento y el archivo de definición de MLTable desde la carpeta local; se cargará automáticamente en la nube (almacén de datos del área de trabajo predeterminado).
  • B. Proporcionar una instancia de MLTable ya registrada y cargada en la nube.
from azure.ai.ml.constants import AssetTypes
from azure.ai.ml import automl, Input

# A. Create MLTable for training data from your local directory
my_training_data_input = Input(
    type=AssetTypes.MLTABLE, path="./data/training-mltable-folder"
)

# B. Remote MLTable definition
my_training_data_input  = Input(type=AssetTypes.MLTABLE, path="azureml://datastores/workspaceblobstore/paths/Classification/Train")

Datos de entrenamiento, validación y prueba

Puede especificar conjuntos de datos de entrenamiento y validación independientes; sin embargo, los datos de entrenamiento deben proporcionarse al parámetro training_data en la función de fábrica del trabajo de ML automatizado.

Si no especifica explícitamente un parámetro validation_data o n_cross_validation, el aprendizaje automático automatizado aplica las técnicas predeterminadas para determinar cómo se realiza la validación. Esta determinación depende del número de filas del conjunto de datos asignadas a su parámetro training_data.

Tamaño de datos de entrenamiento Técnica de validación
Mayor que 20 000 filas Se aplica la división de datos de entrenamiento o validación. El valor predeterminado consiste en usar el 10 % del conjunto de datos de entrenamiento inicial como conjunto de validación. A su vez, ese conjunto de validación se usa para calcular las métricas.
Menor o igual que 20 000 filas Se aplica el enfoque de validación cruzada. El número predeterminado de iteraciones depende del número de filas.
Si el conjunto de datos tiene menos de 1000 filas, se usan diez iteraciones.
Si hay entre o igual a 1000 y 20 000 filas, se usan tres iteraciones.

Proceso para ejecutar el experimento

Actualmente, los trabajos de ML automatizados con la versión 2 del SDK de Python (o la versión 2 de la CLI) solo se admiten en un proceso remoto de Azure Machine Learning (clúster o instancia de proceso).

Obtenga más información sobre cómo crear el proceso con el SDKv2 de Python (o CLIv2).

Establecer la configuración de experimento

Hay varias opciones que puede usar para configurar su experimento de ML automatizados. Estos parámetros de configuración se establecen en el método de tarea. También puede establecer la configuración de entrenamiento del trabajo y los criterios de salida con las funciones set_training() y set_limits() respectivamente.

En el ejemplo siguiente se muestran los parámetros necesarios para una tarea de clasificación que especifica la precisión como métrica principal y 5 plegamientos de validación cruzada.

# note that the below is a code snippet -- you might have to modify the variable values to run it successfully
classification_job = automl.classification(
    compute=my_compute_name,
    experiment_name=my_exp_name,
    training_data=my_training_data_input,
    target_column_name="y",
    primary_metric="accuracy",
    n_cross_validations=5,
    enable_model_explainability=True,
    tags={"my_custom_tag": "My custom value"}
)

# Limits are all optional

classification_job.set_limits(
    timeout_minutes=600, 
    trial_timeout_minutes=20, 
    max_trials=5,
    enable_early_termination=True,
)

# Training properties are optional
classification_job.set_training(
    blocked_training_algorithms=["LogisticRegression"], 
    enable_onnx_compatible_models=True
)

Seleccione el tipo de tarea de aprendizaje automático (problema de ML)

Para poder enviar el trabajo de ML automatizado, debe determinar el tipo de problema de aprendizaje automático que está solucionando. Este problema determina qué función usa el trabajo de ML automatizado y qué algoritmos de modelo aplica.

Automated ML admite tareas basadas en datos tabulares (clasificación, regresión y previsión), tareas de Computer Vision (como clasificación de imágenes y detección de objetos) y tareas de procesamiento de lenguaje natural (como clasificación de texto y tareas de reconocimiento de entidades). Más información sobre los tipos de tareas.

Algoritmos admitidos

El aprendizaje automático automatizado prueba diferentes algoritmos y modelos durante el proceso de optimización y automatización. Como usuario, no hay ninguna necesidad de especificar el algoritmo.

El método de tarea determina la lista de algoritmos o modelos que se van a aplicar. Use los parámetros allowed_training_algorithms o blocked_training_algorithms en la función de agregado set_training() para modificar aún más las iteraciones con los modelos disponibles para incluir o excluir.

En la siguiente lista de vínculos, puede explorar los algoritmos admitidos por tarea de aprendizaje automático que se muestra a continuación.

clasificación Regresión Previsión de series temporales
Regresión logística* Red elástica* AutoARIMA
Light GBM* Light GBM* Prophet
Potenciación del gradiente* Potenciación del gradiente* Red elástica
Árbol de decisión* Árbol de decisión* Light GBM
K Vecinos más próximos* K Vecinos más próximos* K Vecinos más próximos
SVC lineal* Lazo LARS* Árbol de decisión
Clasificación de vectores de soporte (SVC)* Descenso de gradiente estocástico (SGD)* Arimax
Bosque aleatorio* Bosque aleatorio Lazo LARS
Árboles extremadamente aleatorios* Árboles extremadamente aleatorios* Árboles extremadamente aleatorios*
Xgboost* Xgboost* Bosque aleatorio
Naive Bayes* Xgboost ForecastTCN
Descenso de gradiente estocástico (SGD)* Descenso de gradiente estocástico (SGD) Potenciación del gradiente
ExponentialSmoothing
SeasonalNaive
Average
Naive
SeasonalAverage

Con algoritmos adicionales a continuación.

Siga este vínculo para ver cuadernos de ejemplo de cada tipo de tarea.

Métrica principal

El parámetro primary_metric determina la métrica que se utilizará durante el entrenamiento del modelo para la optimización. La métrica principal que puede seleccionar viene determinada por el tipo de tarea que elija.

La elección de una métrica principal para que el aprendizaje automático automatizado la optimice depende de muchos factores. Se recomienda que la consideración principal sea elegir la métrica que mejor represente las necesidades de su empresa. A continuación, considere si la métrica es adecuada para su perfil de conjunto de datos (tamaño de datos, intervalo, distribución de clases, etc.). En las secciones siguientes se resumen las métricas principales recomendadas en función del tipo de tarea y el escenario empresarial.

Obtenga información acerca de las definiciones específicas de estas métricas en Descripción de los resultados de aprendizaje automático automatizado.

Métricas para escenarios de clasificación de varias clases

Estas métricas se aplican a todos los escenarios de clasificación, incluidos datos tabulares, imágenes/Computere Vision y texto NLP.

Las métricas dependientes de umbrales, como accuracy, recall_score_weighted, norm_macro_recall y precision_score_weighted, podrían no optimizarse adecuadamente para los conjuntos de datos que son pequeños, tienen un sesgo de clase muy grande (desequilibrio de clases) o si el valor de métrica esperado está muy cerca de 0,0 o 1,0. En esos casos, AUC_weighted puede ser una mejor opción de métrica principal. Una vez completado el aprendizaje automático automatizado, puede elegir el modelo ganador en función de la métrica que mejor se adapte a sus necesidades empresariales.

Métrica Ejemplo de casos de uso
accuracy Clasificación de imágenes, análisis de sentimiento, predicción de abandono
AUC_weighted Detección de fraudes, clasificación de imágenes, detección de anomalías/detección de correo no deseado
average_precision_score_weighted análisis de opiniones
norm_macro_recall Predicción de abandono
precision_score_weighted

Métricas para escenarios de clasificación de varias etiquetas

  • Para la clasificación de texto con varias etiquetas, actualmente "Precisión" es la única métrica principal admitida.

  • Para la clasificación de imágenes con varias etiquetas, las métricas principales admitidas se definen en la enumeración ClassificationMultilabelPrimaryMetrics

Métricas para escenarios de NER (reconocimiento de entidades con nombre) de texto NLP

  • En el caso de NER (Reconocimiento de entidades con nombre) de texti NLP, actualmente "Precisión" es la única métrica principal admitida.

Métricas para escenarios de regresión

r2_score, normalized_mean_absolute_error y normalized_root_mean_squared_error intentan minimizar los errores de predicción. r2_score y normalized_root_mean_squared_error minimizan el promedio de errores al cuadrado mientras que normalized_mean_absolute_error minimiza el valor absoluto promedio de errores. El valor absoluto trata los errores en todas las magnitudes por igual y los errores al cuadrado tendrán una penalización mucho mayor para los errores con valores absolutos mayores. En función de si los errores mayores se deben penalizar más o no, se puede optar por optimizar el error al cuadrado o el error absoluto.

La principal diferencia entre r2_score y normalized_root_mean_squared_error es la forma en que se normalizan y sus significados. normalized_root_mean_squared_error es la raíz del error cuadrático medio normalizada por intervalo y se puede interpretar como la magnitud media del error para la predicción. r2_score es el error cuadrático medio normalizado por una estimación de varianza de datos. Es la proporción de variación que puede capturar el modelo.

Nota:

r2_score y normalized_root_mean_squared_error también se comportan de forma similar a las métricas principales. Si se aplica un conjunto de validación fijo, estas dos métricas optimizan el mismo destino, error cuadrático medio, y se optimizarán con el mismo modelo. Cuando solo hay un conjunto de entrenamiento disponible y se aplica la validación cruzada, serían ligeramente diferentes, ya que el normalizador de normalized_root_mean_squared_error se fija como el intervalo del conjunto de entrenamiento, pero el normalizador para r2_score variaría para cada plegamiento, ya que es la varianza de cada plegamiento.

Si la clasificación, en lugar del valor exacto es de interés, spearman_correlation puede ser una mejor opción, ya que mide la correlación de clasificación entre los valores reales y las predicciones.

Sin embargo, actualmente no hay métricas principales de regresión que se refieran a la diferencia relativa. r2_score, normalized_mean_absolute_error y normalized_root_mean_squared_error tratan un error de predicción de 20 000 USD igual para un trabajador con un salario de 30 000 USD que para un trabajador que gana 20 millones de USD, si estos dos puntos de datos pertenecen al mismo conjunto de datos para la regresión o a la misma serie temporal especificada por el identificador de serie temporal. En realidad, un error de predicción de solo 20 000 USD en un salario de 20 millones USD es muy pequeño (hay una pequeña diferencia relativa del 0,1 %), mientras que una diferencia de 20 000 USD de 30 000 USD no está cerca (una gran diferencia relativa del 67 %). Para solucionar el problema de la diferencia relativa, se puede entrenar un modelo con métricas principales disponibles y, a continuación, seleccionar el modelo con mejor mean_absolute_percentage_error o root_mean_squared_log_error.

Métrica Ejemplo de casos de uso
spearman_correlation
normalized_root_mean_squared_error Predicción de precios (casa/producto/propina), revisión de predicciones de puntuación
r2_score Retraso de aerolíneas, estimación de salarios, tiempo de resolución de errores
normalized_mean_absolute_error

Métricas para escenarios de previsión de series temporales

Las recomendaciones son similares a las que se han indicado para escenarios de regresión.

Métrica Ejemplo de casos de uso
normalized_root_mean_squared_error Predicción de precios (previsión), optimización de inventarios, previsión de la demanda
r2_score Predicción de precios (previsión), optimización de inventarios, previsión de la demanda
normalized_mean_absolute_error

Métricas para escenarios de detección de objetos de imagen

  • Para la detección de objetos de imagen, las métricas principales admitidas se definen en la enumeración ObjectDetectionPrimaryMetrics.

Métricas para escenarios de segmentación de instancias de imagen

  • Para escenarios de segmentación de instancias de imagen, las métricas principales admitidas se definen en la enumeración InstanceSegmentationPrimaryMetrics.

Caracterización de datos

En todos los experimentos de ML automatizados, los datos se transforman automáticamente en números y vectores de números más (es decir, convertir texto en numérico) también se escalan y normalizan para ayudar a determinados algoritmos que son sensibles a las características que se encuentran en diferentes escalas. A esta transformación, ajuste de escala y normalización de datos se conoce como "caracterización".

Nota

Los pasos de la caracterización del aprendizaje automático automatizado (normalización de características, control de los datos que faltan, conversión de valores de texto a numéricos, etc.) 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.

Al configurar los trabajos de ML automatizados, puede habilitar o deshabilitar la configuración featurization mediante la función de agregado .set_featurization().

En la tabla siguiente se muestra la configuración aceptada para la caracterización.

Configuración de la caracterización Descripción
"mode": 'auto' Indica que, como parte del preprocesamiento, los pasos de caracterización y protección se realizan automáticamente. Valor predeterminado.
"mode": 'off' Indica que el paso de caracterización no se debe realizar de forma automática.
"mode": 'custom' Indica que se debe usar un paso personalizado de caracterización.

En el código siguiente se muestra cómo se puede proporcionar la caracterización personalizada en este caso para un trabajo de regresión.

from azure.ai.ml.automl import ColumnTransformer

transformer_params = {
    "imputer": [
        ColumnTransformer(fields=["CACH"], parameters={"strategy": "most_frequent"}),
        ColumnTransformer(fields=["PRP"], parameters={"strategy": "most_frequent"}),
    ],
}
regression_job.set_featurization(
    mode="custom",
    transformer_params=transformer_params,
    blocked_transformers=["LabelEncoding"],
    column_name_and_types={"CHMIN": "Categorical"},
)

Exit criteria (Criterios de salida)

Hay algunas opciones que puede definir en la función set_limits() para finalizar el experimento antes de la finalización del trabajo.

Criterios description
Sin criterios Si no se define ningún parámetro de salida, el experimento continúa hasta que no se realice ningún progreso adicional en la métrica principal.
timeout Define el tiempo, en minutos, que el experimento debe seguir ejecutándose. Si no se especifica, el tiempo de espera total del trabajo predeterminado es de 6 días (8640 minutos). Para especificar un tiempo de espera menor o igual que 1 hora (60 minutos), asegúrese de que el tamaño del conjunto de datos no sea mayor que 10 000 000 (filas por columna) o se producirá un error.

Este tiempo de espera incluye las ejecuciones de instalación, caracterización y entrenamiento, pero no incluye las ejecuciones de explicación del modelo y ensamblado al final del proceso, ya que esas acciones deben realizarse una vez que tienen lugar todas las pruebas (trabajos secundarios).
trial_timeout_minutes Tiempo máximo en minutos durante el que se puede ejecutar cada prueba (trabajo secundario) antes de que finalice. Si no se especifica, se usa un valor de 1 mes o 43200 minutos.
enable_early_termination Indica si se va a finalizar el trabajo si la puntuación no mejora a corto plazo.
max_trials El número máximo de pruebas o ejecuciones cada una con una combinación diferente de algoritmos e hiperparámetros para probar durante un trabajo de AutoML. Si no se especifica, el valor predeterminado de pruebas es 1000. Si se usa enable_early_termination, el número de pruebas usadas puede ser menor.
max_concurrent_trials Representa el número máximo de iteraciones que se ejecutarán en paralelo. Se recomienda hacer coincidir este número con el número de nodos del clúster.

Ejecutar experimento

Nota:

Si ejecuta un experimento con las mismas opciones de configuración y métricas principales varias veces, es probable que vea una variación en las puntuaciones de las métricas finales de los experimentos y en los modelos generados. Los algoritmos que ML automatizado emplea llevan inherente la aleatoriedad, que puede provocar una ligera variación en los modelos que ha generado el experimento y en la puntuación de las métricas finales del modelo recomendado, como la precisión. Es probable que también vea resultados con el mismo nombre de modelo, pero diferentes hiperparámetros usados.

Advertencia

Si ha establecido reglas en el firewall o en el grupo de seguridad de red a través del área de trabajo, compruebe que se conceden los permisos necesarios al tráfico de red entrante y saliente, tal como se define en Configuración del tráfico de red entrante y saliente.

Envíe el experimento para ejecutar y generar un modelo. Con MLClient creado en los requisitos previos, puede ejecutar el siguiente comando en el área de trabajo.


# Submit the AutoML job
returned_job = ml_client.jobs.create_or_update(
    classification_job
)  # submit the job to the backend

print(f"Created job: {returned_job}")

# Get a URL for the status of the job
returned_job.services["Studio"].endpoint

Varias ejecuciones secundarias en clústeres

Las ejecuciones secundarias de experimentos de aprendizaje automático automatizado se pueden realizar en un clúster que ya está ejecutando otro experimento. Sin embargo, el tiempo depende del número de nodos que tenga el clúster y de si esos nodos están disponibles para ejecutar un experimento diferente.

Cada nodo del clúster actúa como una máquina virtual (VM) individual que puede realizar una sola ejecución de entrenamiento; en el caso del aprendizaje automático automatizado, esto significa una ejecución secundaria. Si todos los nodos están ocupados, el nuevo experimento se pone en cola. Sin embargo, si hay nodos libres, el nuevo experimento ejecutará las ejecuciones secundarias de aprendizaje automático automatizado en paralelo en los nodos o máquinas virtuales disponibles.

Para ayudar a administrar las ejecuciones secundarias y cuándo se pueden realizar, se recomienda crear un clúster dedicado por experimento y hacer coincidir el número de max_concurrent_iterations del experimento con el número de nodos del clúster. De esta manera, se usan todos los nodos del clúster al mismo tiempo con el número de ejecuciones o iteraciones secundarias simultáneas que se desee.

Configure max_concurrent_iterations en la función de agregado .set_limits(). Si no se configura, solo se permite de forma predeterminada una ejecución o iteración secundaria simultánea en cada experimento. En el caso de la instancia de proceso, se puede establecer que max_concurrent_trials sea igual al número de núcleos en la VM de la instancia de proceso.

Exploración de modelos y métricas

El aprendizaje automático automatizado ofrece opciones para supervisar y evaluar los resultados del entrenamiento.

En la página del modelo, mediante la UI de Azure Machine Learning, también podrá visualizar los hiperparámetros que se usan al entrenar un modelo determinado. Asimismo, podrá visualizar y personalizar el código de entrenamiento del modelo interno en uso.

Registro e implementación de modelos

Después de probar un modelo y confirmar que desea usarlo en producción, puede registrarlo para su uso posterior.

Sugerencia

En los modelos registrados, la implementación con un solo clic está disponible a través del Estudio de Azure Machine Learning. Consulte cómo implementar modelos registrados desde el estudio.

AutoML en canalizaciones

Para aprovechar AutoML en los flujos de trabajo de MLOps, puede agregar pasos de trabajo de AutoML a las canalizaciones de Azure Machine Learning. Esto le permite automatizar todo el flujo de trabajo enlazando los scripts de preparación de datos a AutoML y, a continuación, registrando y validando el mejor modelo resultante.

A continuación se muestra una canalización de ejemplo con un componente de clasificación de AutoML y un componente de comando que muestra la salida de AutoML resultante. Tenga en cuenta cómo se hace referencia a las entradas (datos de validación y entrenamiento) y a las salidas (mejor modelo) en diferentes pasos.

# Define pipeline
@pipeline(
    description="AutoML Classification Pipeline",
    )
def automl_classification(
    classification_train_data,
    classification_validation_data
):
    # define the automl classification task with automl function
    classification_node = classification(
        training_data=classification_train_data,
        validation_data=classification_validation_data,
        target_column_name="y",
        primary_metric="accuracy",
        # currently need to specify outputs "mlflow_model" explictly to reference it in following nodes 
        outputs={"best_model": Output(type="mlflow_model")},
    )
    # set limits and training
    classification_node.set_limits(max_trials=1)
    classification_node.set_training(enable_stack_ensemble=False, enable_vote_ensemble=False)

    command_func = command(
        inputs=dict(
            automl_output=Input(type="mlflow_model")
        ),
        command="ls ${{inputs.automl_output}}",
        environment="AzureML-sklearn-0.24-ubuntu18.04-py37-cpu:latest"
    )
    show_output = command_func(automl_output=classification_node.outputs.best_model)


pipeline_classification = automl_classification(
    classification_train_data=Input(path="./training-mltable-folder/", type="mltable"),
    classification_validation_data=Input(path="./validation-mltable-folder/", type="mltable"),
)

# ...
# Note that the above is only a snippet from the bankmarketing example you can find in our examples repo -> https://github.com/Azure/azureml-examples/tree/main/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-classification-bankmarketing-in-pipeline

Para obtener más ejemplos sobre cómo incluir AutoML en las canalizaciones, consulte nuestro repositorio de ejemplos.

Pasos siguientes