Créer un système de recommandation d'e-commerce à l'aide de BigQuery ML

Découvrez comment créer un système de recommandation à l'aide de BigQuery ML pour générer des recommandations de produits ou de services à partir de données client dans BigQuery. Apprenez ensuite à rendre ces données disponibles pour d'autres systèmes de production en les exportant vers Google Analytics 360 ou Cloud Storage, ou en les lisant automatiquement à partir de la table BigQuery.

Cette approche est recommandée lorsque vous disposez de données qui se trouvent déjà dans BigQuery. BigQuery ML vous permet de créer un modèle de machine learning, de l'entraîner sur des données client dans BigQuery et de le déployer à l'aide de requêtes SQL standards. Cela vous évite d'exporter vos données vers un autre produit ou de créer un pipeline d'entraînement et de déploiement de modèle. En outre, BigQuery s'adapte automatiquement à toutes les ressources de calcul dont vous avez besoin.

Le modèle de machine learning que vous créez dans ce tutoriel utilise la factorisation matricielle, une méthode courante et efficace qui permet de créer un système de recommandation basé sur les données des préférences des utilisateurs. Pour en savoir plus sur cette approche, consultez la section Factorisation matricielle.

Ce tutoriel utilise l'exemple d'ensemble de données Google Analytics, qui est hébergé publiquement sur BigQuery. Cet ensemble de données offre 12 mois (août 2016 à août 2017) de données Analytics 360 masquées provenant du Google Merchandise Store, un magasin d'e-commerce qui vend des produits Google.

Objectifs

  • Traiter des exemples de données dans un format adapté à l'entraînement d'un modèle de factorisation matricielle
  • Créer, entraîner et déployer un modèle de factorisation matricielle
  • Obtenir des prédictions à partir du modèle déployé sur les produits les plus susceptibles d'intéresser vos clients
  • Exporter les données de prédiction depuis BigQuery vers un ou plusieurs autres produits afin de recommander des clients

Coûts

Ce tutoriel utilise les composants facturables suivants de Google Cloud :

  • BigQuery
  • BigQuery ML

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

  1. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  2. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

Une fois que vous avez terminé ce tutoriel, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Consultez la page Effectuer un nettoyage pour en savoir plus.

Traiter l'exemple de données

Lorsque vous utilisez la factorisation matricielle, vous évaluez les commentaires explicites ou implicites des utilisateurs afin de déterminer les préférences des clients. Pour pouvoir utiliser des commentaires explicites, l'ensemble de données doit contenir des données concernant les préférences des utilisateurs, comme les notes (de 1 à 5) qu'ils ont laissées sur un produit. Si aucun commentaire explicite n'est disponible, vous devez utiliser d'autres métriques de comportement pour déduire les préférences des clients, comme le temps total passé par un utilisateur sur la page d'informations d'un produit. Il s'agit de l'approche utilisée dans ce tutoriel.

Pour entraîner le modèle de factorisation matricielle, vous devez disposer d'une table comportant des colonnes qui identifient le client, l'élément évalué et la note implicite. Dans cette section, vous allez créer une table de ce type avec les colonnes userid, itemId et session_duration, où session_duration correspond à la durée de la session de l'utilisateur sur la page d'un produit donné.

Pour créer une table de ce type à l'aide des données de l'exemple d'ensemble de données Google Analytics, procédez comme suit :

  1. Ouvrez l'exemple d'ensemble de données Google Analytics dans Google Cloud Marketplace et cliquez sur Afficher l'ensemble de données. La console BigQuery s'ouvre avec l'exemple d'ensemble de données Google Analytics sélectionné.
  2. Dans la section Ressources, sélectionnez le projet dans lequel vous suivez ce tutoriel.
  3. Cliquez sur Créer un ensemble de données.

    Affiche l'emplacement du bouton "Create Dataset" (Créer un ensemble de données)

  4. Sur la page Create dataset (Créer un ensemble de données), procédez comme suit :

    • Dans le champ ID de l'ensemble de données, saisissez bqml.
    • Dans le champ Emplacement des données, choisissez l'emplacement le plus proche de vous.
    • Cliquez sur Créer un ensemble de données.
  5. Suivez cette étape si vous envisagez d'exporter les données vers Analytics 360. Dans le cas contraire, vous pouvez l'ignorer.

    Dans le volet de l'éditeur de requête, exécutez l'instruction SQL suivante pour copier un sous-ensemble de l'exemple de données Google Analytics dans une nouvelle table, puis remplissez le champ clientId, qui vous servira de clé pour regrouper les commentaires implicites des utilisateurs à l'étape suivante :

    CREATE OR REPLACE TABLE bqml.ga_clientid_sample AS (
      SELECT *
      FROM `bigquery-public-data.google_analytics_sample.ga_sessions_2017*`
      LIMIT 100000);
    
     UPDATE bqml.ga_clientid_sample
       SET clientId = fullvisitorId
       WHERE true;
    

    Vous devez utiliser clientId comme champ de clé lors de l'importation de données d'audience dans Analytics 360. Le champ clientId correspond généralement à une version hachée de fullVisitorId, mais il n'est pas renseigné dans l'exemple d'ensemble de données Google Analytics. Pour renseigner le champ clientId dans vos propres données Analytics 360, vous devez créer et renseigner une dimension personnalisée.

  6. Exécutez l'instruction SQL suivante pour créer une table contenant les données d'entraînement. Si vous envisagez d'exporter les données vers Analytics 360, exécutez la version qui utilise le champ clientId comme clé. Si vous prévoyez plutôt d'utiliser les données avec d'autres systèmes marketing, exécutez la version qui utilise le champ fullVisitorId comme clé.

    clientId

    CREATE OR REPLACE TABLE bqml.aggregate_web_stats AS (
      WITH
        durations AS (
          --calculate pageview durations
          SELECT
            CONCAT(clientId,'-',
                 CAST(visitNumber AS STRING),'-',
                 CAST(hitNumber AS STRING) ) AS visitorId_session_hit,
            LEAD(time, 1) OVER (
              PARTITION BY CONCAT(clientId,'-',CAST(visitNumber AS STRING))
              ORDER BY
              time ASC ) - time AS pageview_duration
          FROM
            `bqml.ga_clientid_sample`,
            UNNEST(hits) AS hit
        ),
        prodview_durations AS (
          --filter for product detail pages only
         SELECT
            CONCAT(clientId,'-',CAST(visitNumber AS STRING)) AS userId,
            productSKU AS itemId,
            IFNULL(dur.pageview_duration,
             1) AS pageview_duration,
          FROM
            `bqml.ga_clientid_sample` t,
            UNNEST(hits) AS hits,
            UNNEST(hits.product) AS hits_product
          JOIN
            durations dur
          ON
            CONCAT(clientId,'-',
                   CAST(visitNumber AS STRING),'-',
                   CAST(hitNumber AS STRING)) = dur.visitorId_session_hit
          WHERE
          eCommerceAction.action_type = "2"
        ),
        aggregate_web_stats AS(
          --sum pageview durations by userId, itemId
          SELECT
            userId,
            itemId,
            SUM(pageview_duration) AS session_duration
          FROM
            prodview_durations
          GROUP BY
            userId,
            itemId )
        SELECT
         *
       FROM
          aggregate_web_stats
    );
    

    fullVisitorId

    CREATE OR REPLACE TABLE bqml.aggregate_web_stats AS (
      WITH
        durations AS (
          --calculate pageview durations
          SELECT
            CONCAT(fullVisitorId,'-',
                 CAST(visitNumber AS STRING),'-',
                 CAST(hitNumber AS STRING) ) AS visitorId_session_hit,
            LEAD(time, 1) OVER (
              PARTITION BY CONCAT(fullVisitorId,'-',CAST(visitNumber AS STRING))
              ORDER BY
              time ASC ) - time AS pageview_duration
          FROM
            `bigquery-public-data.google_analytics_sample.ga_sessions_2017*`,
            UNNEST(hits) AS hit
        ),
        prodview_durations AS (
          --filter for product detail pages only
         SELECT
            CONCAT(fullVisitorId,'-',CAST(visitNumber AS STRING)) AS userId,
            productSKU AS itemId,
            IFNULL(dur.pageview_duration,
             1) AS pageview_duration,
          FROM
            `bigquery-public-data.google_analytics_sample.ga_sessions_2017*` t,
            UNNEST(hits) AS hits,
            UNNEST(hits.product) AS hits_product
          JOIN
            durations dur
          ON
            CONCAT(fullVisitorId,'-',
                   CAST(visitNumber AS STRING),'-',
                   CAST(hitNumber AS STRING)) = dur.visitorId_session_hit
          WHERE
          eCommerceAction.action_type = "2"
        ),
        aggregate_web_stats AS(
          --sum pageview durations by userId, itemId
          SELECT
            userId,
            itemId,
            SUM(pageview_duration) AS session_duration
          FROM
            prodview_durations
          GROUP BY
            userId,
            itemId )
        SELECT
         *
       FROM
          aggregate_web_stats
    );
    
  7. Exécutez l'instruction SQL suivante pour voir un exemple de données dans la table bqml.aggregate_web_stats obtenue :

    SELECT
     *
    FROM
      bqml.aggregate_web_stats
    LIMIT
      10;
    

    Un résultat semblable aux lignes suivantes doit s'afficher :

    Dix premières lignes de données d'entraînement traitées.

Acheter des emplacements Flex

Si vous utilisez la tarification à la demande pour BigQuery, vous devez acheter des emplacements Flex, puis créer des réservations et des attributions associées afin d'entraîner un modèle de factorisation matricielle. Vous pouvez ignorer cette section si vous utilisez la tarification forfaitaire avec BigQuery.

Vous devez disposer de l'autorisation bigquery.reservations.create pour pouvoir acheter des emplacements Flex. Cette autorisation est accordée au propriétaire du projet, ainsi qu'aux rôles Identity and Access Management bigquery.admin et bigquery.resourceAdmin prédéfinis.

  1. Dans la console BigQuery, cliquez sur Réservations.
  2. Si vous êtes redirigé vers la page API BigQuery Reservation pour activer l'API, cliquez sur Activer. Sinon, passez à l'étape suivante.
  3. Sur la page Réservations, cliquez sur Acheter des emplacements.
  4. Sur la page Acheter des emplacements, définissez les options comme suit :

    1. Dans le champ Durée d'engagement, sélectionnez Flex.
    2. Dans le champ Emplacement, choisissez l'emplacement que vous avez sélectionné lors de la création de l'ensemble de données au cours de la procédure Traiter l'exemple de données.
    3. Dans le champ Nombre d'emplacements, sélectionnez 500.
    4. Cliquez sur Suivant.
    5. Dans le champ Confirmation d'achat, saisissez CONFIRM.

  5. Cliquez sur Souscrire.

  6. Cliquez sur Afficher les engagements d'emplacements.

  7. Patientez jusqu'à 20 minutes pour que la capacité soit provisionnée. Une fois la capacité provisionnée, l'état de l'engagement d'emplacements devient vert et une coche s'affiche .

  8. Cliquez sur Créer une réservation.

  9. Sur la page Créer une réservation, définissez les options comme suit :

    1. Dans le champ Nom de la réservation, saisissez model.
    2. Dans le champ Emplacement, choisissez l'emplacement sélectionné lors de l'achat des emplacements Flex.
    3. Dans le champ Nombre d'emplacements, saisissez 500.
    4. Cliquez sur Enregistrer. Vous revenez à la page Réservations.
  10. Sélectionnez l'onglet Attributions.

  11. Dans le champ Sélectionner une organisation, un dossier ou un projet, cliquez sur Parcourir.

  12. Saisissez le nom du projet utilisé pour ce tutoriel.

  13. Cliquez sur Sélectionner.

  14. Dans Réservation, sélectionnez la réservation model que vous avez créée.

  15. Cliquez sur Créer.

  16. Cliquez sur BigQuery pour revenir à la console BigQuery.

Créer, entraîner et déployer le modèle

Exécutez l'instruction SQL CREATE MODEL pour créer, entraîner et déployer le modèle de factorisation matricielle :

      CREATE OR REPLACE MODEL bqml.retail_recommender
      OPTIONS(model_type='matrix_factorization',
            user_col='userId',
            item_col='itemId',
            rating_col='session_duration',
            feedback_type='implicit'
            )
      AS
      SELECT * FROM bqml.aggregate_web_stats;

Une fois l'entraînement terminé, le modèle entraîné est déployé en tant que bqml.retail_recommender.

Utiliser le modèle entraîné pour effectuer des prédictions

Obtenez des prédictions à partir du modèle bqml.retail_recommender déployé à l'aide de la fonction SQL ML.RECOMMEND.

  1. Pour afficher un exemple des données de recommandations, exécutez l'instruction SQL suivante pour obtenir des prédictions qui représentent les cinq recommandations principales pour un champ userId spécifié :

    DECLARE MY_USERID STRING DEFAULT "0824461277962362623-1";
    
    SELECT
      *
    FROM
      ML.RECOMMEND(MODEL `bqml.retail_recommender`,
      (SELECT MY_USERID as userID)
                  )
    ORDER BY predicted_session_duration_confidence DESC
    LIMIT 5;
    

    Un résultat semblable aux lignes suivantes doit s'afficher :

    Cinq recommandations principales pour un ID donné.

  2. Exécutez l'instruction SQL suivante pour obtenir les cinq prédictions principales pour tous les utilisateurs. Cette opération génère un grand nombre de lignes. Ainsi, ce résultat est écrit dans une table, puis les dix premiers enregistrements sont récupérés afin que vous puissiez voir un exemple de données.

    -- Create output table of top 5 predictions
    CREATE OR REPLACE TABLE bqml.prod_recommendations AS (
    WITH predictions AS (
        SELECT
          userId,
          ARRAY_AGG(STRUCT(itemId,
                           predicted_session_duration_confidence)
                    ORDER BY
                      predicted_session_duration_confidence DESC
                    LIMIT 5) as recommended
        FROM ML.RECOMMEND(MODEL bqml.retail_recommender)
        GROUP BY userId
    )
    
    SELECT
      userId,
      itemId,
      predicted_session_duration_confidence
    FROM
      predictions p,
      UNNEST(recommended)
    );
    
    -- Show table
    SELECT
     *
    FROM
      bqml.prod_recommendations
    ORDER BY
      userId
    LIMIT
      10;
    

    Un résultat semblable aux lignes suivantes doit s'afficher :

    Dix premières recommandations pour tous les utilisateurs.

Utiliser les recommandations prédites en production

Une fois que vous disposez des recommandations, la manière dont vous les mettez à disposition du pipeline de production dépend de votre cas d'utilisation. Les sections suivantes expliquent comment exporter des données de prédiction vers Analytics 360 ou Cloud Storage, ou comment lire de manière automatisée des données provenant de BigQuery dans un DataFrame pandas.

Exporter les recommandations vers Analytics 360

Si vous souhaitez exporter des données vers Analytics 360, nous vous recommandons de fournir une colonne pour chaque produit, évaluant la probabilité d'achat du client. Cette colonne doit ressembler à ce qui suit :

clientId likelihoodProductA likelihoodProductB
123 .6527238 .3464891
456 .8720673 .2750274
789 .5620734 .9127595

Pour créer une colonne de type "probabilité d'achat" par produit, créez une procédure pivot(), comme décrit dans la section Croiser des données facilement dans BigQuery, en une seule étape.

  1. Exécutez l'instruction SQL suivante pour créer la procédure pivot :

    CREATE OR REPLACE FUNCTION
    `bqml.normalize_col_name`(col_name STRING) AS (
      REGEXP_REPLACE(col_name,r'[/+#|]', '_'
    ));
    
    CREATE OR REPLACE PROCEDURE `bqml.pivot`(
      table_name STRING
      , destination_table STRING
      , row_ids ARRAY<STRING>
      , pivot_col_name STRING
     , pivot_col_value STRING
      , max_columns INT64
      , aggregation STRING
      , optional_limit STRING
      )
    
    BEGIN
    
      DECLARE pivotter STRING;
    
      EXECUTE IMMEDIATE (
       "SELECT STRING_AGG(' "||aggregation
        ||"""(IF('||@pivot_col_name||'="'||x.value||'", '||@pivot_col_value||', null)) e_'||bqml.normalize_col_name(x.value))
       FROM UNNEST((
           SELECT APPROX_TOP_COUNT("""||pivot_col_name||", @max_columns) FROM `"||table_name||"`)) x"
      ) INTO pivotter
      USING pivot_col_name AS pivot_col_name, pivot_col_value AS pivot_col_value, max_columns AS max_columns;
    
      EXECUTE IMMEDIATE (
       'CREATE OR REPLACE TABLE `'||destination_table
       ||'` AS SELECT '
       ||(SELECT STRING_AGG(x) FROM UNNEST(row_ids) x)
       ||', '||pivotter
       ||' FROM `'||table_name||'` GROUP BY '
       || (SELECT STRING_AGG(''||(i+1)) FROM UNNEST(row_ids) WITH OFFSET i)||' ORDER BY '
       || (SELECT STRING_AGG(''||(i+1)) FROM UNNEST(row_ids) WITH OFFSET i)
       ||' '||optional_limit
      );
    
    END;
    
  2. Exécutez l'instruction SQL suivante pour créer une table contenant la colonne clientId et une colonne de type "probabilité d'achat" pour chaque produit :

    CALL bqml.pivot(
      'bqml.prod_recommendations' # source table
      , 'bqml.prod_recommendations_export' # destination table
      , ['userId'] # row IDs
      , 'itemId' # pivot column name
      , 'predicted_session_duration_confidence' # pivot column value
      , 30 # max number of columns
      , 'AVG' # aggregation
      , '' # optional_limit
    );
    
  3. Exécutez l'instruction SQL suivante pour voir un exemple de données dans la table bqml.prod_recommendations_export obtenue :

    SELECT
      *
    FROM
      bqml.prod_recommendations_export
    ORDER BY
      userId
    LIMIT
      10;
    

    Un résultat semblable aux lignes suivantes doit s'afficher :

    Dix premières recommandations pour tous les utilisateurs.

Une fois que vous disposez des données au format approprié, enregistrez-les au format CSV, puis importez-les dans Analytics 360 à l'aide de l'importation de données. Notez que les noms de colonnes de vos données de recommandations exportées doivent être mappés avec le schéma d'importation de données Analytics 360. Par exemple, si le schéma d'importation de données est ga:clientId, ga:dimension1, ga:dimension2, les noms de colonnes de vos données doivent être ga:clientId, ga:dimension1, ga:dimension2. BigQuery n'autorise pas l'utilisation des signes deux-points dans les noms de colonnes. Vous devez donc mettre à jour les noms de colonnes dans le fichier CSV exporté avant de procéder à l'importation.

Si vous le souhaitez, vous pouvez utiliser la mise en œuvre de référence MoDeM (Model Deployment for Marketing) pour les modèles BigQuery ML afin de simplifier le chargement de vos données vers Analytics 360. Utilisez les instructions interactives du notebook sur le modèle de déploiement BQML pour commencer.

Exporter les recommandations vers Cloud Storage

Exportez les données de recommandations de la table BigQuery vers Cloud Storage en suivant les instructions de la section Exporter des données de table.

Afficher les recommandations de manière automatisée

Lisez les données de recommandations depuis la table BigQuery vers un DataFrame pandas à l'aide de l'API BigQuery Storage, en suivant les instructions de la section Télécharger des données de table à l'aide de la bibliothèque cliente BigQuery. Vous pouvez également programmer votre propre solution à l'aide de l'une des bibliothèques clientes BigQuery.

Résumé

Vous avez terminé le tutoriel. Désormais, vous savez comment entraîner votre système de recommandation à l'aide de BigQuery ML, déployer votre modèle et utiliser les résultats en production.

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, vous pouvez soit supprimer le projet contenant les ressources, soit le conserver, mais supprimer uniquement ces ressources.

Dans les deux cas, vous devez supprimer ces ressources afin d'éviter qu'elles ne vous soient facturées par la suite. Dans les sections suivantes, nous allons voir comment supprimer ces ressources.

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

  1. Dans Cloud Console, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer les composants

Si vous ne souhaitez pas supprimer le projet, reportez-vous aux sections suivantes pour supprimer les composants facturables de ce tutoriel.

Supprimer l'ensemble de données BigQuery

  1. Ouvrez la console BigQuery
  2. Dans la section Ressources, développez le projet dans lequel vous avez terminé ce tutoriel, puis sélectionnez l'ensemble de données bqml.
  3. Cliquez sur Supprimer l'ensemble de données dans l'en-tête du volet de l'ensemble de données.
  4. Dans la fenêtre qui apparaît en superposition, saisissez bqml, puis cliquez sur Supprimer.

Supprimer les emplacements Flex

Si vous avez créé des emplacements Flex, procédez comme suit pour les supprimer :

  1. Dans la console BigQuery, cliquez sur Réservations.
  2. Sélectionnez l'onglet Attributions.
  3. Recherchez la ligne de l'attribution que vous avez créée pour la réservation du modèle. Cliquez sur Plus () dans la colonne Actions, puis sur Supprimer.
  4. Sélectionnez l'onglet Réservations.
  5. Identifiez la ligne de la réservation du modèle. Cliquez sur Plus () dans la colonne Actions, puis sur Supprimer.
  6. Sélectionnez l'onglet Engagements d'emplacements.
  7. Identifiez la ligne contenant les 500 emplacements Flex que vous avez achetés. Cliquez sur Plus () dans la colonne Actions, puis sur Supprimer.
  8. Dans le champ Confirmer la suppression de l'engagement d'emplacements, saisissez REMOVE.
  9. Cliquez sur Continuer.

Étape suivante