Cómo compilar un modelo de aprendizaje automático sin servidores

En este artículo, se analiza cómo compilar una tarea de aprendizaje automático (AA) personalizada en Google Cloud Platform (GCP) sin servidores. También se explican los beneficios que ofrece AI Platform en comparación con las API de Perception. Se tratan los siguientes temas:

  • Comprender los pasos para compilar un modelo de AA
  • Mejorar la calidad del modelo
  • Pasa de un problema de prueba a un entorno escalable

Este artículo le sigue a Arquitectura de un modelo de aprendizaje automático sin servidores, en el que se explica cómo usar Firebase, Cloud Functions, la API de Natural Language y AI Platform para enriquecer los tickets de asistencia sin servidores.

Comprende los pasos de compilación

Con GCP, existen dos formas principales de realizar tareas de aprendizaje automático:

  • Utilizar las API de percepción RESTful compiladas previamente y entrenadas que están disponibles, como la API de Cloud Vision o la API de Cloud Speech. Puedes usar estos modelos previamente entrenados para el análisis de opiniones y el etiquetado automático mencionados en la primera parte de esta solución.
  • Compilar o reutilizar modelos. Puedes entrenar estos modelos con los datos personalizados mediante TensorFlow y AI Platform. Se prefiere este enfoque para predecir el tiempo de resolución y la prioridad, como se detalló en la primera parte de la solución.

En el siguiente diagrama, se muestra el segundo enfoque, en el que recopilas y almacenas el conjunto de datos, organizas los datos, y diseñas, entrenas y finalmente implementas el modelo.

Tareas de aprendizaje automático

Recopila y almacena datos

Los datos resultan clave para generar un modelo convincente. Cuantos más datos haya disponibles, más posibilidades habrá de entrenar un modelo que proporcione mejores predicciones, siempre y cuando los datos sean relevantes y estén limpios. Consulta la sección Mejorar la calidad del modelo para obtener más información.

Obtener datos puede resultar fácil en algunos casos, pero puede ser difícil cuando algunos conjuntos de datos se limitan a algunos cientos de ejemplos. En el caso de los tickets de asistencia, seguramente tengas algunos cientos de miles de ejemplos históricos, lo que debería ser suficiente para entrenar un modelo decente.

Si usas un sistema de administración de relaciones con clientes (CRM) o cualquier otro sistema que se encargue de los tickets, probablemente puedas exportar los tickets que se hayan creado desde que se lanzó tu producto o ejecutar una consulta para acceder a ellos. El objetivo es obtener acceso a los campos de los tickets. Estos campos suelen contener información como el ID del ticket, ID de cliente, categoría, prioridad, tiempo de resolución, ID del agente, experiencia del cliente con el producto, y más. Estas exportaciones suelen tener como resultado archivos CSV:

t0,Patrick Blevins,12,3-Advanced,Performance,Request,4-Critical,P1,5
t1,Kaitlyn Ruiz,3,2-Experienced,Technical,Issue,1-Minor,P4,6
t2,Chelsea Martin,11,2-Experienced,Technical,Request,4-Critical,P1,2
t3,Richard Arnold,8,2-Experienced,Performance,Request,1-Minor,P3,5
...

Asegúrate de tomar en cuenta lo siguiente cuando recopilas datos:

  • Si estás realizando una clasificación binaria, no recopiles solo ejemplos positivos. Incluye también los negativos.
  • De forma más general, cuando sea posible, intenta encontrar un número equilibrado de ejemplos para cada clase. De lo contrario, tendrás que compensar cualquier desequilibrio en tu código.
  • Busca más ejemplos de valores atípicos. Son casos reales, por lo que el sistema debería poder predecirlos.

En el instructivo, ya se han recopilado los datos históricos y están disponibles como un archivo CSV único en Cloud Storage.

Realizar un procesamiento previo de los datos

Realizar un procesamiento previo de los datos antes de entrenar un modelo es fundamental. La cantidad de trabajo y las tecnologías que se usarán se determinarán según estos dos parámetros:

  • Calidad: Si tus datos contienen campos irrelevantes, o si necesitan limpieza o combinación de atributos, es importante resolver estas cuestiones antes de enviarlos al entrenamiento.
  • Tamaño: Si tus datos son demasiado grandes, o si podrían volverse demasiado grandes debido a las codificaciones "one-of-k", puede ser que una instancia no pueda procesarlos por sí sola.

Si deseas obtener más información acerca de las recomendaciones sobre el procesamiento previo, consulta la sección Pasar de un problema de prueba a una solución escalable.

Cloud Datalab es una herramienta excelente para preparar los datos debido a que puede ejecutar comandos de gcloud directamente desde su IU y ejecutar notebooks de Jupyter en un entorno administrado. Cloud Datalab viene con ML Workbench, una biblioteca que simplifica las interacciones con TensorFlow.

Cloud Datalab también puede actuar como un organizador interactivo:

  • Si los datos son lo suficientemente pequeños, puedes aprovechar las bibliotecas como Pandas de forma interactiva.
  • Si los datos no caben en la memoria, puedes usar herramientas como Apache Beam para procesar los datos por fuera de Cloud Datalab. De todos modos, también puedes usar los resultados de forma interactiva.

Las siguientes son algunas de las tareas que tal vez tengas que realizar:

  • Filtrar las columnas que no constituirán datos de entrada disponibles en el momento de la predicción. Ejemplo: ID de agente
  • Asegurarte de que tus etiquetas se transformen correctamente y estén disponibles. Ejemplo: borrar valores vacíos
  • Eliminar las excepciones o encontrar más ejemplos en caso de que no se trate de excepciones, sino de eventos recurrentes. Ejemplo: texto de categoría no existente
  • Dividir los datos entre entrenamiento, evaluación y prueba. Ejemplo: 80%, 10%, 10%
  • Transformar los datos de entrada y las etiquetas en atributos utilizables. Ejemplo: tiempo de resolución (hora de cierre – hora de inicio)
  • Quitar las filas duplicadas

En la siguiente tabla, se muestran algunos de los datos de entrada proporcionados:

Nombre del campo Mantener Motivo Tipo
Ticket ID NO Es un valor único por ticket y no ayudará a entrenar el algoritmo predictivo. N/A
Customer ID QUIZÁ Aprende de clientes recurrentes. Discreto
Category Puede tener efectos sobre la complejidad del ticket. Categórico
Agent ID NO No es un valor conocido cuando el usuario envía el ticket.

Nota: Predecir este valor a través de un esquema de clasificación podría ser interesante.
N/A
Years of product experience Puede tener efectos sobre la complejidad del ticket. Continuo

Después de seleccionar las columnas de entrada, necesitas crear al menos dos conjuntos de datos diferentes, preferentemente tres, que no se superpongan y que sean representativos de los datos.

Conjunto de entrenamiento
Representa alrededor de un 80% de todo el conjunto de datos. Tu modelo lo utiliza para ajustar varios parámetros, llamados pesos del modelo, a fin de acercarse lo más posible a la verdad (es decir, la etiqueta). Para realizar esto, el modelo minimiza una función de pérdida que calcula qué tan alejada se encuentra la predicción del modelo de la verdad, o sea, el nivel de error actual. Se usa el mejor conjunto de pesos para el modelo predictivo final.
Conjunto de evaluación
Suele representar entre un 10 y un 20% del conjunto de datos. Este conjunto evita que el modelo se sobreajuste. El sobreajuste ocurre cuando un modelo funciona bien en el conjunto de entrenamiento y genera solo un pequeño error, pero tiene dificultades con datos nuevos o desconocidos. Es decir, el modelo se sobreajusta a los datos. En lugar de entrenar un modelo para que identifique atributos generales en un tipo de datos determinado, un modelo demasiado entrenado aprende solo a identificar atributos específicos en el conjunto de entrenamiento.
Conjunto de prueba
Suele representar entre un 10 y un 15% de los datos. El conjunto de prueba valida la capacidad del modelo de generalizar. Debido a que se usa un conjunto de evaluación durante el entrenamiento, el modelo podría tener un sesgo implícito. Para evaluar la efectividad del modelo, debes medir su rendimiento en un conjunto de pruebas separado.

Usa una de las técnicas siguientes para dividir los datos:

  • Distribuye los datos de forma aleatoria.
  • Distribuye los datos mediante un valor de origen generador.
  • Usa un hash de una columna para decidir si un ejemplo va al conjunto de entrenamiento, evaluación o prueba.

El uso del hash es el enfoque recomendado porque no se verá afectado cuando obtenga una versión actualizada del conjunto de datos. Este enfoque también proporciona un conjunto de prueba coherente con el paso del tiempo.

Diseña el modelo

La predicción del tiempo de resolución y de prioridad son tareas de aprendizaje automático supervisado. Esto significa que los datos de entrada están etiquetados. Los campos de datos relevantes se dividen en dos categorías:

Datos de entrada
ID de ticket, antigüedad, experiencia, categoría, tipo, impacto
Etiquetas
Tiempo de resolución y prioridad

Los datos de entrada asociados con etiquetas son ejemplos de entrenamiento útiles en un contexto de aprendizaje supervisado. Estos tipos de etiquetas representan la verdad que el modelo debe descubrir. El objetivo de un modelo predictivo es utilizar los datos de entrada con el fin de predecir etiquetas desconocidas. Para lograrlo, el modelo se entrena con ejemplos válidos. En este caso práctico, las predicciones incluyen lo siguiente:

Tiempo de resolución
Si el agente del equipo de asistencia observa un valor alto, es probable que se necesiten más recursos para resolver un problema desconocido.
Prioridad
Ayuda al agente a priorizar tickets y recursos en línea con el proceso establecido.

Diseñar un modelo requiere enmarcar el problema para decidir qué modelo debería realizar predicciones. Este caso práctico tiene dos problemas de aprendizaje automático supervisado diferentes:

Regresión
El tiempo de resolución es un valor numérico continuo. Puede definirse como un problema de regresión en el que el modelo predice un valor continuo.
Clasificación
La prioridad puede tener varios valores, como P1, P2, P3 y P4. La multiclasificación es una buena estrategia para abordar este problema. El modelo da como resultado una probabilidad para cada clase de prioridad en la que todas las probabilidades suman 1. Después de que se hayan asignado las probabilidades, puedes decidir qué prioridad le asignas a cada ticket. Por ejemplo, si P1 = 10%, P2 = 20%, P3 = 60% y P4 = 10%, asigna al ticket de asistencia una prioridad de P3.

Cuando usas TensorFlow y AI Platform, el proceso de desarrollo del modelo es similar para ambos problemas. Las mismas funciones se usan en una de las API de Estimator. Pasar de la clasificación a la regresión es tan simple como cambiar un par de líneas de código.

Ahora que se conocen los datos de entrada y tienes algunos conjuntos de datos en funcionamiento, necesitas convertir los datos en entidades que puedan usarse en el grafo de TensorFlow, incluidos los valores no numéricos.

Nombre del campo Tipo Descripción
Category Categórico Conoces el vocabulario completo (todos los valores posibles).
Product experience Continuo Valores numéricos que quieres conservar. Todos los años de Product experience son importantes.

ML Workbench proporciona una forma sencilla de convertir estos datos de entrada en entidades que TensorFlow pueda usar. ML Workbench usa las funciones de columna de atributos de TensorFlow para cada tipo de campo.

features:
  ticketid:
    transform: key
  seniority:
    transform: identity
  category:
    transform: one_hot
  [...]
  priority:
    transform: target

ML Workbench también ofrece una función única que analiza y prepara los datos para tu modelo:

%%ml analyze [--cloud]
output: [OUTPUT_ANALYSIS]
data: $[CREATED_DATASET]
features:
...

Genera el modelo

En el caso práctico de este artículo, tienes suficientes tickets para realizar una predicción aceptable, pero no los suficientes como para preocuparte por el tamaño de los datos, por lo que puedes usar el entrenador local. Ten en cuenta que con un parámetro --cloud simple, puedes cambiar del entrenamiento local a la nube.

%%ml train [--cloud]
output: [OUTPUT_TRAIN]
analysis: [OUTPUT_ANALYSIS]
data: $[CREATED_DATASET]
  model_args:
    model: dnn_regression
    max-steps: 2000
    hidden-layer-size1: 32
    hidden-layer-size2: 8
    train-batch-size: 100
    eval-batch-size: 100
    learning-rate: 0.001

Para obtener más información sobre los parámetros hidden-layer-sizeX y max-steps, consulta la sección Ajusta los hiperparámetros.

Implementa el modelo

Compilar un grafo en TensorFlow y moverlo a AI Platform para el entrenamiento son factores clave en el desarrollo una aplicación. Sin embargo, ¿cuál es la ventaja de un modelo de predicción potente que solo pueden usar los científicos de datos? El caso práctico actual está pensado para proporcionar predicciones en tiempo real a tu equipo de asistencia. Para hacerlo, se debe poder acceder a los modelos desde funciones de Cloud Functions escritas en Node.js. Este modelo se compiló y escribió en Python.

AI Platform ofrece la opción de implementar un modelo como una API de RESTful para brindar predicciones a gran escala, sin importar si tienes uno o millones de usuarios. Puedes implementar el modelo mediante una línea de comandos simple. Debes sustituir el nombre del modelo y del depósito por [MODEL_NAME] y [BUCKET].

gcloud ml-engine models create [MODEL_NAME]
DEPLOYMENT_SOURCE=[BUCKET]
gcloud ml-engine versions create "version_name" --model [MODEL_NAME] --origin $DEPLOYMENT_SOURCE

El modelo está disponible para la predicción en línea y sin conexión. En la siguiente sección, podrás obtener información sobre cómo llamarlo por medio de Cloud Functions sin servidores.

Enriquecimiento sin servidores

Una vez implementado el modelo, estará disponible a través de una API de RESTful, que es una de las ventajas de usar AI Platform. La API hace que el modelo esté disponible para todo tipo de clientes, incluidas las funciones de Cloud Functions. En el caso práctico de la solución, la base de datos de Firebase registra un ticket y, luego, activa una función de Cloud Functions mediante la API de Natural Language y los modelos personalizados para enriquecer los datos. En el siguiente diagrama, se ilustra este modelo:

enriquecimiento sin servidores

Los dos ejemplos que aparecen a continuación llaman a la API de Natural Language y a un modelo personalizado desde Cloud Functions.

  • API de Natural Language:

    const text = ticket.description;
    const document = language.document({content: text});
    
    document.detectSentiment()
     .then((results) => {
        const sentiment = results[1].documentSentiment;
        admin.database().ref(`/tickets/${key}/pred_sentiment`).set(sentiment.score);
     })
     .catch((err) => {
        console.error('ERROR detectSentiment:', err);
     });
  • Modelo de regresión de tiempo de resolución:

    ml.projects.predict({
      name: `projects/${MDL_PROJECT_NAME}/models/${RESOLUTION_TIME_MODEL_NAME}`,
      resource: {
        name: `projects/${MDL_PROJECT_NAME}/models/${RESOLUTION_TIME_MODEL_NAME}`,
        instances: [
          `${key},${ticket.seniority},${ticket.experience},${ticket.category},
          ${ticket.type},${ticket.impact}`
        ]
      }
    },

Mejorar la calidad del modelo

En esta sección, se describen algunos pasos adicionales que puedes seguir para contribuir a mejorar tus modelos.

Preparación de datos

Antes de empezar a entrenar un modelo, tienes que preparar tus datos:

Recopila ejemplos
Si los datos tienen valores atípicos o si debes predecir varias clases, asegúrate de recopilar ejemplos para todos los casos.
Limpia los datos
La limpieza de los datos puede ser tan simple como borrar duplicados para evitar tener ejemplos idénticos en los conjuntos de entrenamiento y de evaluación, o puede garantizar que todos los valores tengan sentido (por ejemplo, los años de antigüedad no pueden ser menores a cero).
Aporta información valiosa humana
Un modelo de aprendizaje automático tendrá un mejor rendimiento si tiene las características adecuadas. Se recomienda cruzar los atributos mediante la función cross_function provista por TensorFlow. Por ejemplo, a fin de predecir la tarifa de un taxi, esta función podría mejorar la calidad del modelo si cruza la longitud con la latitud. O bien, en el caso del equipo de asistencia, la función puede cruzar la antigüedad con la experiencia del producto.
Crea depósitos de datos
Las funciones como bucketized_column de TensorFlow pueden ayudar a discretizar los datos de entrada y mejorar el rendimiento, sobre todo, en casos extremos en los que no tengas muchos ejemplos.

Ajustar hiperparámetros

Algunos valores de parámetros de entrenamiento son difíciles de encontrar, pero son fundamentales para compilar un modelo exitoso. La combinación correcta puede aumentar el rendimiento del modelo drásticamente. Los valores comunes que puedes ajustar incluyen los siguientes:

  • El tamaño de las capas ocultas (en el caso de una red neuronal)
  • El número de neuronas (en el caso de una red neuronal)
  • Los pasos de entrenamiento
  • El tamaño de los depósitos para datos de entrada categóricos cuando no tienes el diccionario completo (por ejemplo: ciudad de origen)

Todos los valores que elijas pueden ser hiperparámetros. Existen varias formas de encontrar la combinación justa:

  • Lleva a cabo una búsqueda por cuadrícula con los bucles "Para".

    Puedes configurar diferentes valores, explorar todas las combinaciones y obtener el mejor resultado. Según la cantidad de hiperparámetros y el tamaño de sus rangos, puede llevar mucho tiempo y ser costoso en cuanto al procesamiento.

  • El enfoque recomendado es ajustar los hiperparámetros mediante AI Platform. AI Platform ajusta los hiperparámetros de forma automática según una configuración declarativa de YAML. El sistema salta rápidamente a las mejores combinaciones de parámetros y se detiene antes de realizar todos los pasos de entrenamiento, lo que ahorra tiempo, poder de procesamiento y dinero.

Aumentar la cantidad de ejemplos

Cuantos más datos tenga un modelo para entrenarse y cuantos más casos prácticos vea, mejores serán las predicciones resultantes. Alimentar el modelo con millones de ejemplos puede dificultar el entrenamiento de forma local. Una solución consiste en usar ML Workbench, que puede hacer uso de los siguientes recursos:

  • TensorFlow para distribuir las tareas de entrenamiento y ejecutar pasos en lotes
  • BigQuery para analizar los datos de entrenamiento
  • AI Platform para ejecutar el entrenamiento y la predicción en una infraestructura escalable y a pedido

En el siguiente diagrama, se muestra cómo tener más casos prácticos y datos de entrenamiento genera mejores predicciones.

datos y casos prácticos

Ten en cuenta que el entrenamiento de AA no es un problema intrínsecamente paralelo como MapReduce. Esto significa que la optimización del descenso de gradientes, por ejemplo, requiere memoria compartida en un servidor de parámetros. Tu plataforma de AA debe ser compatible con este tipo de enfoque.

Pasar de un problema de prueba a un entorno escalable

En la sección anterior, se mencionaron algunas recomendaciones que se deben tener en cuenta a fin de mejorar la calidad del modelo. Algunas de esas tareas pueden parecer fáciles de resolver con un conjunto de datos de muestra o limitado. Sin embargo, puede ser difícil cuando usas muchos datos, lo que es necesario para entrenar modelos de alto rendimiento.

En el siguiente diagrama, se muestra un enfoque escalable.

enriquecimiento sin servidores

Explora datos mediante BigQuery y Cloud Datalab

Se recomienda almacenar los datos y hacer consultas sobre ellos con BigQuery. BigQuery es una base de datos de columnas compilada para trabajar con macrodatos, lo que permite a los usuarios ejecutar consultas ad hoc sobre terabytes de datos en segundos.

Mediante Cloud Datalab y BigQuery, puedes hacer lo siguiente:

  • Explorar y visualizar terabytes de datos con BigQuery desde Cloud Datalab
  • Filtrar los datos de entrada que podrían no tener un gran impacto sobre la predicción
  • Crear un conjunto de datos de muestra representativos para empezar a crear tu modelo
  • Posiblemente, dividir los datos para entrenamiento, evaluación y prueba

Realizar el procesamiento previo de los datos con Cloud Dataprep y Cloud Dataflow

Los datos de entrada casi nunca vienen listos para usar. Suelen requerir un procesamiento antes de poder usarse como atributos, por ejemplo:

  • Limpiar valores como "Ninguno" o "Nulo", que pasan a ser "Desconocido"
  • Dividir en conjuntos de datos para entrenamiento, evaluación y prueba
  • Convertir los datos en archivos de tfRecord, un formato que se recomienda usar con TensorFlow

Cloud Dataprep es una herramienta visual que puede preparar y limpiar los datos a gran escala con pocos gastos de programación. Cloud Dataprep usa Apache Beam en segundo plano, pero ahorra una gran cantidad de código estándar gracias a su IU, que es fácil de usar.

Apache Beam puede ejecutarse en Cloud Dataflow. Cloud Dataflow puede ayudarte a desarrollar y ejecutar una amplia variedad de patrones de procesamiento de datos. Estos patrones incluyen extracción, transformación y carga (ETL), procesamiento por lotes y procesamiento continuo.

Minimiza el sesgo a gran escala con tf.Transform y Dataflow

Los desarrolladores suelen escribir código de procesamiento previo para el entrenamiento. En ocasiones, adaptan este código de modo que se ejecute en un entorno distribuido, pero también escriben un código similar pero diferente, correspondiente a los datos de entrada para la predicción. Este enfoque puede causar dos problemas principales:

  • Es necesario mantener dos bases de código, posiblemente a cargo de equipos diferentes.
  • Sobre todo, puede crear un sesgo entre el entrenamiento y la inferencia.

tf.Transform resuelve ambos problemas, ya que te permite escribir código común para el entrenamiento y la predicción. También puede utilizar Apache Beam para ejecutar el código en un entorno distribuido.

Aprovecha TensorFlow con tf.Transform en Google Cloud Platform

Si bien algunas de las funciones mencionadas antes son parte de TensorFlow (y, por lo tanto, de código abierto), AI Platform ofrece las siguientes ventajas clave cuando se ejecuta TensorFlow:

  • Ejecuta tareas de aprendizaje automático en un entorno sin servidores.
  • Facilita el ajuste de hiperparámetros.
  • Aloja modelos como una API de RESTful accesible desde clientes heterogéneos (no solo Python)

En el siguiente diagrama, se ilustra el enfoque usado para aprovechar TensorFlow.

ventajas de TensorFlow

Ten en cuenta que si aprovechas tf.Transform, una biblioteca de TensorFlow, limitas el sesgo que se puede producir entre el entrenamiento y la predicción, ya que pueden usar la misma base de código.

Próximos pasos