Prétraitement des données pour le ML : options et recommandations

Ce document est le premier d'une série en deux parties qui explore le thème de l'ingénierie des données et de l'ingénierie des fonctionnalités pour l'apprentissage automatique (ML), en mettant l'accent sur les tâches d'apprentissage supervisé. Cette première partie traite des bonnes pratiques de prétraitement des données dans un pipeline ML sur Google Cloud. Le document se concentre sur l'utilisation de TensorFlow et de la bibliothèque open source TensorFlow Transform ( tf.Transform ) pour préparer les données, entraîner le modèle et servir le modèle à des fins de prédiction. Ce document met en évidence les défis liés au prétraitement des données pour le ML et décrit les options et les scénarios permettant d'effectuer efficacement la transformation des données sur Google Cloud.

Ce document suppose que vous connaissez BigQuery , Dataflow , Vertex AI et l'API TensorFlow Keras .

Le deuxième document, Prétraitement des données pour le ML avec Google Cloud , fournit un didacticiel étape par étape expliquant comment implémenter un pipeline tf.Transform .

Introduction

ML vous aide à trouver automatiquement des modèles complexes et potentiellement utiles dans les données. Ces modèles sont condensés dans un modèle ML qui peut ensuite être utilisé sur de nouveaux points de données – un processus appelé faire des prédictions ou effectuer des inférences .

La création d'un modèle ML est un processus en plusieurs étapes. Chaque étape présente ses propres défis techniques et conceptuels. Cette série en deux parties se concentre sur les tâches d'apprentissage supervisé et le processus de sélection, de transformation et d'augmentation des données sources pour créer de puissants signaux prédictifs pour la variable cible. Ces opérations combinent connaissance du domaine et techniques de science des données. Les opérations sont l'essence même de l'ingénierie des fonctionnalités .

La taille des ensembles de données de formation pour les modèles ML du monde réel peut facilement être égale ou supérieure à un téraoctet (To). Par conséquent, vous avez besoin de cadres de traitement de données à grande échelle afin de traiter ces ensembles de données de manière efficace et distribuée. Lorsque vous utilisez un modèle ML pour effectuer des prédictions, vous devez appliquer les mêmes transformations que celles que vous avez utilisées pour les données d'entraînement sur les nouveaux points de données. En appliquant les mêmes transformations, vous présentez l'ensemble de données en direct au modèle ML de la manière attendue par le modèle.

Ce document aborde ces défis pour différents niveaux de granularité des opérations d'ingénierie de fonctionnalités : agrégations au niveau de l'instance, à passage complet et par fenêtre temporelle. Ce document décrit également les options et les scénarios permettant d'effectuer une transformation de données pour le ML sur Google Cloud.

Ce document fournit également une présentation de TensorFlow Transform ( tf.Transform ), une bibliothèque pour TensorFlow qui vous permet de définir à la fois une transformation de données au niveau de l'instance et une transformation complète via des pipelines de prétraitement des données. Ces pipelines sont exécutés avec Apache Beam et créent des artefacts qui vous permettent d'appliquer les mêmes transformations pendant la prédiction que lorsque le modèle est servi.

Prétraitement des données pour le ML

Cette section présente les opérations de prétraitement des données et les étapes de préparation des données. Il aborde également les types d'opérations de prétraitement et leur granularité.

Ingénierie des données comparée à l'ingénierie des fonctionnalités

Le prétraitement des données pour le ML implique à la fois l'ingénierie des données et l'ingénierie des fonctionnalités. L'ingénierie des données est le processus de conversion de données brutes en données préparées . L'ingénierie des fonctionnalités ajuste ensuite les données préparées pour créer les fonctionnalités attendues par le modèle ML. Ces termes ont les significations suivantes :

Données brutes (ou simplement données )
Les données sous leur forme source, sans aucune préparation préalable au ML. Dans ce contexte, les données peuvent être sous leur forme brute (dans un lac de données) ou sous forme transformée (dans un entrepôt de données). Les données transformées qui se trouvent dans un entrepôt de données peuvent avoir été converties à partir de leur forme brute d'origine pour être utilisées à des fins d'analyse. Cependant, dans ce contexte, les données brutes signifient que les données n'ont pas été préparées spécifiquement pour votre tâche ML. Les données sont également considérées comme des données brutes si elles sont envoyées à partir de systèmes de streaming qui appellent finalement des modèles ML pour des prédictions.
Données préparées
L'ensemble de données sous la forme prêt pour votre tâche ML : les sources de données ont été analysées, jointes et mises sous forme de tableau. Les données préparées sont agrégées et résumées avec la granularité appropriée : par exemple, chaque ligne de l'ensemble de données représente un client unique et chaque colonne représente des informations récapitulatives sur le client, comme le total dépensé au cours des six dernières semaines. Dans un tableau de données préparé, les colonnes non pertinentes ont été supprimées et les enregistrements non valides ont été filtrés. Pour les tâches d’apprentissage supervisé, la fonctionnalité cible est présente.
Fonctionnalités d'ingénierie
L'ensemble de données avec les fonctionnalités optimisées attendues par le modèle, c'est-à-dire les fonctionnalités créées en effectuant certaines opérations spécifiques au ML sur les colonnes de l'ensemble de données préparé et en créant de nouvelles fonctionnalités pour votre modèle pendant l'entraînement et la prédiction, comme décrit plus loin. dans Opérations de prétraitement . Des exemples de ces opérations incluent la mise à l'échelle des colonnes numériques à une valeur comprise entre 0 et 1, les valeurs de découpage et les fonctionnalités catégorielles à codage à chaud .

Le diagramme suivant, figure 1, montre les étapes impliquées dans la préparation des données prétraitées :

Diagramme de flux montrant les données brutes transférées vers les données préparées transférées vers les fonctionnalités d'ingénierie.
Figure 1. Le flux de données, des données brutes aux données préparées, en passant par les fonctionnalités techniques et l'apprentissage automatique.

Dans la pratique, les données provenant d’une même source se trouvent souvent à des stades de préparation différents. Par exemple, un champ d'une table de votre entrepôt de données peut être utilisé directement comme fonctionnalité d'ingénierie. Dans le même temps, un autre champ de la même table devra peut-être subir des transformations avant de devenir une fonctionnalité d'ingénierie. De même, les opérations d’ingénierie des données et d’ingénierie des fonctionnalités peuvent être combinées dans la même étape de prétraitement des données.

Opérations de prétraitement

Le prétraitement des données comprend plusieurs opérations. Chaque opération est conçue pour aider ML à créer de meilleurs modèles prédictifs. Les détails de ces opérations de prétraitement sortent du cadre de ce document, mais certaines opérations sont brièvement décrites dans cette section.

Pour les données structurées, les opérations de prétraitement des données sont les suivantes :

  • Nettoyage des données : suppression ou correction des enregistrements dont les valeurs sont corrompues ou invalides à partir des données brutes, et suppression des enregistrements pour lesquels il manque un grand nombre de colonnes.
  • Sélection et partitionnement des instances : sélection de points de données à partir de l'ensemble de données d'entrée pour créer des ensembles de formation, d'évaluation (validation) et de test . Ce processus comprend des techniques d'échantillonnage aléatoire répétable, de suréchantillonnage des classes minoritaires et de partitionnement stratifié.
  • Réglage des fonctionnalités : amélioration de la qualité d'une fonctionnalité pour le ML, ce qui inclut la mise à l'échelle et la normalisation des valeurs numériques, l'imputation des valeurs manquantes, l'écrêtage des valeurs aberrantes et l'ajustement des valeurs dont les distributions sont asymétriques.
  • Transformation de fonctionnalités : conversion d'une fonctionnalité numérique en une fonctionnalité catégorielle (via la bucketisation ) et conversion de fonctionnalités catégorielles en une représentation numérique (via un codage à chaud, un apprentissage avec des comptes , des intégrations de fonctionnalités clairsemées, etc.). Certains modèles fonctionnent uniquement avec des fonctionnalités numériques ou catégorielles, tandis que d'autres peuvent gérer des fonctionnalités de type mixte. Même lorsque les modèles gèrent les deux types, ils peuvent bénéficier de différentes représentations (numériques et catégorielles) de la même fonctionnalité.
  • Extraction de fonctionnalités : réduire le nombre de fonctionnalités en créant des représentations de données de dimension inférieure et plus puissantes à l'aide de techniques telles que la PCA , l'extraction par intégration et le hachage .
  • Sélection de fonctionnalités : sélectionner un sous-ensemble de fonctionnalités d'entrée pour entraîner le modèle et ignorer celles qui ne sont pas pertinentes ou redondantes, à l'aide de méthodes de filtrage ou de wrapper . La sélection de fonctionnalités peut également impliquer simplement la suppression de fonctionnalités s'il leur manque un grand nombre de valeurs.
  • Construction de fonctionnalités : création de nouvelles fonctionnalités en utilisant des techniques typiques, telles que l'expansion polynomiale (en utilisant des fonctions mathématiques univariées) ou le croisement de fonctionnalités (pour capturer les interactions de fonctionnalités). Les fonctionnalités peuvent également être construites en utilisant la logique métier du domaine du cas d’utilisation du ML.

Lorsque vous travaillez avec des données non structurées (par exemple, des images, des documents audio ou texte), l'apprentissage profond remplace l'ingénierie des fonctionnalités basée sur la connaissance du domaine en l'intégrant à l'architecture du modèle. Une couche convolutive est un préprocesseur de fonctionnalités automatique. Construire la bonne architecture de modèle nécessite une certaine connaissance empirique des données. De plus, un certain nombre de prétraitements sont nécessaires, tels que les suivants :

  • Pour les documents texte : radicalisation et lemmatisation , calcul TF-IDF et extraction de n-grammes , recherche d'intégration.
  • Pour les images : découpage, redimensionnement, recadrage, flou gaussien et filtres canari.
  • Pour tous les types de données (y compris le texte et les images) : apprentissage par transfert , qui traite toutes les couches sauf la dernière du modèle entièrement entraîné comme une étape d'ingénierie des fonctionnalités.

Granularité du prétraitement

Cette section traite de la granularité des types de transformations de données. Il montre pourquoi cette perspective est essentielle lors de la préparation de nouveaux points de données pour les prédictions à l'aide de transformations appliquées aux données d'entraînement.

Les opérations de prétraitement et de transformation peuvent être classées comme suit, en fonction de la granularité des opérations :

  • Transformations au niveau de l'instance pendant la formation et la prédiction . Il s'agit de transformations simples, dans lesquelles seules les valeurs de la même instance sont nécessaires pour la transformation. Par exemple, les transformations au niveau de l'instance peuvent inclure le découpage de la valeur d'une fonctionnalité à un certain seuil, l'expansion polynomiale d'une autre fonctionnalité, la multiplication de deux fonctionnalités ou la comparaison de deux fonctionnalités pour créer un indicateur booléen.

    Ces transformations doivent être appliquées de la même manière lors de l'entraînement et de la prédiction, car le modèle sera entraîné sur les caractéristiques transformées, et non sur les valeurs d'entrée brutes. Si les données ne sont pas transformées de manière identique, le modèle se comporte mal car il est présenté avec des données présentant une distribution de valeurs avec laquelle il n'a pas été entraîné. Pour plus d’informations, consultez la discussion sur le décalage entre la formation et la diffusion dans la section Défis du prétraitement .

  • Transformations complètes pendant la formation, mais transformations au niveau de l'instance pendant la prédiction . Dans ce scénario, les transformations sont avec état, car elles utilisent des statistiques précalculées pour effectuer la transformation. Pendant l'entraînement, vous analysez l'ensemble des données d'entraînement pour calculer des quantités telles que le minimum, le maximum, la moyenne et la variance afin de transformer les données d'entraînement, les données d'évaluation et les nouvelles données au moment de la prédiction.

    Par exemple, pour normaliser une caractéristique numérique pour l'entraînement, vous calculez sa moyenne (μ) et son écart type (σ) sur l'ensemble des données d'entraînement. Ce calcul est appelé opération passe complète (ou analyse ). Lorsque vous diffusez le modèle à des fins de prédiction, la valeur d'un nouveau point de données est normalisée pour éviter un biais d'entraînement et de diffusion. Par conséquent, les valeurs μ et σ calculées pendant l’entraînement sont utilisées pour ajuster la valeur de la caractéristique, ce qui correspond à l’opération simple suivante au niveau de l’instance :

    $$ value_{scaled} = (value_{raw} - \mu) \div \sigma $$

    Les transformations complètes incluent les éléments suivants :

    • Fonctionnalités numériques de mise à l'échelle MinMax à l'aide des valeurs min et max calculées à partir de l'ensemble de données d'entraînement.
    • Caractéristiques numériques de mise à l'échelle standard (normalisation du score z) utilisant μ et σ calculées sur l'ensemble de données d'entraînement.
    • Compartiment des caractéristiques numériques à l'aide de quantiles.
    • Imputation des valeurs manquantes à l'aide de la médiane (caractéristiques numériques) ou du mode (caractéristiques catégorielles).
    • Conversion de chaînes (valeurs nominales) en entiers (index) en extrayant toutes les valeurs distinctes (vocabulaire) d'une caractéristique catégorielle d'entrée.
    • Compter l'occurrence d'un terme (valeur de caractéristique) dans tous les documents (instances) à calculer pour TF-IDF.
    • Calcul de la PCA des entités en entrée pour projeter les données dans un espace dimensionnel inférieur (avec des entités linéairement dépendantes).

    Vous devez utiliser uniquement les données d'entraînement pour calculer des statistiques telles que μ, σ, min et max . Si vous ajoutez les données de test et d'évaluation pour ces opérations, vous perdez des informations des données d'évaluation et de test pour entraîner le modèle. Cela affecte la fiabilité des résultats des tests et des évaluations. Pour garantir que vous appliquez une transformation cohérente à tous les ensembles de données, vous utilisez les mêmes statistiques calculées à partir des données d'entraînement pour transformer les données de test et d'évaluation.

  • Agrégations historiques pendant la formation et la prédiction . Cela implique la création d'agrégations commerciales, de dérivations et d'indicateurs comme signaux d'entrée pour la tâche de prédiction. Par exemple, la création de métriques de récence, de fréquence et monétaires (RFM) permettant aux clients de créer des modèles de propension. Ces types de fonctionnalités peuvent être précalculés et stockés dans un magasin de fonctionnalités pour être utilisés lors de la formation du modèle, de la notation par lots et de la diffusion de prédictions en ligne. Vous pouvez également effectuer une ingénierie de fonctionnalités supplémentaire (par exemple, transformation et réglage) sur ces agrégations avant l'entraînement et la prédiction.

  • Agrégations historiques pendant la formation, mais agrégations en temps réel pendant la prédiction . Cette approche consiste à créer une fonctionnalité en résumant les valeurs en temps réel au fil du temps. Dans cette approche, les instances à agréger sont définies via des clauses de fenêtre temporelle. Par exemple, vous pouvez utiliser cette approche si vous souhaitez entraîner un modèle qui estime le temps de trajet en taxi en fonction des mesures de trafic pour l'itinéraire au cours des 5 dernières minutes, des 10 dernières minutes, des 30 dernières minutes et à d'autres moments. intervalles. Vous pouvez également utiliser cette approche pour prédire la défaillance d'une pièce du moteur en fonction de la moyenne mobile des valeurs de température et de vibration calculées au cours des 3 dernières minutes. Bien que ces agrégations puissent être préparées hors ligne pour la formation, elles sont calculées en temps réel à partir d'un flux de données pendant la diffusion.

    Plus précisément, lorsque vous préparez des données d'entraînement, si la valeur agrégée ne figure pas dans les données brutes, la valeur est créée lors de la phase d'ingénierie des données. Les données brutes sont généralement stockées dans une base de données au format (entity, timestamp, value) . Dans les exemples précédents, entity est l'identifiant de segment d'itinéraire pour les itinéraires de taxi et l'identifiant de pièce de moteur pour la panne moteur. Vous pouvez utiliser des opérations de fenêtrage pour calculer (entity, time_index, aggregated_value_over_time_window) et utiliser les fonctionnalités d'agrégation comme entrée pour la formation de votre modèle.

    Lorsque le modèle de prédiction en temps réel (en ligne) est servi, le modèle attend en entrée les caractéristiques dérivées des valeurs agrégées. Par conséquent, vous pouvez utiliser une technologie de traitement de flux telle qu'Apache Beam pour calculer les agrégations à partir des points de données en temps réel diffusés dans votre système. La technologie de traitement de flux regroupe les données en temps réel en fonction de fenêtres temporelles à mesure que de nouveaux points de données arrivent. Vous pouvez également effectuer une ingénierie de fonctionnalités supplémentaire (par exemple, transformation et réglage) sur ces agrégations avant l'entraînement et la prédiction.

Pipeline de ML sur Google Cloud

Cette section présente les principaux composants d'un pipeline de bout en bout typique pour entraîner et diffuser des modèles TensorFlow ML sur Google Cloud à l'aide de services gérés. Il explique également où vous pouvez implémenter différentes catégories d'opérations de prétraitement des données et les défis courants auxquels vous pourriez être confronté lors de la mise en œuvre de telles transformations. La section Comment fonctionne tf.Transform montre comment la bibliothèque TensorFlow Transform aide à relever ces défis.

Architecture de haut niveau

Le diagramme suivant, figure 2, montre une architecture de haut niveau d'un pipeline ML typique pour la formation et la diffusion de modèles TensorFlow. Les étiquettes A, B et C dans le diagramme font référence aux différents endroits du pipeline où le prétraitement des données peut avoir lieu. Les détails de ces étapes sont fournis dans la section suivante.

Diagramme d'architecture montrant les étapes de traitement des données.
Figure 2. Architecture de haut niveau pour la formation et la diffusion du ML sur Google Cloud.

Le pipeline comprend les étapes suivantes :

  1. Une fois les données brutes importées, les données tabulaires sont stockées dans BigQuery et d'autres données telles que les images, l'audio et la vidéo sont stockées dans Cloud Storage. La deuxième partie de cette série utilise comme exemple les données tabulaires stockées dans BigQuery.
  2. L'ingénierie des données (préparation) et l'ingénierie des fonctionnalités sont exécutées à grande échelle à l'aide de Dataflow. Cette exécution produit des ensembles de formation, d'évaluation et de test prêts pour le ML qui sont stockés dans Cloud Storage. Idéalement, ces ensembles de données sont stockés sous forme de fichiers TFRecord , qui est le format optimisé pour les calculs TensorFlow.
  3. Un package d'entraînement de modèle TensorFlow est soumis à Vertex AI Training, qui utilise les données prétraitées des étapes précédentes pour entraîner le modèle. Le résultat de cette étape est un TensorFlow SavedModel formé qui est exporté vers Cloud Storage.
  4. Le modèle TensorFlow entraîné est déployé sur Vertex AI Prediction en tant que service doté d'une API REST afin de pouvoir être utilisé pour les prédictions en ligne. Le même modèle peut également être utilisé pour les tâches de prédiction par lots.
  5. Une fois le modèle déployé en tant qu'API REST, les applications clientes et les systèmes internes peuvent appeler l'API en envoyant des requêtes avec certains points de données et en recevant des réponses du modèle avec des prédictions.
  6. Pour orchestrer et automatiser ce pipeline, vous pouvez utiliser Vertex AI Pipelines comme planificateur pour appeler les étapes de préparation des données, de formation du modèle et de déploiement du modèle.

Vous pouvez également utiliser Vertex AI Feature Store pour stocker les caractéristiques d'entrée afin d'effectuer des prédictions. Par exemple, vous pouvez créer périodiquement des fonctionnalités d'ingénierie à partir des dernières données brutes et les stocker dans Vertex AI Feature Store. Les applications clientes récupèrent les fonctionnalités d'entrée requises dans Vertex AI Feature Store et les envoient au modèle pour recevoir des prédictions.

Où effectuer le prétraitement

Dans la figure 2, les étiquettes A, B et C montrent que les opérations de prétraitement des données peuvent avoir lieu dans BigQuery, Dataflow ou TensorFlow. Les sections suivantes décrivent le fonctionnement de chacune de ces options.

Option A : BigQuery

En règle générale, la logique est implémentée dans BigQuery pour les opérations suivantes :

  • Échantillonnage : sélection aléatoire d'un sous-ensemble à partir des données.
  • Filtrage : suppression des instances non pertinentes ou invalides.
  • Partitionnement : diviser les données pour produire des ensembles de formation, d'évaluation et de test.

Les scripts BigQuery SQL peuvent être utilisés comme requête source pour le pipeline de prétraitement Dataflow, qui correspond à l'étape de traitement des données de la figure 2. Par exemple, si un système est utilisé au Canada et que l'entrepôt de données contient des transactions du monde entier, le filtrage vers Il est préférable d'obtenir des données d'entraînement uniquement au Canada dans BigQuery. L'ingénierie des fonctionnalités dans BigQuery est simple et évolutive, et prend en charge la mise en œuvre de transformations de fonctionnalités au niveau de l'instance et des agrégations historiques.

Toutefois, nous vous recommandons d'utiliser BigQuery pour l'ingénierie des fonctionnalités uniquement si vous utilisez votre modèle pour la prédiction par lots (évaluation) ou si les fonctionnalités sont précalculées dans BigQuery, mais stockées dans Vertex AI Feature Store pour être utilisées lors de la prédiction en ligne. Si vous envisagez de déployer le modèle pour les prédictions en ligne et si vous ne disposez pas de la fonctionnalité d'ingénierie dans un magasin de fonctionnalités en ligne, vous devez répliquer les opérations de prétraitement SQL pour transformer les points de données brutes générés par d'autres systèmes. En d'autres termes, vous devez implémenter la logique deux fois : une fois dans SQL pour prétraiter les données d'entraînement dans BigQuery, et une seconde fois dans la logique de l'application qui consomme le modèle pour prétraiter les points de données en ligne à des fins de prédiction.

Par exemple, si votre application client est écrite en Java, vous devez réimplémenter la logique en Java. Cela peut introduire des erreurs dues à des écarts de mise en œuvre, comme décrit dans la section sur l'asymétrie de la diffusion et de la formation des défis de prétraitement plus loin dans ce document. Cela représente également une surcharge supplémentaire pour maintenir deux implémentations différentes. Chaque fois que vous modifiez la logique dans SQL pour prétraiter les données d'entraînement, vous devez modifier l'implémentation Java en conséquence pour prétraiter les données au moment de la diffusion.

Si vous utilisez votre modèle uniquement pour la prédiction par lots (par exemple, en utilisant la prédiction par lots Vertex AI) et si vos données pour la notation proviennent de BigQuery, vous pouvez mettre en œuvre ces opérations de prétraitement dans le cadre du script SQL BigQuery. Dans ce cas, vous pouvez utiliser le même script SQL de prétraitement pour préparer les données de formation et de notation.

Les transformations avec état passe complète ne conviennent pas à la mise en œuvre dans BigQuery. Si vous utilisez BigQuery pour des transformations complètes, vous avez besoin de tables auxiliaires pour stocker les quantités nécessaires aux transformations avec état, telles que les moyennes et les variances pour mettre à l'échelle les caractéristiques numériques. De plus, la mise en œuvre de transformations complètes à l'aide de SQL sur BigQuery crée une complexité accrue dans les scripts SQL et crée une dépendance complexe entre l'entraînement et les scripts SQL de notation.

Option B : flux de données

Comme le montre la figure 2, vous pouvez implémenter des opérations de prétraitement coûteuses en termes de calcul dans Apache Beam et les exécuter à grande échelle à l'aide de Dataflow. Dataflow est un service d'autoscaling entièrement géré pour le traitement des données par lots et par flux. Lorsque vous utilisez Dataflow, vous pouvez également utiliser des bibliothèques externes spécialisées pour le traitement des données, contrairement à BigQuery.

Dataflow peut effectuer des transformations au niveau de l'instance, ainsi que des transformations de fonctionnalités d'agrégation historiques et en temps réel. En particulier, si vos modèles ML attendent une fonctionnalité d'entrée telle que total_number_of_clicks_last_90sec , les fonctions de fenêtrage d'Apache Beam peuvent calculer ces fonctionnalités en agrégeant les valeurs des fenêtres temporelles des données d'événements en temps réel (streaming) (par exemple, les événements de clic). Dans la discussion précédente sur la granularité des transformations , cela était appelé « agrégations historiques pendant la formation, mais agrégations en temps réel pendant la prédiction ».

Le diagramme suivant, figure 3, montre le rôle de Dataflow dans le traitement des données de flux pour des prédictions en temps quasi réel.

Architecture pour utiliser les données de flux à des fins de prédiction.
Figure 3. Architecture de haut niveau utilisant des données de flux pour la prédiction dans Dataflow.

Comme le montre la figure 3, pendant le traitement, des événements appelés points de données sont ingérés dans Pub/Sub . Dataflow consomme ces points de données, calcule les fonctionnalités en fonction des agrégats au fil du temps, puis appelle l'API du modèle ML déployé pour les prédictions. Les prédictions sont ensuite envoyées à une file d'attente Pub/Sub sortante. Depuis Pub/Sub, les prédictions peuvent être consommées par des systèmes en aval tels que la surveillance ou le contrôle, ou elles peuvent être renvoyées (par exemple, sous forme de notifications) au client demandeur d'origine. Les prédictions peuvent également être stockées dans un magasin de données à faible latence comme Cloud Bigtable pour une récupération en temps réel. Cloud Bigtable peut également être utilisé pour accumuler et stocker ces agrégations en temps réel afin de pouvoir les consulter en cas de besoin à des fins de prédiction.

La même implémentation d'Apache Beam peut être utilisée pour traiter par lots les données d'entraînement provenant d'une banque de données hors ligne comme BigQuery et pour traiter en continu les données en temps réel afin de fournir des prédictions en ligne.

Dans d'autres architectures typiques, telles que l'architecture illustrée à la figure 2, l'application client appelle directement l'API du modèle déployé pour les prédictions en ligne. Dans ce cas, si des opérations de prétraitement sont mises en œuvre dans Dataflow pour préparer les données d'entraînement, les opérations ne sont pas appliquées aux données de prédiction qui sont directement transmises au modèle. Par conséquent, de telles transformations doivent être intégrées dans le modèle lors de la diffusion des prédictions en ligne.

Dataflow peut être utilisé pour effectuer une transformation complète, en calculant les statistiques requises à grande échelle. Cependant, ces statistiques doivent être stockées quelque part pour être utilisées lors de la prédiction afin de transformer les points de données de prédiction. En utilisant la bibliothèque TensorFlow Transform ( tf.Transform ), vous pouvez directement intégrer ces statistiques dans le modèle au lieu de les stocker ailleurs. Cette approche est expliquée plus loin dans Comment fonctionne tf.Transform .

Option C : TensorFlow

Comme le montre la figure 2, vous pouvez implémenter des opérations de prétraitement et de transformation des données dans le modèle TensorFlow lui-même. Comme le montre la figure, le prétraitement que vous implémentez pour entraîner le modèle TensorFlow devient partie intégrante du modèle lorsque celui-ci est exporté et déployé pour les prédictions. Les transformations dans le modèle TensorFlow peuvent être effectuées de l'une des manières suivantes :

  • Implémentation de toute la logique de transformation au niveau de l'instance dans la fonction input_fn et dans la fonction serving_fn . La fonction input_fn prépare un ensemble de données à l'aide de l' API tf.data.Dataset pour entraîner un modèle. La fonction serving_fn reçoit et prépare les données pour les prédictions.
  • Placer le code de transformation directement dans votre modèle TensorFlow en utilisant des couches de prétraitement Keras ou en créant des couches personnalisées .

Le code logique de transformation dans la fonction serving_fn définit l'interface de service de votre SavedModel pour la prédiction en ligne. Si vous implémentez les mêmes transformations que celles utilisées pour préparer les données d'entraînement dans le code logique de transformation de la fonction serving_fn , cela garantit que les mêmes transformations sont appliquées aux nouveaux points de données de prédiction lorsqu'ils sont servis.

Toutefois, étant donné que le modèle TensorFlow traite chaque point de données indépendamment ou en petit lot, vous ne pouvez pas calculer des agrégations à partir de tous les points de données. Par conséquent, les transformations complètes ne peuvent pas être implémentées dans votre modèle TensorFlow.

Défis de prétraitement

Voici les principaux défis liés à la mise en œuvre du prétraitement des données :

  • Désalignement entre la formation et le service . L’asymétrie entraînement-service fait référence à une différence entre l’efficacité (performance prédictive) pendant l’entraînement et pendant le service. Ce biais peut être dû à un écart entre la manière dont vous gérez les données dans la formation et dans les pipelines de diffusion. Par exemple, si votre modèle est entraîné sur une fonctionnalité transformée de manière logarithmique, mais qu'il est présenté avec la fonctionnalité brute lors de la diffusion, le résultat de la prédiction peut ne pas être précis.

    Si les transformations font partie du modèle lui-même, il peut être simple de gérer les transformations au niveau de l'instance, comme décrit précédemment dans Option C : TensorFlow . Dans ce cas, l'interface de service du modèle (la fonction serving_fn ) attend des données brutes, tandis que le modèle transforme ces données en interne avant de calculer la sortie. Les transformations sont les mêmes que celles qui ont été appliquées aux points de données bruts d’entraînement et de prédiction.

  • Transformations en passe complète . Vous ne pouvez pas implémenter de transformations complètes telles que des transformations de mise à l'échelle et de normalisation dans votre modèle TensorFlow. Dans les transformations complètes, certaines statistiques (par exemple, les valeurs max et min pour mettre à l'échelle les caractéristiques numériques) doivent être calculées au préalable sur les données d'entraînement, comme décrit dans Option B : Flux de données . Les valeurs doivent ensuite être stockées quelque part pour être utilisées pendant la diffusion du modèle à des fins de prédiction afin de transformer les nouveaux points de données brutes en transformations au niveau de l'instance, ce qui évite le biais de formation et de diffusion. Vous pouvez utiliser la bibliothèque TensorFlow Transform ( tf.Transform ) pour intégrer directement les statistiques dans votre modèle TensorFlow. Cette approche est expliquée plus loin dans Comment fonctionne tf.Transform .

  • Préparer les données à l'avance pour une meilleure efficacité de la formation . La mise en œuvre de transformations au niveau de l'instance dans le cadre du modèle peut dégrader l'efficacité du processus de formation. Cette dégradation se produit parce que les mêmes transformations sont appliquées de manière répétée aux mêmes données d'entraînement à chaque époque. Imaginez que vous disposez de données d'entraînement brutes avec 1 000 fonctionnalités et que vous appliquez une combinaison de transformations au niveau de l'instance pour générer 10 000 fonctionnalités. Si vous implémentez ces transformations dans le cadre de votre modèle, et si vous alimentez ensuite le modèle avec les données brutes d'entraînement, ces 10 000 opérations sont appliquées N fois sur chaque instance, où N est le nombre d'époques. De plus, si vous utilisez des accélérateurs (GPU ou TPU), ils restent inactifs pendant que le processeur effectue ces transformations, ce qui ne constitue pas une utilisation efficace de vos accélérateurs coûteux.

    Idéalement, les données d'entraînement sont transformées avant l'entraînement, à l'aide de la technique décrite sous Option B : Dataflow , où les 10 000 opérations de transformation ne sont appliquées qu'une seule fois sur chaque instance d'entraînement. Les données de formation transformées sont ensuite présentées au modèle. Aucune autre transformation n'est appliquée et les accélérateurs sont constamment occupés. De plus, l'utilisation de Dataflow vous aide à prétraiter de grandes quantités de données à grande échelle, à l'aide d'un service entièrement géré.

    La préparation des données de formation à l'avance peut améliorer l'efficacité de la formation. Cependant, la mise en œuvre de la logique de transformation en dehors du modèle (les approches décrites dans Option A : BigQuery ou Option B : Dataflow ) ne résout pas le problème du déséquilibre entre la formation et la diffusion. À moins que vous ne stockiez la fonctionnalité conçue dans le magasin de fonctionnalités pour l'utiliser à la fois pour la formation et la prédiction, la logique de transformation doit être implémentée quelque part pour être appliquée aux nouveaux points de données destinés à la prédiction, car l'interface du modèle attend des données transformées. La bibliothèque TensorFlow Transform ( tf.Transform ) peut vous aider à résoudre ce problème, comme décrit dans la section suivante.

Comment fonctionne tf.Transform

La bibliothèque tf.Transform est utile pour les transformations qui nécessitent une passe complète. La sortie de la bibliothèque tf.Transform est exportée sous forme de graphique TensorFlow qui représente la logique de transformation au niveau de l'instance et les statistiques calculées à partir des transformations complètes, à utiliser pour la formation et le service. L’utilisation du même graphique pour l’entraînement et le service peut éviter les biais, car les mêmes transformations sont appliquées aux deux étapes. De plus, la bibliothèque tf.Transform peut s'exécuter à grande échelle dans un pipeline de traitement par lots sur Dataflow pour préparer les données d'entraînement à l'avance et améliorer l'efficacité de l'entraînement.

Le diagramme suivant, figure 4, montre comment la bibliothèque tf.Transform prétraite et transforme les données pour l'entraînement et la prédiction. Le processus est décrit dans les sections suivantes.

Diagramme montrant le flux des données brutes via tf.Transform vers les prédictions.
Figure 4. Comportement de tf.Transform pour le prétraitement et la transformation des données.

Transformez les données de formation et d’évaluation

Vous prétraitez les données d'entraînement brutes à l'aide de la transformation implémentée dans les API tf.Transform Apache Beam et vous les exécutez à grande échelle sur Dataflow. Le prétraitement s'effectue selon les phases suivantes :

  • Phase d'analyse : pendant la phase d'analyse, les statistiques requises (telles que les moyennes, les variances et les quantiles) pour les transformations avec état sont calculées sur les données d'entraînement avec des opérations de passe complète. Cette phase produit un ensemble d'artefacts de transformation, notamment le graphe transform_fn . Le graphe transform_fn est un graphe TensorFlow dont la logique de transformation est une opération au niveau de l'instance. Il inclut les statistiques calculées lors de la phase d'analyse sous forme de constantes.
  • Phase de transformation : pendant la phase de transformation, le graphique transform_fn est appliqué aux données d'entraînement brutes, où les statistiques calculées sont utilisées pour traiter les enregistrements de données (par exemple, pour mettre à l'échelle les colonnes numériques) au niveau de l'instance.

Une approche en deux phases comme celle-ci répond au défi de prétraitement consistant à effectuer des transformations en passe complète.

Lorsque les données d'évaluation sont prétraitées, seules les opérations au niveau de l'instance sont appliquées, en utilisant la logique du graphe transform_fn et les statistiques calculées à partir de la phase d'analyse dans les données d'entraînement. En d’autres termes, vous n’analysez pas les données d’évaluation de manière complète pour calculer de nouvelles statistiques, telles que μ et σ, afin de normaliser les caractéristiques numériques des données d’évaluation. Au lieu de cela, vous utilisez les statistiques calculées à partir des données d’entraînement pour transformer les données d’évaluation au niveau de l’instance.

Les données de formation et d'évaluation transformées sont préparées à grande échelle à l'aide de Dataflow, avant d'être utilisées pour entraîner le modèle. Ce processus de préparation des données par lots traite du défi de prétraitement de préparer les données à l'avance pour améliorer l'efficacité de la formation. Comme le montre la figure 4, l'interface interne du modèle s'attend à des fonctionnalités transformées.

Attacher des transformations au modèle exporté

Comme indiqué, le graphique transform_fn produit par le pipeline tf.Transform est stocké comme un graphique TensorFlow exporté. Le graphique exporté se compose de la logique de transformation comme opérations au niveau de l'instance, et toutes les statistiques calculées dans les transformations passes complètes sous forme de constantes de graphe. Lorsque le modèle formé est exporté pour servir, le graphique transform_fn est attaché au SavedModel dans le cadre de sa fonction serving_fn .

Pendant qu'il sert le modèle de prédiction, l'interface de service du modèle attend des points de données dans le format brut (c'est-à-dire avant toute transformation). Cependant, l'interface interne du modèle s'attend à des données dans le format transformé.

Le graphique transform_fn , qui fait maintenant partie du modèle, applique toute la logique de prétraitement sur le point de données entrant. Il utilise les constantes stockées (comme μ et σ pour normaliser les caractéristiques numériques) dans le fonctionnement au niveau de l'instance pendant la prédiction. Par conséquent, le graphique transform_fn convertit le point de données bruts au format transformé. Le format transformé est ce qui est attendu par l'interface interne du modèle afin de produire une prédiction, comme le montre la figure 4.

Ce mécanisme résout le défi de prétraitement de la biais de formation de formation, car la même logique (implémentation) qui est utilisée pour transformer les données de formation et d'évaluation est appliquée pour transformer les nouveaux points de données lors de la service de prédiction.

Résumé des options de prétraitement

Le tableau suivant résume les options de prétraitement des données dont ce document a discuté. Dans le tableau, "N / A" signifie "Non applicable".

Option de prétraitement des données Niveau d'instance
(transformations apatrides)

Passage complet pendant la formation et le niveau d'instance pendant les portions (transformations avec état)

Agrégations en temps réel (fenêtre) pendant la formation et la portion (transformations en streaming)

BigQuery (SQL)

Score par lots: OK - la même implémentation de transformation est appliquée aux données pendant la formation et la notation par lots.

Prédiction en ligne: non recommandée - vous pouvez traiter les données de formation, mais cela se traduit par un biais de formation de formation car vous traitez des données de service à l'aide de différents outils.

Score par lots: non recommandé .

Prédiction en ligne: non recommandée .

Bien que vous puissiez utiliser des statistiques calculées à l'aide de BigQuery par rapport aux transformations par lots / en ligne au niveau de l'instance, cela n'est pas facile car vous devez maintenir un magasin de statistiques à remplir pendant la formation et utilisé pendant la prédiction.

Notation par lots: N / A - Les agrégats comme ceux-ci sont calculés en fonction des événements en temps réel.

Prédiction en ligne: non recommandée - vous pouvez traiter les données de formation, mais cela se traduit par un biais de formation de formation car vous traitez des données de service à l'aide de différents outils.

Dataflow (Apache Beam)

Score par lots: OK - la même implémentation de transformation est appliquée aux données pendant la formation et la notation par lots.

Prédiction en ligne: OK - Si les données au moment de la servitude proviennent de Pub / Sub pour être consommée par Dataflow. Sinon, se traduit par une biais de formation de formation.

Score par lots: non recommandé .

Prédictions en ligne: non recommandée .

Bien que vous puissiez utiliser des statistiques calculées à l'aide de Dataflow parmi les transformations par lots / en ligne au niveau de l'instance, cela n'est pas facile car vous devez maintenir un magasin de statistiques à remplir pendant la formation et utilisé pendant la prédiction.

Notation par lots: N / A - Les agrégats comme ceux-ci sont calculés en fonction des événements en temps réel.

Prédiction en ligne: OK - la même transformation du faisceau Apache est appliquée sur les données pendant la formation (lot) et la portion (flux).

Dataflow (Apache Beam + TFT)

Score par lots: OK - la même implémentation de transformation est appliquée aux données pendant la formation et la notation par lots.

Prédiction en ligne: recommandée - il évite la biais de formation de la formation et prépare les données de formation à l'avance.

Score par lots: recommandé .

Prédiction en ligne: recommandée .

Les deux utilisations sont recommandées parce que la logique de transformation et les statistiques calculées pendant la formation sont stockées sous forme de graphique TensorFlow qui est attaché au modèle exporté pour le service.

Notation par lots: N / A - Les agrégats comme ceux-ci sont calculés en fonction des événements en temps réel.

Prédiction en ligne: OK - la même transformation du faisceau Apache est appliquée sur les données pendant la formation (lot) et la portion (flux).

TensorFlow *
( input_fn & serving_fn )

Score par lots: non recommandé .

Prédiction en ligne: non recommandée .

Pour l'efficacité de la formation dans les deux cas, il est préférable de préparer les données de formation à l'avance.

Score par lots: pas possible .

Prédiction en ligne: pas possible .

Notation par lots: N / A - Les agrégats comme ceux-ci sont calculés en fonction des événements en temps réel.

Prédiction en ligne: pas possible .

* Avec TensorFlow, des transformations comme le croisement, l'intégration et le codage à un hot doivent être effectués de manière déclarative sous forme de colonnes feature_columns .

Quelle est la prochaine étape

,

Ce document est le premier d'une série en deux parties qui explore le sujet de l'ingénierie des données et de l'ingénierie des fonctionnalités pour l'apprentissage automatique (ML), en mettant l'accent sur les tâches d'apprentissage supervisées. Cette première partie traite des meilleures pratiques de prétraitement des données dans un pipeline ML sur Google Cloud. Le document se concentre sur l'utilisation de TensorFlow et la bibliothèque Open Source TensorFlow Transform ( tf.Transform ) pour préparer des données, former le modèle et servir le modèle de prédiction. Ce document met en évidence les défis de la prétraitement des données pour ML, et il décrit les options et les scénarios pour effectuer efficacement la transformation de données sur Google Cloud.

Ce document suppose que vous connaissez BigQuery , DataFlow , Vertex AI et l'API TensorFlow Keras .

Le deuxième document, le prétraitement des données pour ML avec Google Cloud , fournit un tutoriel étape par étape pour implémenter un pipeline tf.Transform .

Introduction

ML vous aide à trouver automatiquement des modèles complexes et potentiellement utiles dans les données. Ces modèles sont condensés dans un modèle ML qui peut ensuite être utilisé sur de nouveaux points de données - un processus appelé faire des prédictions ou effectuer une inférence .

La construction d'un modèle ML est un processus en plusieurs étapes. Chaque étape présente ses propres défis techniques et conceptuels. Cette série en deux parties se concentre sur les tâches d'apprentissage supervisées et le processus de sélection, de transformation et d'augmentation des données source pour créer de puissants signaux prédictifs à la variable cible. Ces opérations combinent les connaissances du domaine avec les techniques de science des données. Les opérations sont l'essence de l'ingénierie des fonctionnalités .

La taille des ensembles de données de formation pour les modèles ML du monde réel peut facilement être égal ou supérieur à un téraoctet (TB). Par conséquent, vous avez besoin de cadres de traitement de données à grande échelle afin de traiter ces ensembles de données efficacement et distribués. Lorsque vous utilisez un modèle ML pour faire des prédictions, vous devez appliquer les mêmes transformations que vous avez utilisées pour les données de formation sur les nouveaux points de données. En appliquant les mêmes transformations, vous présentez l'ensemble de données en direct au modèle ML comme le modèle attend.

Ce document traite de ces défis pour différents niveaux de granularité des opérations d'ingénierie des caractéristiques: agrégations au niveau de l'instance, passes complètes et à la fenêtre temporelle. Ce document décrit également les options et scénarios pour effectuer une transformation de données pour ML sur Google Cloud.

Ce document fournit également un aperçu de TensorFlow Transform ( tf.Transform ), une bibliothèque pour TensorFlow qui vous permet de définir à la fois la transformation de données au niveau de l'instance et pleine passe via des pipelines de prétraitement des données. Ces pipelines sont exécutés avec un faisceau Apache , et ils créent des artefacts qui vous permettent d'appliquer les mêmes transformations pendant la prédiction que lorsque le modèle est servi.

Données de prétraitement pour ML

Cette section introduit les opérations de prétraitement des données et les étapes de la préparation des données. Il traite également des types d'opérations de prétraitement et de leur granularité.

Ingénierie des données par rapport à l'ingénierie des fonctionnalités

Le prétraitement des données de ML implique à la fois l'ingénierie des données et l'ingénierie des fonctionnalités. L'ingénierie des données est le processus de conversion des données brutes en données préparées . L'ingénierie des fonctionnalités écoute ensuite les données préparées pour créer les fonctionnalités attendues par le modèle ML. Ces termes ont les significations suivantes:

Données brutes (ou simplement données )
Les données sous sa forme source, sans aucune préparation préalable pour ML. Dans ce contexte, les données peuvent être sous sa forme brute (dans un lac de données) ou sous une forme transformée (dans un entrepôt de données). Les données transformées qui se trouvent dans un entrepôt de données auraient pu être converties de sa forme brute d'origine pour être utilisée pour l'analyse. Cependant, dans ce contexte, les données brutes signifient que les données n'ont pas été préparées spécifiquement pour votre tâche ML. Les données sont également considérées comme des données brutes si elles sont envoyées à partir de systèmes de streaming qui finissent par appeler les modèles ML pour les prédictions.
Données préparées
L'ensemble de données dans le formulaire prêt pour votre tâche ML: les sources de données ont été analysées, rejointes et mises dans un formulaire tabulaire. Les données préparées sont agrégées et résumées à la granularité droite - par exemple, chaque ligne de l'ensemble de données représente un client unique, et chaque colonne représente des informations sommaires pour le client, comme le total dépensé au cours des six dernières semaines. Dans une table de données préparée, des colonnes non pertinentes ont été abandonnées et des enregistrements non valides ont été filtrés. Pour les tâches d'apprentissage supervisées, la fonctionnalité cible est présente.
Caractéristiques d'ingénierie
L'ensemble de données avec les fonctionnalités accordées attendues par le modèle - c'est-à-dire des fonctionnalités créées en effectuant certaines opérations spécifiques à la ML sur les colonnes de l'ensemble de données préparé et en créant de nouvelles fonctionnalités pour votre modèle pendant la formation et la prédiction, comme décrit plus loin dans les opérations de prétraitement . Des exemples de ces opérations incluent la mise à l'échelle des colonnes numériques à une valeur entre 0 et 1, les valeurs de coupure et les caractéristiques catégorielles à un codage .

Le diagramme suivant, figure 1, montre les étapes impliquées dans la préparation des données prétraitées:

Diagramme de débit montrant des données brutes se déplaçant vers des données préparées se déplaçant vers des fonctionnalités d'ingénierie.
Figure 1. Le flux de données des données brutes aux données préparées aux fonctionnalités conçues à l'apprentissage automatique.

Dans la pratique, les données de la même source sont souvent à différents stades de préparation. Par exemple, un champ d'un tableau de votre entrepôt de données peut être utilisé directement comme fonctionnalité d'ingénierie. Dans le même temps, un autre champ dans le même tableau pourrait avoir besoin de passer par des transformations avant de devenir une fonctionnalité d'ingénierie. De même, l'ingénierie des données et les opérations d'ingénierie des fonctionnalités peuvent être combinées dans la même étape de prétraitement des données.

Opérations de prétraitement

Le prétraitement des données comprend plusieurs opérations. Chaque opération est conçue pour aider la ML à construire de meilleurs modèles prédictifs. Les détails de ces opérations de prétraitement sont en dehors de la portée de ce document, mais certaines opérations sont brièvement décrites dans cette section.

Pour les données structurées, les opérations de prétraitement des données comprennent les éléments suivants:

  • Nettoyage des données: supprimer ou corriger les enregistrements qui ont des valeurs corrompues ou non valides des données brutes et la suppression des enregistrements qui manquent un grand nombre de colonnes.
  • Sélection des instances et partitionnement: sélection des points de données dans l'ensemble de données d'entrée pour créer une formation, une évaluation (validation) et des ensembles de tests . Ce processus comprend des techniques d'échantillonnage aléatoire reproductible, de suréchantillonnage des classes minoritaires et de partitionnement stratifié.
  • Digne des fonctionnalités: améliorant la qualité d'une fonctionnalité pour ML, qui comprend la mise à l'échelle et la normalisation des valeurs numériques, l'imputation de valeurs manquantes, l'écrasement des valeurs aberrantes et l'ajustement des valeurs qui ont des distributions asymétriques.
  • Transformation des fonctionnalités: convertir une caractéristique numérique en une caractéristique catégorique (par backétisation ) et convertir les caractéristiques catégorielles en une représentation numérique (grâce à un codage à un hot, à l'apprentissage avec des dénombrements , des intérêts clairsemés, etc.). Certains modèles ne fonctionnent qu'avec des fonctionnalités numériques ou catégorielles, tandis que d'autres peuvent gérer les fonctionnalités de type mixte. Même lorsque les modèles gèrent les deux types, ils peuvent bénéficier de différentes représentations (numériques et catégorielles) de la même caractéristique.
  • Extraction des fonctionnalités: réduisant le nombre de fonctionnalités en créant des représentations de données plus faibles, plus puissantes en utilisant des techniques telles que l'ACP , l'extraction d'intégration et le hachage .
  • Sélection des fonctionnalités: sélection d'un sous-ensemble des fonctionnalités d'entrée pour la formation du modèle et en ignorant celles non pertinentes ou redondantes, en utilisant des méthodes de filtre ou de wrapper . La sélection des fonctionnalités peut également impliquer de simplement abandonner les fonctionnalités si les fonctionnalités manquent un grand nombre de valeurs.
  • Construction des fonctionnalités: création de nouvelles fonctionnalités en utilisant des techniques typiques, telles que l'expansion polynomiale (en utilisant des fonctions mathématiques univariées) ou un passage à caractéristique (pour capturer les interactions des fonctionnalités). Les fonctionnalités peuvent également être construites en utilisant la logique métier à partir du domaine du cas d'utilisation ML.

Lorsque vous travaillez avec des données non structurées (par exemple, des images, des documents audio ou texte), Deep Learning remplace l'ingénierie des fonctionnalités basée sur le domaine en les repliant dans l'architecture du modèle. Une couche convolutionnelle est un préprocesseur de fonctionnalité automatique. La construction de la bonne architecture du modèle nécessite une connaissance empirique des données. De plus, une certaine quantité de prétraitement est nécessaire, comme ce qui suit:

  • Pour les documents textuels: engendrés et la lemmatisation , le calcul TF-IDF et l'extraction N-gram , la recherche d'intégration.
  • Pour les images: coupure, redimensionnement, recadrage, flou gaussien et filtres canaries.
  • Pour tous les types de données (y compris le texte et les images): Transférer l'apprentissage , qui traite les couches tout-mais-dernière du modèle entièrement formé comme étape d'ingénierie des fonctionnalités.

Granularité de prétraitement

Cette section traite de la granularité des types de transformations de données. Il montre pourquoi cette perspective est critique lors de la préparation de nouveaux points de données pour les prédictions en utilisant des transformations qui sont appliquées sur les données de formation.

Les opérations de prétraitement et de transformation peuvent être classées comme suit, en fonction de l'opération granularité:

  • Transformations au niveau de l'instance pendant la formation et la prédiction . Ce sont des transformations simples, où seules les valeurs de la même instance sont nécessaires pour la transformation. Par exemple, les transformations au niveau de l'instance peuvent inclure la civil de la valeur d'une fonctionnalité à un seuil, élargissant polynomialement une autre fonctionnalité, multipliant deux fonctionnalités ou comparant deux fonctionnalités pour créer un drapeau booléen.

    Ces transformations doivent être appliquées de manière identique pendant l'entraînement et la prédiction, car le modèle sera formé sur les caractéristiques transformées, et non sur les valeurs d'entrée brutes. Si les données ne sont pas transformées de manière identique, le modèle se comporte mal parce qu'il est présenté avec des données qui ont une distribution des valeurs avec lesquelles il n'a pas été formé. Pour plus d'informations, consultez la discussion de l'inclinaison de la formation dans la section des défis de prétraitement .

  • Transformations de passe-temps pendant l'entraînement, mais les transformations au niveau de l'instance pendant la prédiction . Dans ce scénario, les transformations sont avec état, car elles utilisent certaines statistiques précomputées pour effectuer la transformation. Pendant l'entraînement, vous analysez l'ensemble des données d'entraînement pour calculer des quantités telles que le minimum, le maximum, la moyenne et la variance pour transformer les données de formation, les données d'évaluation et les nouvelles données au moment de la prédiction.

    Par exemple, pour normaliser une caractéristique numérique pour l'entraînement, vous calculez sa moyenne (μ) et son écart-type (σ) dans l'ensemble des données d'entraînement. Ce calcul est appelé opération passe-passe (ou analyse ). Lorsque vous servez le modèle de prédiction, la valeur d'un nouveau point de données est normalisée pour éviter le biais de la formation. Par conséquent, les valeurs μ et σ calculées pendant la formation sont utilisées pour ajuster la valeur de la fonctionnalité, qui est le fonctionnement simple au niveau de l'instance :

    $$ value_{scaled} = (value_{raw} - \mu) \div \sigma $$

    Les transformations passes complètes incluent les éléments suivants:

    • Caractéristiques numériques de mise à l'échelle Minmax utilisant MIN et MAX calculées à partir de l'ensemble de données de formation.
    • Caractéristiques numériques de mise à l'échelle standard (normalisation du score z) utilisant μ et σ calculées sur l'ensemble de données de formation.
    • Podensization des caractéristiques numériques à l'aide de quantiles.
    • Imputant les valeurs manquantes à l'aide de la médiane (caractéristiques numériques) ou du mode (caractéristiques catégorielles).
    • Conversion des chaînes (valeurs nominales) en entiers (index) en extraction de toutes les valeurs distinctes (vocabulaire) d'une caractéristique catégorielle d'entrée.
    • Compter l'occurrence d'un terme (valeur de fonctionnalité) dans tous les documents (instances) à calculer pour TF-IDF.
    • Computer l'ACP des fonctionnalités d'entrée pour projeter les données dans un espace dimensionnel inférieur (avec des fonctionnalités linéairement dépendantes).

    Vous devez utiliser uniquement les données d'entraînement pour calculer des statistiques comme μ, σ, min et max . Si vous ajoutez les données de test et d'évaluation pour ces opérations, vous fuisez des informations des données d'évaluation et de test pour former le modèle. Cela affecte la fiabilité des résultats du test et de l'évaluation. Pour vous assurer que vous appliquez une transformation cohérente à tous les ensembles de données, vous utilisez les mêmes statistiques calculées à partir des données de formation pour transformer les données de test et d'évaluation.

  • Agrégations historiques pendant la formation et la prédiction . Cela implique la création d'agrégations commerciales, les dérivations et les drapeaux en tant que signaux d'entrée à la tâche de prédiction, par exemple, la création de mesures de récence, de fréquence et de monétaire (RFM) pour que les clients puissent créer des modèles de propension. Ces types de fonctionnalités peuvent être pré-calés et stockés dans un magasin de fonctionnalités à utiliser pendant la formation des modèles, la notation par lots et la fonction de prédiction en ligne. Vous pouvez également effectuer une ingénierie de fonctionnalités supplémentaires (par exemple, la transformation et le réglage) à ces agrégations avant l'entraînement et la prédiction.

  • Agrégations historiques pendant la formation, mais les agrégations en temps réel pendant la prédiction . Cette approche consiste à créer une fonctionnalité en résumant les valeurs en temps réel au fil du temps. Dans cette approche, les cas à agréger sont définis à travers des clauses de fenêtre temporelles. Par exemple, vous pouvez utiliser cette approche si vous souhaitez former un modèle qui estime le temps de randonnée en taxi en fonction des mesures de circulation pour l'itinéraire au cours des 5 dernières minutes, au cours des 10 dernières minutes, dans les 30 dernières minutes et à d'autres intervalles. Vous pouvez également utiliser cette approche pour prédire la défaillance d'une partie du moteur en fonction de la moyenne mobile des valeurs de température et de vibration calculées au cours des 3 dernières minutes. Bien que ces agrégations puissent être préparées hors ligne pour la formation, elles sont calculées en temps réel à partir d'un flux de données pendant la servitude.

    Plus précisément, lorsque vous préparez les données de formation, si la valeur agrégée n'est pas dans les données brutes, la valeur est créée pendant la phase d'ingénierie des données. Les données brutes sont généralement stockées dans une base de données avec un format de (entity, timestamp, value) . Dans les exemples précédents, entity est l'identifiant du segment de route pour les itinéraires de taxi et l'identifiant de la pièce du moteur pour la défaillance du moteur. Vous pouvez utiliser des opérations de fenêtre pour calculer (entity, time_index, aggregated_value_over_time_window) et utiliser les fonctionnalités d'agrégation comme entrée pour votre formation de modèle.

    Lorsque le modèle de prédiction en temps réel (en ligne) est servi, le modèle attend des fonctionnalités dérivées des valeurs agrégées en entrée. Par conséquent, vous pouvez utiliser une technologie de transformation de flux comme Apache Beam pour calculer les agrégations à partir des points de données en temps réel diffusés dans votre système. La technologie de traitement des flux regroupe les données en temps réel en fonction des fenêtres de temps à mesure que de nouveaux points de données arrivent. Vous pouvez également effectuer une ingénierie de fonctionnalités supplémentaires (par exemple, la transformation et le réglage) à ces agrégations avant l'entraînement et la prédiction.

Pipeline ML sur Google Cloud

Cette section traite des composants principaux d'un pipeline de bout en bout typique pour former et servir les modèles TensorFlow ML sur Google Cloud à l'aide de services gérés. Il examine également où vous pouvez mettre en œuvre différentes catégories des opérations de prétraitement des données et des défis communs auxquels vous pourriez faire face lorsque vous implémentez de telles transformations. La section How tf.Transform Works montre comment la bibliothèque de transformation TensorFlow aide à relever ces défis.

Architecture de haut niveau

Le diagramme suivant, la figure 2, montre une architecture de haut niveau d'un pipeline ML typique pour l'entraînement et le service de modèles TensorFlow. Les étiquettes A, B et C dans le diagramme se réfèrent aux différents endroits du pipeline où le prétraitement des données peut avoir lieu. Des détails sur ces étapes sont fournis dans la section suivante.

Diagramme d'architecture montrant les étapes du traitement des données.
Figure 2. Architecture de haut niveau pour la formation ML et le service sur Google Cloud.

Le pipeline se compose des étapes suivantes:

  1. Une fois les données brutes importées, les données tabulaires sont stockées dans BigQuery et d'autres données comme les images, l'audio et la vidéo sont stockées dans le stockage cloud. La deuxième partie de cette série utilise des données tabulaires stockées dans BigQuery comme exemple.
  2. L'ingénierie des données (préparation) et l'ingénierie des fonctionnalités sont exécutées à grande échelle à l'aide de Dataflow. Cette exécution produit des ensembles de formation, d'évaluation et de test prêts pour la ML qui sont stockés dans le stockage cloud. Idéalement, ces ensembles de données sont stockés sous forme de fichiers tfrecord , qui est le format optimisé pour les calculs tensorflow.
  3. Un package TensorFlow Model Trainer est soumis à la formation Vertex AI, qui utilise les données prétraitées des étapes précédentes pour former le modèle. La sortie de cette étape est un TensorFlow SavedModel formé qui est exporté vers le stockage cloud.
  4. Le modèle TensorFlow formé est déployé sur la prédiction Vertex AI en tant que service qui a une API REST afin qu'il puisse être utilisé pour les prédictions en ligne. Le même modèle peut également être utilisé pour les travaux de prédiction par lots.
  5. Une fois le modèle déployé en tant qu'API REST, les applications client et les systèmes internes peuvent invoquer l'API en envoyant des demandes avec certains points de données et en recevant des réponses du modèle avec des prédictions.
  6. Pour orchestrer et automatiser ce pipeline, vous pouvez utiliser des pipelines Vertex AI comme planificateur pour invoquer la préparation des données, la formation du modèle et les étapes de déploiement du modèle.

Vous pouvez également utiliser le magasin de fonctionnalités Vertex AI pour stocker les fonctionnalités d'entrée pour faire des prédictions. Par exemple, vous pouvez créer périodiquement des fonctionnalités d'ingénierie à partir des dernières données brutes et les stocker dans le magasin de fonctionnalités Vertex AI. Les applications client récupèrent les fonctionnalités d'entrée requises du magasin de fonctionnalités Vertex AI et envoyez-les au modèle pour recevoir des prédictions.

Où faire le prétraitement

Dans la figure 2, les étiquettes A, B et C montrent que les opérations de prétraitement des données peuvent avoir lieu dans BigQuery, Dataflow ou TensorFlow. Les sections suivantes décrivent le fonctionnement de chacune de ces options.

Option A: BigQuery

En règle générale, la logique est implémentée dans BigQuery pour les opérations suivantes:

  • Échantillonnage: sélectionnant au hasard un sous-ensemble dans les données.
  • Filtrage: élimination des instances non pertinentes ou non valides.
  • Partionnement: division des données pour produire des ensembles de formation, d'évaluation et de tests.

Les scripts BigQuery SQL peuvent être utilisés comme une requête source pour le pipeline de prétraitement du flux de données, qui est l'étape de traitement des données dans la figure 2. Par exemple, si un système est utilisé au Canada, et l'entrepôt de données a des transactions du monde entier, en filtrant vers Il est préférable de faire des données de formation au Canada à BigQuery. L'ingénierie des fonctionnalités dans BigQuery est simple et évolutive, et prend en charge la mise en œuvre des transformations de fonctions au niveau de l'instance et historiques.

Cependant, nous vous recommandons d'utiliser BigQuery pour l'ingénierie des fonctionnalités uniquement si vous utilisez votre modèle pour la prédiction par lots (score), ou si les fonctionnalités sont précomputées dans BigQuery, mais stockées dans le magasin de fonctions Vertex AI à utiliser pendant la prédiction en ligne. Si vous prévoyez de déployer le modèle de prédictions en ligne, et si vous n'avez pas la fonctionnalité d'ingénierie dans une boutique de fonctionnalités en ligne, vous devez reproduire les opérations de prétraitement SQL pour transformer les points de données bruts que d'autres systèmes génèrent. En d'autres termes, vous devez implémenter la logique deux fois: une fois en SQL pour prétraiter les données de formation à BigQuery, et une deuxième fois dans la logique de l'application qui consomme le modèle pour prétraiter les points de données en ligne pour la prédiction.

Par exemple, si votre application client est écrite en Java, vous devez réimplémenter la logique en Java. Cela peut introduire des erreurs dues aux écarts de mise en œuvre, comme décrit dans la section biaisée de formation des défis de prétraitement plus loin dans ce document. Il est également des frais généraux supplémentaires pour maintenir deux implémentations différentes. Chaque fois que vous modifiez la logique en SQL pour prétraiter les données de formation, vous devez modifier l'implémentation Java en conséquence aux données de prétraitement au moment de la servitude.

Si vous utilisez votre modèle uniquement pour la prédiction par lots (par exemple, en utilisant la prédiction par lots Vertex AI), et si vos données de notation proviennent de BigQuery, vous pouvez implémenter ces opérations de prétraitement dans le cadre du script BigQuery SQL. Dans ce cas, vous pouvez utiliser le même script SQL de prétraitement pour préparer des données de formation et de notation.

Les transformations complets de passage ne sont pas adaptées à la mise en œuvre dans BigQuery. Si vous utilisez BigQuery pour les transformations passes complètes, vous avez besoin de tables auxiliaires pour stocker les quantités nécessaires aux transformations avec état, telles que les moyens et les variances pour mettre à l'échelle les caractéristiques numériques. En outre, la mise en œuvre de transformations de passeurs complètes à l'aide de SQL sur BigQuery crée une complexité accrue dans les scripts SQL et crée une dépendance complexe entre la formation et les scripts SQL de score.

Option B: Dataflow

Comme le montre la figure 2, vous pouvez implémenter des opérations de prétraitement coûteuses en calcul dans le faisceau Apache et les exécuter à grande échelle à l'aide de Dataflow. DataFlow est un service de mise à l'échelle entièrement géré pour le traitement des données par lots et en cours d'eau. Lorsque vous utilisez Dataflow, vous pouvez également utiliser des bibliothèques spécialisées externes pour le traitement des données, contrairement à BigQuery.

DataFlow peut effectuer des transformations au niveau de l'instance et des transformations de fonctionnalités d'agrégation historiques et en temps réel. En particulier, si vos modèles ML s'attendent à une fonctionnalité d'entrée comme total_number_of_clicks_last_90sec , les fonctions de fenêtre de faisceau Apache peuvent calculer ces fonctionnalités en fonction de l'agrégation des valeurs des fenêtres temporelles des données d'événements en temps réel (streaming) (par exemple, cliquez sur les événements). Dans la discussion antérieure sur la granularité des transformations , cela a été appelé «agrégations historiques pendant la formation, mais des agrégations en temps réel pendant la prédiction».

Le diagramme suivant, la figure 3, montre le rôle du flux de données dans le traitement des données des flux pour les prédictions en temps quasi réel.

Architecture pour l'utilisation des données de flux pour la prédiction.
Figure 3. Architecture de haut niveau à l'aide de données de flux pour la prédiction dans Dataflow.

Comme le montre la figure 3, pendant le traitement, les événements appelés points de données sont ingérés dans Pub / Sub . DataFlow consomme ces points de données, calcule les fonctionnalités basées sur des agrégats au fil du temps, puis appelle l'API du modèle ML déployé pour les prédictions. Les prédictions sont ensuite envoyées à un pub / sous-file d'attente sortant. À partir de Pub / Sub, les prédictions peuvent être consommées par des systèmes en aval comme la surveillance ou le contrôle, ou ils peuvent être repoussés (par exemple, en tant que notifications) au client de demande d'origine. Les prédictions peuvent également être stockées dans un magasin de données à faible latence comme Cloud BigTable pour une récupération en temps réel. Cloud BigTable peut également être utilisé pour accumuler et stocker ces agrégations en temps réel afin qu'elles puissent être recherchées en cas de prédiction.

La même implémentation du faisceau Apache peut être utilisée pour les données de formation par lots qui proviennent d'un pas de données hors ligne comme BigQuery et Stream-Process Data en temps réel pour servir des prédictions en ligne.

Dans d'autres architectures typiques, telles que l'architecture illustrée à la figure 2, l'application client appelle directement l'API du modèle déployé pour les prédictions en ligne. Dans ce cas, si les opérations de prétraitement sont implémentées dans Dataflow pour préparer les données de formation, les opérations ne sont pas appliquées aux données de prédiction qui vont directement au modèle. Par conséquent, des transformations comme celles-ci devraient être intégrées dans le modèle lors de la fonction des prédictions en ligne.

Le flux de données peut être utilisé pour effectuer une transformation passe-passe, en calculant les statistiques requises à grande échelle. Cependant, ces statistiques doivent être stockées quelque part pour être utilisées pendant la prédiction pour transformer les points de données de prédiction. En utilisant la bibliothèque TensorFlow Transform ( tf.Transform ), vous pouvez intégrer directement ces statistiques dans le modèle au lieu de les stocker ailleurs. Cette approche est expliquée plus loin dans le fonctionnement de TF.Transform .

Option C: TensorFlow

Comme le montre la figure 2, vous pouvez implémenter les opérations de prétraitement et de transformation des données dans le modèle TensorFlow lui-même. Comme le montre la figure, le prétraitement que vous implémentez pour la formation du modèle TensorFlow devient une partie intégrante du modèle lorsque le modèle est exporté et déployé pour les prédictions. Les transformations du modèle TensorFlow peuvent être accomplies de l'une des manières suivantes:

  • Implémentation de toute la logique de transformation au niveau de l'instance dans la fonction input_fn et dans la fonction serving_fn . La fonction input_fn prépare un ensemble de données à l'aide de l' API tf.data.Dataset pour la formation d'un modèle. La fonction serving_fn reçoit et prépare les données pour les prédictions.
  • Mettre le code de transformation directement dans votre modèle TensorFlow en utilisant des couches de prépromis Keras ou en créant des couches personnalisées .

Le code de logique de transformation dans la fonction serving_fn définit l'interface de service de votre SavedModel pour la prédiction en ligne. Si vous implémentez les mêmes transformations qui ont été utilisées pour préparer des données de formation dans le code logique de transformation de la fonction serving_fn , il garantit que les mêmes transformations sont appliquées à de nouveaux points de données de prédiction lorsqu'ils sont servis.

Cependant, comme le modèle TensorFlow traite chaque point de données indépendamment ou dans un petit lot, vous ne pouvez pas calculer les agrégations à partir de tous les points de données. En conséquence, les transformations passes complets ne peuvent pas être implémentées dans votre modèle TensorFlow.

Défis de prétraitement

Voici les principaux défis de la mise en œuvre du prétraitement des données:

  • Asymétrie à séduction de la formation . L'insemblement de formation de la formation fait référence à une différence entre l'efficacité (performance prédictive) pendant la formation et pendant les services. Ce biais peut être causé par une différence entre la façon dont vous gérez les données dans la formation et les pipelines de service. Par exemple, si votre modèle est formé sur une fonctionnalité transformée par logarithmique, mais qu'il est présenté avec la fonction RAW pendant le service, la sortie de prédiction pourrait ne pas être exacte.

    Si les transformations font partie du modèle lui-même, il peut être simple de gérer les transformations au niveau de l'instance, comme décrit précédemment dans l'option C: TensorFlow . Dans ce cas, l'interface de service du modèle (la fonction serving_fn ) s'attend à des données brutes, tandis que le modèle transforme en interne ces données avant de calculer la sortie. Les transformations sont les mêmes que celles qui ont été appliquées sur les points de données de formation et de prédiction bruts.

  • Transformations de passe-temps . You can't implement full-pass transformations such as scaling and normalization transformations in your TensorFlow model. In full-pass transformations, some statistics (for example, max and min values to scale numeric features) must be computed on the training data beforehand, as described in Option B: Dataflow . The values then have to be stored somewhere to be used during model serving for prediction to transform the new raw data points as instance-level transformations, which avoids training-serving skew. You can use the TensorFlow Transform ( tf.Transform ) library to directly embed the statistics in your TensorFlow model. This approach is explained later in How tf.Transform works .

  • Preparing the data up front for better training efficiency . Implementing instance-level transformations as part of the model can degrade the efficiency of the training process. This degradation occurs because the same transformations are repeatedly applied to the same training data on each epoch. Imagine that you have raw training data with 1,000 features, and you apply a mix of instance-level transformations to generate 10,000 features. If you implement these transformations as part of your model, and if you then feed the model the raw training data, these 10,000 operations are applied N times on each instance, where N is the number of epochs. In addition, if you're using accelerators (GPUs or TPUs), they sit idle while the CPU performs those transformations, which isn't an efficient use of your costly accelerators.

    Ideally, the training data is transformed before training, using the technique described under Option B: Dataflow , where the 10,000 transformation operations are applied only once on each training instance. The transformed training data is then presented to the model. No further transformations are applied, and the accelerators are busy all of the time. In addition, using Dataflow helps you to preprocess large amounts of data at scale, using a fully managed service.

    Preparing the training data up front can improve training efficiency. However, implementing the transformation logic outside of the model (the approaches described in Option A: BigQuery or Option B: Dataflow ) doesn't resolve the issue of training-serving skew. Unless you store the engineered feature in the feature store to be used for both training and prediction, the transformation logic must be implemented somewhere to be applied on new data points coming for prediction, because the model interface expects transformed data. The TensorFlow Transform ( tf.Transform ) library can help you to address this issue, as described in the following section.

How tf.Transform works

The tf.Transform library is useful for transformations that require a full pass. The output of the tf.Transform library is exported as a TensorFlow graph that represents the instance-level transformation logic and the statistics computed from full-pass transformations, to be used for training and serving. Using the same graph for both training and serving can prevent skew, because the same transformations are applied in both stages. In addition, the tf.Transform library can run at scale in a batch processing pipeline on Dataflow to prepare the training data up front and improve training efficiency.

The following diagram, figure 4, shows how the tf.Transform library preprocesses and transforms data for training and prediction. The process is described in the following sections.

Diagram showing flow from raw data through tf.Transform to predictions.
Figure 4. Behavior of tf.Transform for preprocessing and transforming data.

Transform training and evaluation data

You preprocess the raw training data using the transformation implemented in the tf.Transform Apache Beam APIs, and run it at scale on Dataflow. The preprocessing occurs in the following phases:

  • Analyze phase: During the analyze phase, the required statistics (like means, variances, and quantiles) for stateful transformations are computed on the training data with full-pass operations. This phase produces a set of transformation artifacts, including the transform_fn graph. The transform_fn graph is a TensorFlow graph that has the transformation logic as instance-level operations. It includes the statistics computed in the analyze phase as constants.
  • Transform phase: During the transform phase, the transform_fn graph is applied to the raw training data, where the computed statistics are used to process the data records (for example, to scale numerical columns) in an instance-level fashion.

A two-phase approach like this addresses the preprocessing challenge of performing full-pass transformations.

When the evaluation data is preprocessed, only instance-level operations are applied, using the logic in the transform_fn graph and the statistics computed from the analyze phase in the training data. In other words, you don't analyze the evaluation data in a full-pass fashion to compute new statistics, such as μ and σ, to normalize numeric features in evaluation data. Instead, you use the computed statistics from the training data to transform the evaluation data in an instance-level fashion.

The transformed training and evaluation data are prepared at scale using Dataflow, before they are used to train the model. This batch data-preparation process addresses the preprocessing challenge of preparing the data up front to improve training efficiency. As shown in figure 4, the model internal interface expects transformed features.

Attach transformations to the exported model

As noted, the transform_fn graph that's produced by the tf.Transform pipeline is stored as an exported TensorFlow graph. The exported graph consists of the transformation logic as instance-level operations, and all of the statistics computed in the full-pass transformations as graph constants. When the trained model is exported for serving, the transform_fn graph is attached to the SavedModel as part of its serving_fn function.

While it's serving the model for prediction, the model serving interface expects data points in the raw format (that is, before any transformations). However, the model internal interface expects the data in the transformed format.

The transform_fn graph, which is now part of the model, applies all the preprocessing logic on the incoming data point. It uses the stored constants (like μ and σ to normalize the numeric features) in the instance-level operation during prediction. Therefore, the transform_fn graph converts the raw data point into the transformed format. The transformed format is what is expected by the model internal interface in order to produce prediction, as shown in figure 4.

This mechanism resolves the preprocessing challenge of the training-serving skew, because the same logic (implementation) that is used to transform the training and evaluation data is applied to transform the new data points during prediction serving.

Preprocessing options summary

The following table summarizes the data preprocessing options that this document discussed. In the table, "N/A" stands for "not applicable."

Data preprocessing option Instance-level
(stateless transformations)

Full-pass during training and instance-level during serving (stateful transformations)

Real-time (window) aggregations during training and serving (streaming transformations)

BigQuery (SQL)

Batch scoring: OK —the same transformation implementation is applied on data during training and batch scoring.

Online prediction: Not recommended —you can process training data, but it results in training-serving skew because you process serving data using different tools.

Batch scoring: Not recommended .

Online prediction: Not recommended .

Although you can use statistics computed using BigQuery for instance-level batch/online transformations, it isn't easy because you must maintain a stats store to be populated during training and used during prediction.

Batch scoring: N/A —aggregates like these are computed based on real-time events.

Online prediction: Not recommended —you can process training data, but it results in training-serving skew because you process serving data using different tools.

Dataflow (Apache Beam)

Batch scoring: OK —the same transformation implementation is applied on data during training and batch scoring.

Online prediction: OK —if data at serving time comes from Pub/Sub to be consumed by Dataflow. Otherwise, results in training-serving skew.

Batch scoring: Not recommended .

Online predictions: Not recommended .

Although you can use statistics computed using Dataflow for instance-level batch/online transformations, it isn't easy because you must maintain a stats store to be populated during training and used during prediction.

Batch scoring: N/A —aggregates like these are computed based on real-time events.

Online prediction: OK —the same Apache Beam transformation is applied on data during training (batch) and serving (stream).

Dataflow (Apache Beam + TFT)

Batch scoring: OK —the same transformation implementation is applied to data during training and batch scoring.

Online prediction: Recommended —it avoids training-serving skew and prepares training data up front.

Batch scoring: Recommended .

Online prediction: Recommended .

Both uses are recommended because transformation logic and computed statistics during training are stored as a TensorFlow graph that's attached to the exported model for serving.

Batch scoring: N/A —aggregates like these are computed based on real-time events.

Online prediction: OK —the same Apache Beam transformation is applied on data during training (batch) and serving (stream).

TensorFlow *
( input_fn & serving_fn )

Batch scoring: Not recommended .

Online prediction: Not recommended .

For training efficiency in both cases, it's better to prepare the training data up front.

Batch scoring: Not Possible .

Online prediction: Not Possible .

Batch scoring: N/A —aggregates like these are computed based on real-time events.

Online prediction: Not Possible .

* With TensorFlow, transformations like crossing, embedding, and one-hot encoding should be performed declaratively as feature_columns columns.

What's next

,

This document is the first in a two-part series that explores the topic of data engineering and feature engineering for machine learning (ML), with a focus on supervised learning tasks. This first part discusses the best practices for preprocessing data in an ML pipeline on Google Cloud. The document focuses on using TensorFlow and the open source TensorFlow Transform ( tf.Transform ) library to prepare data, train the model, and serve the model for prediction. This document highlights the challenges of preprocessing data for ML, and it describes the options and scenarios for performing data transformation on Google Cloud effectively.

This document assumes that you're familiar with BigQuery , Dataflow , Vertex AI , and the TensorFlow Keras API.

The second document, Data preprocessing for ML with Google Cloud , provides a step-by-step tutorial for how to implement a tf.Transform pipeline.

Introduction

ML helps you automatically find complex and potentially useful patterns in data. These patterns are condensed in an ML model that can then be used on new data points—a process called making predictions or performing inference .

Building an ML model is a multistep process. Each step presents its own technical and conceptual challenges. This two-part series focuses on supervised learning tasks and the process of selecting, transforming, and augmenting the source data to create powerful predictive signals to the target variable. These operations combine domain knowledge with data science techniques. The operations are the essence of feature engineering .

The size of training datasets for real-world ML models can easily be equal to or greater than one terabyte (TB). Therefore, you need large-scale data processing frameworks in order to process these datasets efficiently and distributedly. When you use an ML model to make predictions, you have to apply the same transformations that you used for the training data on the new data points. By applying the same transformations, you present the live dataset to the ML model the way that the model expects.

This document discusses these challenges for different levels of granularity of feature engineering operations: instance-level, full-pass, and time-window aggregations. This document also describes the options and scenarios to perform data transformation for ML on Google Cloud.

This document also provides an overview of TensorFlow Transform ( tf.Transform ), a library for TensorFlow that lets you define both instance-level and full-pass data transformation through data preprocessing pipelines. These pipelines are executed with Apache Beam , and they create artifacts that let you apply the same transformations during prediction as when the model is served.

Preprocessing data for ML

This section introduces data preprocessing operations and stages of data readiness. It also discusses the types of the preprocessing operations and their granularity.

Data engineering compared to feature engineering

Preprocessing the data for ML involves both data engineering and feature engineering. Data engineering is the process of converting raw data into prepared data . Feature engineering then tunes the prepared data to create the features that are expected by the ML model. These terms have the following meanings:

Raw data (or just data )
The data in its source form, without any prior preparation for ML. In this context, the data might be in its raw form (in a data lake) or in a transformed form (in a data warehouse). Transformed data that's in a data warehouse might have been converted from its original raw form to be used for analytics. However, in this context, raw data means that the data hasn't been prepared specifically for your ML task. Data is also considered raw data if it's sent from streaming systems that eventually call ML models for predictions.
Prepared data
The dataset in the form ready for your ML task: data sources have been parsed, joined, and put into a tabular form. Prepared data is aggregated and summarized to the right granularity—for example, each row in the dataset represents a unique customer, and each column represents summary information for the customer, like the total spent in the last six weeks. In a prepared data table, irrelevant columns have been dropped, and invalid records have been filtered out. For supervised learning tasks, the target feature is present.
Engineered features
The dataset with the tuned features that are expected by the model—that is, features that are created by performing certain ML-specific operations on the columns in the prepared dataset, and creating new features for your model during training and prediction, as described later in Preprocessing operations . Examples of these operations include scaling numerical columns to a value between 0 and 1, clipping values, and one-hot-encoding categorical features.

The following diagram, figure 1, shows the steps that are involved in preparing preprocessed data:

Flow diagram showing raw data moving to prepared data moving to engineered features.
Figure 1. The flow of data from raw data to prepared data to engineered features to machine learning.

In practice, data from the same source is often at different stages of readiness. For example, a field from a table in your data warehouse might be used directly as an engineered feature. At the same time, another field in the same table might need to go through transformations before it becomes an engineered feature. Similarly, data engineering and feature engineering operations might be combined in the same data preprocessing step.

Preprocessing operations

Data preprocessing includes several operations. Each operation is designed to help ML build better predictive models. The details of these preprocessing operations are outside the scope of this document, but some operations are briefly described in this section.

For structured data, data preprocessing operations include the following:

  • Data cleansing: removing or correcting records that have corrupted or invalid values from raw data, and removing records that are missing a large number of columns.
  • Instances selection and partitioning: selecting data points from the input dataset to create training, evaluation (validation), and test sets . This process includes techniques for repeatable random sampling, minority classes oversampling, and stratified partitioning.
  • Feature tuning: improving the quality of a feature for ML, which includes scaling and normalizing numeric values, imputing missing values, clipping outliers, and adjusting values that have skewed distributions.
  • Feature transformation: converting a numeric feature to a categorical feature (through bucketization ), and converting categorical features to a numeric representation (through one-hot encoding, learning with counts , sparse feature embeddings, etc.). Some models work only with numeric or categorical features, while others can handle mixed type features. Even when models handle both types, they can benefit from different representations (numeric and categorical) of the same feature.
  • Feature extraction: reducing the number of features by creating lower-dimension, more powerful data representations using techniques such as PCA , embedding extraction, and hashing .
  • Feature selection: selecting a subset of the input features for training the model, and ignoring the irrelevant or redundant ones, using filter or wrapper methods . Feature selection can also involve simply dropping features if the features are missing a large number of values.
  • Feature construction: creating new features by using typical techniques, such as polynomial expansion (by using univariate mathematical functions) or feature crossing (to capture feature interactions). Features can also be constructed by using business logic from the domain of the ML use case.

When you work with unstructured data (for example, images, audio, or text documents), deep learning replaces domain-knowledge-based feature engineering by folding it into the model architecture. A convolutional layer is an automatic feature preprocessor. Constructing the right model architecture requires some empirical knowledge of the data. In addition, some amount of preprocessing is needed, such as the following:

  • For text documents: stemming and lemmatization , TF-IDF calculation, and n-gram extraction, embedding lookup.
  • For images: clipping, resizing, cropping, Gaussian blur, and canary filters.
  • For all types of data (including text and images): transfer learning , which treats all-but-last layers of the fully trained model as a feature engineering step.

Preprocessing granularity

This section discusses the granularity of types of data transformations. It shows why this perspective is critical when preparing new data points for predictions using transformations that are applied on training data.

Preprocessing and transformation operations can be categorized as follows, based on operation granularity:

  • Instance-level transformations during training and prediction . These are straightforward transformations, where only values from the same instance are needed for the transformation. For example, instance-level transformations might include clipping the value of a feature to some threshold, polynomially expanding another feature, multiplying two features, or comparing two features to create a Boolean flag.

    These transformations must be applied identically during training and prediction, because the model will be trained on the transformed features, not on the raw input values. If the data isn't transformed identically, then the model behaves poorly because it is presented with data that has a distribution of values that it wasn't trained with. For more information, see the discussion of training-serving skew in the Preprocessing challenges section.

  • Full-pass transformations during training, but instance-level transformations during prediction . In this scenario, transformations are stateful, because they use some precomputed statistics to perform the transformation. During training, you analyze the whole body of training data to compute quantities such as minimum, maximum, mean, and variance for transforming training data, evaluation data, and new data at prediction time.

    For example, to normalize a numeric feature for training, you compute its mean (μ) and its standard deviation (σ) across the whole of the training data. This computation is called a full-pass (or analyze ) operation. When you serve the model for prediction, the value of a new data point is normalized to avoid training-serving skew. Therefore, μ and σ values that are computed during training are used to adjust the feature value, which is the following simple instance-level operation:

    $$ value_{scaled} = (value_{raw} - \mu) \div \sigma $$

    Full-pass transformations include the following:

    • MinMax scaling numerical features using min and max computed from the training dataset.
    • Standard scaling (z-score normalization) numerical features using μ and σ computed on the training dataset.
    • Bucketizing numerical features using quantiles.
    • Imputing missing values using the median (numerical features) or the mode (categorical features).
    • Converting strings (nominal values) to integers (indexes) by extracting all the distinct values (vocabulary) of an input categorical feature.
    • Counting the occurrence of a term (feature value) in all the documents (instances) to calculate for TF-IDF.
    • Computing the PCA of the input features to project the data into a lower dimensional space (with linearly dependent features).

    You should use only the training data to compute statistics like μ, σ, min , and max . If you add the test and evaluation data for these operations, you are leaking information from the evaluation and test data to train the model. Doing so affects the reliability of the test and evaluation results. To ensure that you apply a consistent transformation to all datasets, you use the same statistics computed from the training data to transform the test and evaluation data.

  • Historical aggregations during training and prediction . This involves creating business aggregations, derivations, and flags as input signals to the prediction task—for example, creating recency, frequency, and monetary (RFM) metrics for customers to build propensity models. These types of features can be precomputed and stored in a feature store to be used during model training, batch scoring, and online prediction serving. You can also perform additional feature engineering (for example, transformation and tuning) to these aggregations before training and prediction.

  • Historical aggregations during training, but real-time aggregations during prediction . This approach involves creating a feature by summarizing real-time values over time. In this approach, the instances to be aggregated are defined through temporal window clauses. For example, you can use this approach if you want to train a model that estimates the taxi trip time based on the traffic metrics for the route in the last 5 minutes, in the last 10 minutes, in the last 30 minutes, and at other intervals. You can also use this approach to predict the failure of an engine part based on the moving average of temperature and vibration values computed over the last 3 minutes. Although these aggregations can be prepared offline for training, they are computed in real time from a data stream during serving.

    More precisely, when you prepare training data, if the aggregated value isn't in the raw data, the value is created during the data engineering phase. The raw data is usually stored in a database with a format of (entity, timestamp, value) . In the previous examples, entity is the route segment identifier for the taxi routes and the engine part identifier for the engine failure. You can use windowing operations to compute (entity, time_index, aggregated_value_over_time_window) and use the aggregation features as an input for your model training.

    When the model for real-time (online) prediction is served, the model expects features derived from the aggregated values as an input. Therefore, you can use a stream-processing technology like Apache Beam to compute the aggregations from the real-time data points streamed into your system. Stream-processing technology aggregates real-time data based on time windows as new data points arrive. You can also perform additional feature engineering (for example, transformation and tuning) to these aggregations before training and prediction.

ML pipeline on Google Cloud

This section discusses the core components of a typical end-to-end pipeline to train and serve TensorFlow ML models on Google Cloud using managed services. It also discusses where you can implement different categories of the data preprocessing operations, and common challenges that you might face when you implement such transformations. The How tf.Transform works section shows how the TensorFlow Transform library helps to address these challenges.

High-level architecture

The following diagram, figure 2, shows a high-level architecture of a typical ML pipeline for training and serving TensorFlow models. The labels A, B, and C in the diagram refer to the different places in the pipeline where data preprocessing can take place. Details about these steps are provided in the following section.

Architecture diagram showing stages for processing data.
Figure 2. High-level architecture for ML training and serving on Google Cloud.

The pipeline consists of the following steps:

  1. After raw data is imported, tabular data is stored in BigQuery, and other data like images, audio, and video, is stored in Cloud Storage. The second part of this series uses tabular data stored in BigQuery as an example.
  2. Data engineering (preparation) and feature engineering are executed at scale using Dataflow. This execution produces ML-ready training, evaluation, and test sets that are stored in Cloud Storage. Ideally, these datasets are stored as TFRecord files, which is the optimized format for TensorFlow computations.
  3. A TensorFlow model trainer package is submitted to Vertex AI Training, which uses the preprocessed data from the previous steps to train the model. The output of this step is a trained TensorFlow SavedModel that is exported to Cloud Storage.
  4. The trained TensorFlow model is deployed to Vertex AI Prediction as a service that has a REST API so that it can be used for online predictions. The same model can also be used for batch prediction jobs.
  5. After the model is deployed as a REST API, client apps and internal systems can invoke the API by sending requests with some data points, and receiving responses from the model with predictions.
  6. For orchestrating and automating this pipeline, you can use Vertex AI Pipelines as a scheduler to invoke the data preparation, model training, and model deployment steps.

You can also use Vertex AI Feature Store to store input features to make predictions. For example, you can periodically create engineered features from the latest raw data and store them in Vertex AI Feature Store. Client apps fetch the required input features from Vertex AI Feature Store and send them to the model to receive predictions.

Where to do preprocessing

In figure 2, the labels A, B, and C show that data preprocessing operations can take place in BigQuery, Dataflow, or TensorFlow. The following sections describe how each of these options work.

Option A: BigQuery

Typically, logic is implemented in BigQuery for the following operations:

  • Sampling: randomly selecting a subset from the data.
  • Filtering: removing irrelevant or invalid instances.
  • Partitioning: splitting the data to produce training, evaluation, and test sets.

BigQuery SQL scripts can be used as a source query for the Dataflow preprocessing pipeline, which is the data processing step in figure 2. For example, if a system is used in Canada, and the data warehouse has transactions from around the world, filtering to get Canada-only training data is best done in BigQuery. Feature engineering in BigQuery is simple and scalable, and supports implementing instance-level and historical aggregations feature transformations.

However, we recommend that you use BigQuery for feature engineering only if you use your model for batch prediction (scoring), or if the features are precomputed in BigQuery, but stored in Vertex AI Feature Store to be used during online prediction. If you plan to deploy the model for online predictions, and if you don't have the engineered feature in an online feature store, you have to replicate the SQL preprocessing operations to transform the raw data points that other systems generate. In other words, you need to implement the logic twice: one time in SQL to preprocess training data in BigQuery, and a second time in the logic of the app that consumes the model to preprocess online data points for prediction.

For example, if your client app is written in Java, you need to reimplement the logic in Java. This can introduce errors due to implementation discrepancies, as described in the training-serving skew section of Preprocessing challenges later in this document. It's also extra overhead to maintain two different implementations. Whenever you change the logic in SQL to preprocess the training data, you need to change the Java implementation accordingly to preprocess data at serving time.

If you are using your model only for batch prediction (for example, using Vertex AI batch prediction ), and if your data for scoring is sourced from BigQuery, you can implement these preprocessing operations as part of the BigQuery SQL script. In that case, you can use the same preprocessing SQL script to prepare both training and scoring data.

Full-pass stateful transformations aren't suitable for implementation in BigQuery. If you use BigQuery for full-pass transformations, you need auxiliary tables to store quantities needed by stateful transformations, such as means and variances to scale numerical features. Further, implementation of full-pass transformations using SQL on BigQuery creates increased complexity in the SQL scripts, and creates intricate dependency between training and the scoring SQL scripts.

Option B: Dataflow

As shown in figure 2, you can implement computationally expensive preprocessing operations in Apache Beam, and run them at scale using Dataflow. Dataflow is a fully managed autoscaling service for batch and stream data processing. When you use Dataflow, you can also use external specialized libraries for data processing, unlike BigQuery.

Dataflow can perform instance-level transformations, and historical and real-time aggregation feature transformations. In particular, if your ML models expect an input feature like total_number_of_clicks_last_90sec , Apache Beam windowing functions can compute these features based on aggregating the values of time windows of real-time (streaming) events data (for example, click events). In the earlier discussion of granularity of transformations , this was referred to as "Historical aggregations during training, but real-time aggregations during prediction."

The following diagram, figure 3, shows the role of Dataflow in processing stream data for near real-time predictions.

Architecture for using stream data for prediction.
Figure 3. High-level architecture using stream data for prediction in Dataflow.

As shown in figure 3, during processing, events called data points are ingested into Pub/Sub . Dataflow consumes these data points, computes features based on aggregates over time, and then calls the deployed ML model API for predictions. Predictions are then sent to an outbound Pub/Sub queue. From Pub/Sub, predictions can be consumed by downstream systems like monitoring or control, or they can be pushed back (for example, as notifications) to the original requesting client. Predictions can also be stored in a low-latency data store like Cloud Bigtable for real-time fetching. Cloud Bigtable can also be used to accumulate and store these real-time aggregations so they can be looked up when needed for prediction.

The same Apache Beam implementation can be used to batch-process training data that comes from an offline datastore like BigQuery and stream-process real-time data for serving online predictions.

In other typical architectures, such as the architecture shown in figure 2, the client app directly calls the deployed model API for online predictions. In that case, if preprocessing operations are implemented in Dataflow to prepare the training data, the operations aren't applied to the prediction data that goes directly to the model. Therefore, transformations like these should be integrated in the model during serving for online predictions.

Dataflow can be used to perform full-pass transformation, by computing the required statistics at scale. However, these statistics need to be stored somewhere to be used during prediction to transform prediction data points. By using the TensorFlow Transform ( tf.Transform ) library, you can directly embed these statistics in the model instead of storing them elsewhere. This approach is explained later in How tf.Transform works .

Option C: TensorFlow

As shown in figure 2, you can implement data preprocessing and transformation operations in the TensorFlow model itself. As shown in the figure, the preprocessing that you implement for training the TensorFlow model becomes an integral part of the model when the model is exported and deployed for predictions. Transformations in the TensorFlow model can be accomplished in one of the following ways:

  • Implementing all of the instance-level transformation logic in the input_fn function and in the serving_fn function. The input_fn function prepares a dataset using the tf.data.Dataset API for training a model. The serving_fn function receives and prepares the data for predictions.
  • Putting the transformation code directly in your TensorFlow model by using Keras preprocessing layers or creating custom layers .

The transformation logic code in the serving_fn function defines the serving interface of your SavedModel for online prediction. If you implement the same transformations that were used for preparing training data in the transformation logic code of the serving_fn function, it ensures that the same transformations are applied to new prediction data points when they're served.

However, because the TensorFlow model processes each data point independently or in a small batch, you can't calculate aggregations from all data points. As a result, full-pass transformations can't be implemented in your TensorFlow model.

Preprocessing challenges

The following are the primary challenges of implementing data preprocessing:

  • Training-serving skew . Training-serving skew refers to a difference between effectiveness (predictive performance) during training and during serving. This skew can be caused by a discrepancy between how you handle data in the training and the serving pipelines. For example, if your model is trained on a logarithmically transformed feature, but it's presented with the raw feature during serving, the prediction output might not be accurate.

    If the transformations become part of the model itself, it can be straightforward to handle instance-level transformations, as described earlier in Option C: TensorFlow . In that case, the model serving interface (the serving_fn function) expects raw data, while the model internally transforms this data before computing the output. The transformations are the same as those that were applied on the raw training and prediction data points.

  • Full-pass transformations . You can't implement full-pass transformations such as scaling and normalization transformations in your TensorFlow model. In full-pass transformations, some statistics (for example, max and min values to scale numeric features) must be computed on the training data beforehand, as described in Option B: Dataflow . The values then have to be stored somewhere to be used during model serving for prediction to transform the new raw data points as instance-level transformations, which avoids training-serving skew. You can use the TensorFlow Transform ( tf.Transform ) library to directly embed the statistics in your TensorFlow model. This approach is explained later in How tf.Transform works .

  • Preparing the data up front for better training efficiency . Implementing instance-level transformations as part of the model can degrade the efficiency of the training process. This degradation occurs because the same transformations are repeatedly applied to the same training data on each epoch. Imagine that you have raw training data with 1,000 features, and you apply a mix of instance-level transformations to generate 10,000 features. If you implement these transformations as part of your model, and if you then feed the model the raw training data, these 10,000 operations are applied N times on each instance, where N is the number of epochs. In addition, if you're using accelerators (GPUs or TPUs), they sit idle while the CPU performs those transformations, which isn't an efficient use of your costly accelerators.

    Ideally, the training data is transformed before training, using the technique described under Option B: Dataflow , where the 10,000 transformation operations are applied only once on each training instance. The transformed training data is then presented to the model. No further transformations are applied, and the accelerators are busy all of the time. In addition, using Dataflow helps you to preprocess large amounts of data at scale, using a fully managed service.

    Preparing the training data up front can improve training efficiency. However, implementing the transformation logic outside of the model (the approaches described in Option A: BigQuery or Option B: Dataflow ) doesn't resolve the issue of training-serving skew. Unless you store the engineered feature in the feature store to be used for both training and prediction, the transformation logic must be implemented somewhere to be applied on new data points coming for prediction, because the model interface expects transformed data. The TensorFlow Transform ( tf.Transform ) library can help you to address this issue, as described in the following section.

How tf.Transform works

The tf.Transform library is useful for transformations that require a full pass. The output of the tf.Transform library is exported as a TensorFlow graph that represents the instance-level transformation logic and the statistics computed from full-pass transformations, to be used for training and serving. Using the same graph for both training and serving can prevent skew, because the same transformations are applied in both stages. In addition, the tf.Transform library can run at scale in a batch processing pipeline on Dataflow to prepare the training data up front and improve training efficiency.

The following diagram, figure 4, shows how the tf.Transform library preprocesses and transforms data for training and prediction. The process is described in the following sections.

Diagram showing flow from raw data through tf.Transform to predictions.
Figure 4. Behavior of tf.Transform for preprocessing and transforming data.

Transform training and evaluation data

You preprocess the raw training data using the transformation implemented in the tf.Transform Apache Beam APIs, and run it at scale on Dataflow. The preprocessing occurs in the following phases:

  • Analyze phase: During the analyze phase, the required statistics (like means, variances, and quantiles) for stateful transformations are computed on the training data with full-pass operations. This phase produces a set of transformation artifacts, including the transform_fn graph. The transform_fn graph is a TensorFlow graph that has the transformation logic as instance-level operations. It includes the statistics computed in the analyze phase as constants.
  • Transform phase: During the transform phase, the transform_fn graph is applied to the raw training data, where the computed statistics are used to process the data records (for example, to scale numerical columns) in an instance-level fashion.

A two-phase approach like this addresses the preprocessing challenge of performing full-pass transformations.

When the evaluation data is preprocessed, only instance-level operations are applied, using the logic in the transform_fn graph and the statistics computed from the analyze phase in the training data. In other words, you don't analyze the evaluation data in a full-pass fashion to compute new statistics, such as μ and σ, to normalize numeric features in evaluation data. Instead, you use the computed statistics from the training data to transform the evaluation data in an instance-level fashion.

The transformed training and evaluation data are prepared at scale using Dataflow, before they are used to train the model. This batch data-preparation process addresses the preprocessing challenge of preparing the data up front to improve training efficiency. As shown in figure 4, the model internal interface expects transformed features.

Attach transformations to the exported model

As noted, the transform_fn graph that's produced by the tf.Transform pipeline is stored as an exported TensorFlow graph. The exported graph consists of the transformation logic as instance-level operations, and all of the statistics computed in the full-pass transformations as graph constants. When the trained model is exported for serving, the transform_fn graph is attached to the SavedModel as part of its serving_fn function.

While it's serving the model for prediction, the model serving interface expects data points in the raw format (that is, before any transformations). However, the model internal interface expects the data in the transformed format.

The transform_fn graph, which is now part of the model, applies all the preprocessing logic on the incoming data point. It uses the stored constants (like μ and σ to normalize the numeric features) in the instance-level operation during prediction. Therefore, the transform_fn graph converts the raw data point into the transformed format. The transformed format is what is expected by the model internal interface in order to produce prediction, as shown in figure 4.

This mechanism resolves the preprocessing challenge of the training-serving skew, because the same logic (implementation) that is used to transform the training and evaluation data is applied to transform the new data points during prediction serving.

Preprocessing options summary

The following table summarizes the data preprocessing options that this document discussed. In the table, "N/A" stands for "not applicable."

Data preprocessing option Instance-level
(stateless transformations)

Full-pass during training and instance-level during serving (stateful transformations)

Real-time (window) aggregations during training and serving (streaming transformations)

BigQuery (SQL)

Batch scoring: OK —the same transformation implementation is applied on data during training and batch scoring.

Online prediction: Not recommended —you can process training data, but it results in training-serving skew because you process serving data using different tools.

Batch scoring: Not recommended .

Online prediction: Not recommended .

Although you can use statistics computed using BigQuery for instance-level batch/online transformations, it isn't easy because you must maintain a stats store to be populated during training and used during prediction.

Batch scoring: N/A —aggregates like these are computed based on real-time events.

Online prediction: Not recommended —you can process training data, but it results in training-serving skew because you process serving data using different tools.

Dataflow (Apache Beam)

Batch scoring: OK —the same transformation implementation is applied on data during training and batch scoring.

Online prediction: OK —if data at serving time comes from Pub/Sub to be consumed by Dataflow. Otherwise, results in training-serving skew.

Batch scoring: Not recommended .

Online predictions: Not recommended .

Although you can use statistics computed using Dataflow for instance-level batch/online transformations, it isn't easy because you must maintain a stats store to be populated during training and used during prediction.

Batch scoring: N/A —aggregates like these are computed based on real-time events.

Online prediction: OK —the same Apache Beam transformation is applied on data during training (batch) and serving (stream).

Dataflow (Apache Beam + TFT)

Batch scoring: OK —the same transformation implementation is applied to data during training and batch scoring.

Online prediction: Recommended —it avoids training-serving skew and prepares training data up front.

Batch scoring: Recommended .

Online prediction: Recommended .

Both uses are recommended because transformation logic and computed statistics during training are stored as a TensorFlow graph that's attached to the exported model for serving.

Batch scoring: N/A —aggregates like these are computed based on real-time events.

Online prediction: OK —the same Apache Beam transformation is applied on data during training (batch) and serving (stream).

TensorFlow *
( input_fn & serving_fn )

Batch scoring: Not recommended .

Online prediction: Not recommended .

For training efficiency in both cases, it's better to prepare the training data up front.

Batch scoring: Not Possible .

Online prediction: Not Possible .

Batch scoring: N/A —aggregates like these are computed based on real-time events.

Online prediction: Not Possible .

* With TensorFlow, transformations like crossing, embedding, and one-hot encoding should be performed declaratively as feature_columns columns.

What's next