Utiliser BigQuery ML pour formuler des recommandations basées sur des données Google Analytics

Ce tutoriel présente aux analystes de données le modèle de factorisation matricielle dans BigQuery ML. BigQuery ML permet aux utilisateurs de créer et d'exécuter des modèles de machine learning dans BigQuery à l'aide de requêtes SQL. L'objectif est de démocratiser le machine learning en permettant aux utilisateurs SQL de créer des modèles à l'aide de leurs propres outils et d'accélérer le rythme de développement en leur évitant d'avoir à transférer des données.

Dans ce tutoriel, vous apprendrez à créer un modèle de factorisation matricielle à partir de commentaires implicites et à l'aide de l'exemple de table GA360_test.ga_sessions_sample. Vous pourrez ainsi formuler des recommandations à partir d'un ID de visiteur et d'un ID de contenu.

La table ga_sessions_sample contient des informations concernant une tranche de données de session collectées par Google Analytics 360 et envoyées à BigQuery.

Objectifs

Dans ce tutoriel, vous allez utiliser :

  • BigQuery ML, pour créer un modèle de recommandations implicite à l'aide de l'instruction CREATE MODEL ;
  • la fonction ML.EVALUATE, pour évaluer les modèles de ML ;
  • la fonction ML.WEIGHTS, pour inspecter les pondérations des facteurs latents générées lors de l'entraînement ;
  • la fonction ML.RECOMMEND, pour produire des recommandations pour un utilisateur.

Coûts

Ce tutoriel utilise des composants facturables de Google Cloud, dont :

  • BigQuery
  • BigQuery ML

Pour plus d'informations sur les coûts de BigQuery, consultez la page Tarifs de BigQuery.

Pour plus d'informations sur le coût de BigQuery ML, consultez la page Tarifs de BigQuery ML.

Avant de commencer

  1. Connectez-vous à votre compte Google.

    Si vous n'en possédez pas déjà un, vous devez en créer un.

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

    Accéder à la page de sélection du projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  4. BigQuery est automatiquement activé dans les nouveaux projets. Pour activer BigQuery dans un projet préexistant, accédez à Activer l'APIBigQuery

    Activer l'API

Étape 1 : Créer un ensemble de données

La première étape consiste à créer un ensemble de données BigQuery afin de stocker votre modèle de ML. Procédez comme suit :

  1. Dans Cloud Console, accédez à l'interface utilisateur Web de BigQuery.

    Accéder à l'UI Web de BigQuery

  2. Dans la section Ressources, cliquez sur le nom de votre projet.

  3. Dans le panneau des détails, cliquez sur Create dataset (Créer un ensemble de données).

    Créer l'ensemble de données

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

    • Dans le champ Dataset ID (ID de l'ensemble de données), saisissez bqml_tutorial.
    • Dans le champ Emplacement des données, sélectionnez États-Unis (US). Les ensembles de données publics sont actuellement stockés dans l'emplacement multirégional US. Par souci de simplicité, vous devez placer votre ensemble de données dans le même emplacement.

      Créer une page d'ensemble de données

  5. Ne modifiez aucun autre paramètre par défaut et cliquez sur Créer un ensemble de données.

Étape 2 : Charger les données Google Analytics 360 dans BigQuery

La plupart du temps, les notes présentes dans vos données ne reflètent pas une valeur explicitement définie par l'utilisateur. Dans de tels scénarios, nous pouvons concevoir un proxy pour ces valeurs en tant que note implicite, et utiliser un algorithme différent pour calculer les recommandations. Dans cet exemple, nous allons utiliser un exemple d'ensemble de données Google Analytics 360. Cet exemple est basé sur l'article suivant.

La requête ci-dessous crée un ensemble de données issu de cloud-training-demos.GA360_test.ga_sessions_sample. Cet ensemble comporte des notes implicites basées sur la durée de session d'un visiteur sur une page. L'objectif de cette requête est de créer un ensemble de données avec trois colonnes que nous pouvons mapper à une colonne "user" (utilisateur), une colonne "item" (élément) et une colonne "rating" (note).

  1. Dans l'interface utilisateur Web de BigQuery, cliquez sur le bouton Saisir une nouvelle requête.

  2. Saisissez la requête suivante en SQL standard dans la zone de texte Éditeur de requête.

    #standardSQL
    CREATE OR REPLACE TABLE
     bqml_training.analytics_session_data AS
    WITH
     visitor_page_content AS (
     SELECT
       fullVisitorID,
       (
       SELECT
         MAX(
         IF
           (index=10,
             value,
             NULL))
       FROM
         UNNEST(hits.customDimensions)) AS latestContentId,
       (LEAD(hits.time, 1)
         OVER (PARTITION BY fullVisitorId ORDER BY hits.time ASC) - hits.time)
                 AS session_duration
     FROM
       `cloud-training-demos.GA360_test.ga_sessions_sample`,
       UNNEST(hits) AS hits
     WHERE
       # only include hits on pages
       hits.type = "PAGE"
     GROUP BY
       fullVisitorId,
       latestContentId,
       hits.time )
     # aggregate web stats
    SELECT
     fullVisitorID AS visitorId,
     latestContentId AS contentId,
     SUM(session_duration) AS session_duration
    FROM
     visitor_page_content
    WHERE
     latestContentId IS NOT NULL
    GROUP BY
     fullVisitorID,
     latestContentId
    HAVING
     session_duration > 0
    ORDER BY
     latestContentId
    
  3. (Facultatif) Pour définir l'emplacement de traitement, cliquez sur More > Query settings (Plus > Paramètres de requête). Pour Processing location (Emplacement de traitement), choisissez US. Cette étape est facultative, car l'emplacement de traitement est automatiquement détecté selon l'emplacement de l'ensemble de données.

    Paramètres de requête

  4. Cliquez sur Run (Exécuter).

    Une fois la requête terminée, (bqml_training.analytics_session_data) apparaît dans le panneau de navigation de l'interface utilisateur Web de BigQuery. Étant donné que la requête utilise une instruction CREATE TABLE pour créer une table, les résultats de la requête ne sont pas affichés.

  5. Dans la table générée, vous devriez y voir un résultat semblable à celui-ci :

    Résultats de la requête.

    Notez que ce résultat est spécifique à la manière dont les données ont été exportées vers BigQuery. La requête d'extraction de vos propres données peut être différente.

Étape 3 : Créer votre modèle de recommandations implicite

Vous allez ensuite créer un modèle de recommandations implicite à l'aide de la table Google Analytics chargée à l'étape précédente. La requête SQL standard suivante permet de créer le modèle qui permettra de prédire un indice de confiance pour chaque paire ID de visiteur/ID de contenu (visitorId/contentId).

#standardSQL
CREATE OR REPLACE MODEL bqml_tutorial.my_implicit_mf_model
OPTIONS
  (model_type='matrix_factorization',
   feedback_type='implicit',
   user_col='visitorId',
   item_col='contentId',
   rating_col='rating',
   l2_reg=30,
   num_factors=15) AS
SELECT
  visitorId,
  contentId,
  0.3 * (1 + (session_duration - 57937) / 57937) AS rating
FROM bqml_tutorial.analytics_session_data

Détails des requêtes

La clause CREATE MODEL permet de créer et d'entraîner le modèle nommé bqml_tutorial.my_implicit_mf_model.

La clause OPTIONS(model_type='matrix_factorization', feedback_type='IMPLICIT', user_col='visitorId', ...) indique que vous créez un modèle de factorisation matricielle. Comme feedback_type='IMPLICIT' est spécifié, un modèle de factorisation matricielle implicite sera entraîné. Vous trouverez un exemple de création d'un modèle de factorisation explicite dans la section Créer un modèle de factorisation matricielle explicite.

L'instruction SELECT de cette requête utilise les colonnes suivantes pour générer des recommandations.

  • visitorId : ID de visiteur (INT64)
  • contentId : ID de contenu (INT64)
  • rating : note implicite comprise entre 0 et 1, calculée pour les ID de visiteur (visitorId) et leurs ID de contenu (contentId) respectifs, centrée et mise à l'échelle (FLOAT64)

La clause FROM (bqml_tutorial.analytics_session_data) indique que vous interrogez la table analytics_session_data de l'ensemble de données bqml_tutorial. Cet ensemble de données se trouve dans votre projet BigQuery si les instructions des étapes 2 et 8 ont été suivies.

Exécuter la requête CREATE MODEL

Pour exécuter la requête CREATE MODEL qui permet de créer et d'entraîner votre modèle, procédez comme suit :

  1. Dans l'interface utilisateur Web de BigQuery, cliquez sur le bouton Saisir une nouvelle requête.

  2. Saisissez la requête suivante en SQL standard dans la zone de texte Éditeur de requête.

    #standardSQL
    CREATE OR REPLACE MODEL bqml_tutorial.my_implicit_mf_model
    OPTIONS
     (model_type='matrix_factorization',
      feedback_type='implicit',
      user_col='visitorId',
      item_col='contentId',
      rating_col='rating',
      l2_reg=30,
      num_factors=15) AS
    SELECT
     visitorId,
     contentId,
     0.3 * (1 + (session_duration - 57937) / 57937) AS rating
    FROM bqml_tutorial.analytics_session_data
    
  3. Cliquez sur Run (Exécuter).

    La requête prend environ 12 minutes, après quoi votre modèle (my_implicit_mf_model) apparaît dans le panneau de navigation de l'interface utilisateur Web de BigQuery. Étant donné que la requête utilise une instruction CREATE MODEL pour créer un modèle, les résultats de la requête ne sont pas affichés.

(Facultatif) Étape 4 : Obtenir des statistiques d'entraînement

Pour afficher les résultats de l'entraînement du modèle, vous pouvez vous servir de la fonction ML.TRAINING_INFO. Vous avez également la possibilité d'afficher les statistiques dans l'interface utilisateur Web de BigQuery. Dans ce tutoriel, vous utilisez l'interface utilisateur Web de BigQuery.

Pour créer un modèle, un algorithme de machine learning examine de nombreux exemples et essaie de trouver un modèle qui minimise la perte. Ce processus est appelé minimisation du risque empirique.

Pour afficher les statistiques d'entraînement du modèle qui ont été générées lors de l'exécution de la requête CREATE MODEL, procédez comme suit :

  1. Dans la section Ressources de l'interface utilisateur Web de BigQuery, développez [PROJECT_ID] > bqml_tutorial, puis cliquez sur my_implicit_mf_model.

  2. Cliquez sur l'onglet Training (Entraînement), puis sur Table. Les résultats doivent se présenter sous la forme suivante :

    Résultat ML.TRAINING_INFO

    La colonne Training Data Loss (Perte de données d'entraînement) représente la métrique de perte calculée après entraînement du modèle dans l'ensemble de données d'entraînement. Étant donné que vous avez effectué une factorisation matricielle, cette colonne correspond à l'erreur quadratique moyenne. Par défaut, les modèles de factorisation matricielle ne répartissent pas les données. Par conséquent, la colonne Perte des données d'évaluation n'est présente que si un ensemble de données exclues est spécifié, car la répartition des données risque d'entraîner la perte de toutes les notes d'un utilisateur ou d'un élément. Le modèle ne disposera donc pas d'informations sur les facteurs de latence concernant les utilisateurs ou éléments manquants.

    Pour en savoir plus sur la fonction ML.TRAINING_INFO, consultez la documentation de référence sur la syntaxe BigQuery ML.

Étape 5 : Évaluer votre modèle

Après avoir créé votre modèle, vous allez évaluer les performances de l'outil de recommandation à l'aide de la fonction ML.EVALUATE. La fonction ML.EVALUATE compare les prédictions aux notes réelles.

La requête permettant d'évaluer le modèle est la suivante :

#standardSQL
SELECT
  *
FROM
  ML.EVALUATE(MODEL `bqml_tutorial.my_implicit_mf_model`)

Détails des requêtes

La toute première instruction SELECT récupère les colonnes de votre modèle.

La clause FROM utilise la fonction ML.EVALUATE basée sur votre modèle : bqml_tutorial.my_implicit_mf_model.

Exécuter la requête ML.EVALUATE

Pour exécuter la requête ML.EVALUATE permettant d'évaluer le modèle, procédez comme suit :

  1. Dans l'interface utilisateur Web de BigQuery, cliquez sur le bouton Saisir une nouvelle requête.

  2. Saisissez la requête suivante en SQL standard dans la zone de texte Éditeur de requête.

    #standardSQL
    SELECT
     *
    FROM
     ML.EVALUATE(MODEL bqml_tutorial.my_implicit_mf_model)
    
  3. (Facultatif) Pour définir l'emplacement de traitement, cliquez sur More > Query settings (Plus > Paramètres de requête). Pour Processing location (Emplacement de traitement), choisissez US. Cette étape est facultative, car l'emplacement de traitement est automatiquement détecté selon l'emplacement de l'ensemble de données.

    Paramètres de requête

  4. Cliquez sur Run (Exécuter).

  5. Lorsque la requête est terminée, cliquez sur l'onglet Results (Résultats) sous la zone de texte de la requête. Les résultats doivent se présenter sous la forme suivante :

    Résultat de ML.EVALUATE.

    Étant donné que vous avez effectué une factorisation matricielle implicite, les résultats incluent les colonnes suivantes :

    • mean_average_precision
    • mean_squared_error
    • normalized_discounted_cumulative_gain
    • average_rank

    mean_average_precision, normalized_discounted_cumulative_gain et average_rank sont des statistiques de classement détaillées sur la page suivante : Métriques de factorisation matricielle implicite

Étape 6 : Utiliser votre modèle pour prédire les notes et émettre des recommandations

Rechercher tous les indices de confiance des notes d'ID de contenu (contentId) pour un ensemble d'ID de visiteur (visitorIds)

La fonction ML.RECOMMEND n'a pas besoin d'accepter d'arguments supplémentaires en plus du modèle, mais elle peut intégrer une table facultative. Si la table d'entrée ne comporte qu'une seule colonne qui correspond au nom de la colonne utilisateur (user) d'entrée ou de la colonne élément (item) d'entrée, toutes les prédictions de notes d'éléments pour chaque utilisateur (user) seront générées, et inversement. Notez que si tous les utilisateurs (users) ou tous les éléments (items) se trouvent dans la table d'entrée, les résultats affichés seront les mêmes que si aucun argument facultatif n'avait été transmis à ML.RECOMMEND.

Voici un exemple de requête qui récupère tous les indices de confiance de notes pour cinq visiteurs.

#standardSQL
SELECT
  *
FROM
  ML.RECOMMEND(MODEL bqml_tutorial.my_implicit_mf_model,
    (
    SELECT
      visitorId
    FROM
      bqml_tutorial.analytics_session_data
    LIMIT 5))

Détails des requêtes

La toute première instruction SELECT récupère les colonnes visitorId, contentId et predicted_rating_confidence. Cette dernière colonne est générée par la fonction ML.RECOMMEND. Lorsque vous utilisez la fonction ML.RECOMMEND, le nom de la colonne de résultats pour les modèles de factorisation matricielle implicites est predicted_rating-column-name_confidence. Pour les modèles de factorisation matricielle implicites, predicted_rating_confidence correspond à l'indice de confiance estimé pour la paire utilisateur-élément (user/item). Ce niveau de confiance se situe approximativement entre 0 et 1. Plus l'indice de confiance est élevé, plus l'utilisateur (user) apprécie l'élément (item). Plus l'indice de confiance est bas, moins il apprécie l'élément (item).

La fonction ML.RECOMMEND permet de prédire les notes à l'aide de votre modèle : bqml_tutorial.my_implicit_mf_model.

L'instruction SELECT imbriquée de cette requête sélectionne uniquement la colonne visitorId de la table d'origine utilisée pour l'entraînement.

La clause LIMIT (LIMIT 5) filtre cinq ID utilisateur (visitorId) à envoyer à ML.RECOMMEND.

Rechercher les notes de toutes les paires ID de visiteur/ID de contenu

Maintenant que vous avez évalué votre modèle, l'étape suivante consiste à l'utiliser pour obtenir un indice de confiance pour les notes. Vous utilisez votre modèle pour prédire les indices de confiance de chaque combinaison utilisateur-élément de la requête suivante :

#standardSQL
SELECT
  *
FROM
  ML.RECOMMEND(MODEL bqml_tutorial.my_implicit_mf_model)

Détails des requêtes

La toute première instruction SELECT récupère les colonnes visitorId, contentId et predicted_rating_confidence. Cette dernière colonne est générée par la fonction ML.RECOMMEND. Lorsque vous utilisez la fonction ML.RECOMMEND, le nom de la colonne de résultats pour les modèles de factorisation matricielle implicites est predicted_rating-column-name_confidence. Pour les modèles de factorisation matricielle implicites, predicted_rating_confidence correspond à l'indice de confiance estimé pour la paire utilisateur/élément (user/item). Ce niveau de confiance se situe approximativement entre 0 et 1. Plus l'indice de confiance est élevé, plus l'utilisateur (user) apprécie l'élément (item). Plus l'indice de confiance est bas, moins il apprécie l'élément (item).

La fonction ML.RECOMMEND permet de prédire les notes à l'aide de votre modèle : bqml_tutorial.my_implicit_mf_model.

Pour enregistrer le résultat dans la table, vous pouvez procéder comme ci-dessous :

#standardSQL
CREATE OR REPLACE TABLE bqml_tutorial.recommend_content
OPTIONS() AS
SELECT
  *
FROM
  ML.RECOMMEND(MODEL bqml_tutorial.my_implicit_mf_model)

Si ML.RECOMMEND affiche l'erreur Query Exceeded Resource Limits (la requête a excédé les limites de ressources), réessayez avec un niveau de facturation plus élevé. Dans l'outil de ligne de commande BigQuery, vous pouvez définir ce paramètre à l'aide de --maximum_billing_tier.

Générer des recommandations

Dans la requête suivante, ML.RECOMMEND permet de générer les cinq ID de contenu (contentId) recommandées par ID de visiteur (visitorId).

#standardSQL
SELECT
  visitorId,
  ARRAY_AGG(STRUCT(contentId, predicted_rating_confidence)
    ORDER BY predicted_rating_confidence DESC LIMIT 5) AS rec
FROM
  bqml_tutorial.recommend_content
GROUP BY
  visitorId

Détails des requêtes

L'instruction SELECT regroupe les résultats de la requête ML.RECOMMEND imbriquée. Pour cela, elle utilise GROUP BY visitorId pour agréger les données contentId et predicted_rating_confidence par ordre décroissant, et elle ne conserve que les cinq premiers ID de contenu.

À l'aide de la requête de recommandations précédente, nous pouvons trier les données selon la note prédite et générer pour chaque utilisateur les éléments ayant la plus haute note prédite. La requête suivante associe les ID d'élément (item_ids) aux ID de film (movie_ids) présents dans la table movielens.movie_titles importée précédemment, et génère les cinq recommandations de films les mieux notés par utilisateur.

Exécuter la requête ML.RECOMMEND

Pour exécuter la requête ML.RECOMMEND qui génère les cinq recommandations les mieux notées d'ID de contenu par ID de visiteur, procédez comme suit :

  1. Dans l'interface utilisateur Web de BigQuery, cliquez sur le bouton Saisir une nouvelle requête.

  2. Saisissez la requête suivante en SQL standard dans la zone de texte Éditeur de requête.

    #standardSQL
    CREATE OR REPLACE TABLE bqml_tutorial.recommend_content
    OPTIONS() AS
    SELECT
     *
    FROM
     ML.RECOMMEND(MODEL bqml_tutorial.my_implicit_mf_model)
    
  3. Cliquez sur Run (Exécuter).

    Une fois la requête terminée, (bqml_training.recommend_content) apparaît dans le panneau de navigation de l'UI Web de BigQuery. Étant donné que la requête utilise une instruction CREATE TABLE pour créer une table, les résultats de la requête ne sont pas affichés.

  4. Rédigez une autre requête. Saisissez la requête SQL standard suivante dans la zone de texte Éditeur de requête, une fois la requête précédente terminée.

    #standardSQL
    SELECT
     visitorId,
     ARRAY_AGG(STRUCT(contentId, predicted_rating_confidence)
       ORDER BY predicted_rating_confidence DESC LIMIT 5) AS rec
    FROM
     `bqml_tutorial.recommend_content`
    GROUP BY
     visitorId
    
  5. (Facultatif) Pour définir l'emplacement de traitement, cliquez sur More > Query settings (Plus > Paramètres de requête). Pour Processing location (Emplacement de traitement), choisissez US. Cette étape est facultative, car l'emplacement de traitement est automatiquement détecté selon l'emplacement de l'ensemble de données.

    Paramètres de requête

  6. Cliquez sur Run (Exécuter).

  7. Lorsque la requête est terminée, cliquez sur l'onglet Results (Résultats) sous la zone de texte de la requête. Les résultats doivent se présenter sous la forme suivante :

    Résultat de la fonction ML.RECOMMEND.

Nettoyer

Afin d'éviter que des frais ne soient facturés sur votre compte Google Cloud Platform pour les ressources utilisées dans ce tutoriel, procédez comme suit :

  • Supprimez le projet que vous avez créé.
  • Ou conservez le projet et supprimez l'ensemble de données.

Supprimer l'ensemble de données

La suppression de votre projet entraîne celle de tous les ensembles de données et de toutes les tables qui lui sont associés. Si vous préférez réutiliser le projet, vous pouvez supprimer l'ensemble de données que vous avez créé dans ce tutoriel :

  1. Si nécessaire, ouvrez l'UI Web de BigQuery.

    Accéder à l'UI Web de BigQuery

  2. Dans le panneau de navigation, cliquez sur l'ensemble de données bqml_tutorial que vous avez créé.

  3. Cliquez sur Delete dataset (Supprimer l'ensemble de données) dans la partie droite de la fenêtre. Cette action supprime l'ensemble de données, la table et toutes les données.

  4. Dans la boîte de dialogue Delete dataset (Supprimer l'ensemble de données), confirmez la commande de suppression en saisissant le nom de votre ensemble de données (bqml_tutorial), puis cliquez sur Delete (Supprimer).

Supprimer le projet

Pour supprimer le projet :

  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.

Étapes suivantes