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 en savoir plus sur les coûts associés à BigQuery ML, consultez la page Tarifs de BigQuery ML.

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. 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

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. 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

  5. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  6. BigQuery est automatiquement activé dans les nouveaux projets. Pour activer BigQuery dans un projet préexistant, accédez à

    Activez l'API BigQuery

    Activer l'API

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

Vous allez créer un ensemble de données BigQuery pour stocker votre modèle de ML :

  1. Dans la console Google Cloud, accédez à la page "BigQuery".

    Accéder à la page "BigQuery"

  2. Dans le volet Explorateur, cliquez sur le nom de votre projet.

  3. Cliquez sur Afficher les actions > Créer un ensemble de données.

    Créer l'ensemble de données

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

    • Dans le champ ID de l'ensemble de données, saisissez bqml_tutorial.

    • Pour Type d'emplacement, sélectionnez Multirégional, puis sélectionnez US (plusieurs régions aux États-Unis).

      Les ensembles de données publics sont stockés dans l'emplacement multirégional US. Par souci de simplicité, stockez votre ensemble de données dans le même emplacement.

    • Conservez les autres paramètres par défaut, puis cliquez sur Créer un ensemble de données.

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

Étape 2 : Charger les données 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 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 la console Google Cloud, cliquez sur le bouton Saisir une nouvelle requête.

  2. Saisissez la requête GoogleSQL suivante dans la zone de texte Éditeur de requête.

    #standardSQL
    CREATE OR REPLACE TABLE
     bqml_tutorial.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 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_tutorial.analytics_session_data) apparaît dans le panneau de navigation. É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 GoogleSQL 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). Un indice est créé en recentrant les données et en appliquant une mise à l'échelle en fonction de la durée moyenne de session, puis en filtrant les enregistrements dont la durée de session est supérieure à 3,33 fois la moyenne (ces enregistrements sont considérés comme des anomalies).

#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`
WHERE 0.3 * (1 + (session_duration - 57937) / 57937) < 1

Détails de la requête

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 matricielle 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 la console Google Cloud, cliquez sur le bouton Saisir une nouvelle requête.

  2. Saisissez la requête GoogleSQL suivante 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 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. É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.

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

Pour afficher les résultats de l'entraînement du modèle, vous pouvez utiliser la fonction ML.TRAINING_INFO ou afficher les statistiques dans la console Google Cloud. Dans ce tutoriel, vous utilisez la console Google Cloud.

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 du panneau de navigation de la console Google Cloud, développez [PROJECT_ID] > bqml_tutorial, puis cliquez sur my_implicit_mf_model.

  2. Cliquez sur l'onglet 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 de la requête

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 la console Google Cloud, cliquez sur le bouton Saisir une nouvelle requête.

  2. Saisissez la requête GoogleSQL suivante 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 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 : Prédire les notes et émettre des recommandations

Vous allez 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 la console Google Cloud, cliquez sur le bouton Saisir une nouvelle requête.

  2. Saisissez la requête GoogleSQL suivante 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 Exécuter.

    Une fois la requête terminée, (bqml_tutorial.recommend_content) apparaît dans le panneau de navigation de la console Google Cloud. É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 GoogleSQL 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 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

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

  • 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 la page BigQuery dans Cloud Console.

    Accéder à 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 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 Supprimer.

Supprimer votre projet

Pour supprimer le projet :

  1. Dans la console Google Cloud, 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.

Étape suivante