Prédiction de classement d'un film avec BQML à l'aide de SQL

1. Introduction

Dans cet atelier de programmation, nous allons créer un modèle de prédiction de la note d'un film avec un modèle personnalisé BigQuery ML à l'aide de SQL uniquement, puis le déployer dans Vertex AI. Vous allez découvrir comment :

  1. Créer un ensemble de données BigQuery à l'aide de Cloud Shell et charger des données à partir d'un fichier
  2. Utiliser BigQuery ML pour l'apprentissage supervisé afin de créer un modèle de prédiction de régression multiclasse pour la note des films sans avoir à coder beaucoup, mais uniquement à l'aide de requêtes SQL

Objectifs de l'atelier

Vous allez créer un

  • un ensemble de données BigQuery qui contiendra les composants de table et de modèle ;
  • Modèle BigQuery ML pour prédire la note d'un film à l'aide de requêtes SQL
  • Déployer le modèle dans Vertex AI Model Registry

Conditions requises

  • Un navigateur tel que Chrome ou Firefox
  • Un projet Google Cloud avec facturation activée

2. Créer un projet

  1. Dans la console Google Cloud, sur la page du sélecteur de projet, sélectionnez ou créez un projet Google Cloud.
  2. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.
  3. Accédez à BigQuery pour activer l'API. Vous pouvez également ouvrir l'UI Web de BigQuery directement en saisissant l'URL suivante dans votre navigateur: https://console.cloud.google.com/bigquery.

3. Activer Cloud Shell

  1. Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud et fourni avec bq: dans la console Cloud, cliquez sur "Activer Cloud Shell" en haut à droite: 6757b2fb50ddcc2d.png
  2. Une fois connecté à Cloud Shell, vous êtes en principe authentifié, et le projet est déjà défini avec votre ID de projet. Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list
  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud reconnaît votre projet
gcloud config list project
  1. Si votre projet n'est pas défini, utilisez la commande suivante pour le définir :
gcloud config set project <PROJECT_ID>

Consultez la documentation pour connaître les commandes gcloud ainsi que leur utilisation.

4. Préparer des données d'entraînement

Il s'agit d'une étape importante dans tous les projets, produits et applications liés aux données. Elle nécessite une grande expertise du domaine en plus de la technologie pour préparer un ensemble de données optimal et le rendre prêt pour votre projet de ML. Pour cet atelier de programmation, nous allons utiliser le fichier de données déjà préparé.

5. Créer et charger l'ensemble de données

Un ensemble de données BigQuery est une collection de tables. Toutes les tables d'un ensemble de données sont stockées au même emplacement de données. Vous pouvez également associer des contrôles d'accès personnalisés pour limiter l'accès à un ensemble de données et à ses tables.

  1. Dans Cloud Shell, utilisez la commande bq mk pour créer un ensemble de données nommé "movies".
bq mk --location=<<LOCATION>> movies

Définissez l'emplacement sur une région (asia-south1).

  1. Assurez-vous d'avoir le fichier de données (.csv) prêt. Exécutez les commandes suivantes dans Cloud Shell pour cloner le dépôt et accéder au projet:
git clone <<repository link>>

cd movie-score
  1. Utilisez la commande bq load pour charger votre fichier CSV dans une table BigQuery (notez que vous pouvez également l'importer directement depuis l'interface utilisateur de BigQuery):
bq load --source_format=CSV --skip_leading_rows=1 movies.movies_score \
./movies_bq_src.csv \ Id:numeric,name:string,rating:string,genre:string,year:numeric,released:string,score:string,director:string,writer:string,star:string,country:string,budget:numeric,company:string,runtime:numeric,data_cat:string

Description des options : –source_format=CSV : utilise le format de données CSV lors de l'analyse du fichier de données. –skip_leading_rows=1 : ignore la première ligne du fichier CSV, car il s'agit d'une ligne d'en-tête. Movies.movies (premier argument positionnel) définit la table dans laquelle les données doivent être chargées. ./movies.csv (deuxième argument positionnel) définit le fichier à charger. En plus des fichiers locaux, la commande bq load peut charger des fichiers à partir de Cloud Storage avec des URI gs://my_bucket/path/to/file. Un schéma, qui peut être défini dans un fichier de schéma JSON ou sous la forme d'une liste séparée par des virgules (j'ai utilisé une liste séparée par des virgules). Bonne réponse ! Nos données CSV sont maintenant chargées dans la table movies.movies.

  1. Vous pouvez effectuer une requête de l'une des trois manières suivantes:

Nous pouvons interagir avec BigQuery de trois manières, dont deux que nous allons tester: a. L'UI Web de BigQuery La commande bq c. API

SELECT name, rating, genre, runtime FROM movies.movies_score limit 3;

J'ai utilisé l'espace de travail SQL BigQuery Web pour exécuter des requêtes. L'espace de travail SQL se présente comme suit:

109a0b2c7155e9b3.png

En exécutant la commande bq:

bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movies.movies_score limit 3;

6. Prédire la note d'un film sur une échelle de 1 à 10

BigQuery ML accepte l'apprentissage supervisé avec le type de modèle de régression logistique. Vous pouvez utiliser le type de modèle de régression logistique binaire pour prédire si une valeur tombe dans une catégorie parmi deux catégories possibles. Vous pouvez également utiliser le type de modèle de régression à classes multiples pour prédire si une valeur tombe dans une catégorie parmi plusieurs possibles. Ces modèles sont appelés problèmes de classification, car ils tentent de classer les données en au moins deux catégories.

Remarque rapide sur le choix du modèle: il s'agit d'un choix expérimental de modèle, basé sur l'évaluation des résultats que j'ai obtenus avec quelques modèles au départ. J'ai finalement choisi LOGISTIC_REG pour simplifier les choses et obtenir des résultats plus proches de la note réelle des films dans plusieurs bases de données. Notez qu'il ne s'agit que d'un exemple d'implémentation du modèle et qu'il n'est PAS nécessairement le modèle recommandé pour ce cas d'utilisation. Une autre façon d'implémenter cela consiste à prédire le résultat du film en tant que BON / MAUVAIS à l'aide de ce modèle de régression logistique au lieu de prédire la note.

Sélectionner vos données d'entraînement

Nous avons déjà divisé les données sur les films (au format CSV) en trois catégories dans le tableau à l'aide du champ "data_cat", qui contient l'une des trois valeurs suivantes : TRAIN, TEST et PREDICT. La répartition de l'ensemble de données à des fins de test et d'entraînement est un aspect important du modèle. Pour en savoir plus sur le fractionnement des ensembles de données, consultez la documentation.

Créer le modèle de régression logistique

Nous pouvons utiliser l'instruction CREATE MODEL avec l'option "LOGISTIC_REG" pour créer et entraîner un modèle de régression logistique.

Exécutez la requête ci-dessous dans l'espace de travail SQL de l'interface utilisateur Web de BigQuery:

CREATE OR REPLACE MODEL
  `movies.movies_score_model`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
   data_split_method='NO_SPLIT',
    input_label_cols=[‘score']
  ) AS
SELECT
  * EXCEPT(id, data_cat)
FROM
  ‘movies.movies_score'
WHERE
  data_cat = 'TRAIN';

Détails de la requête:

  1. L'instruction CREATE MODEL entraîne un modèle à l'aide des données d'entraînement de l'instruction SELECT.
  2. La clause OPTIONS spécifie le type de modèle et les options d'entraînement. Ici, l'option LOGISTIC_REG spécifie un type de modèle de régression logistique. Il n'est pas nécessaire de spécifier s'il s'agit d'un modèle de régression logistique binaire ou d'un modèle de régression logistique à classes multiples. En effet, BigQuery ML peut déterminer lequel entraîner en fonction du nombre de valeurs uniques de la colonne d'étiquette.
  3. data_split_method=‘NO_SPLIT' force BQML à s'entraîner sur les données conformément aux conditions de la requête (data_cat = "TRAIN"). Notez également qu'il est préférable d'utiliser "AUTO_SPLIT" dans cette option pour permettre au framework (ou au service dans ce cas) de randomiser la partition des divisions entraînement/test.
  4. L'option input_label_cols spécifie la colonne de l'instruction SELECT à utiliser comme colonne d'étiquette. Ici, la colonne d'étiquette est "score". Le modèle déterminera donc laquelle des 10 valeurs de score est la plus probable en fonction des autres valeurs présentes dans chaque ligne.
  5. L'option "auto_class_weights=TRUE" équilibre les étiquettes de classe dans les données d'entraînement. Par défaut, les données d'entraînement ne sont pas pondérées. Si les étiquettes des données d'entraînement sont déséquilibrées, le modèle peut apprendre à prédire en priorité la classe d'étiquettes la plus populaire.
  6. L'instruction SELECT interroge la table que nous avons chargée avec les données CSV. La clause WHERE filtre les lignes du tableau d'entrée afin que seul l'ensemble de données TRAIN soit sélectionné à cette étape.

Une fois créé, le résultat ci-dessous s'affiche dans la section "SCHEMA" de l'espace de travail SQL BigQuery:

Libellés

93efd0c1a7883690.png

Fonctionnalités

8c539338df1a9652.png

Évaluer votre modèle de régression logistique

Après avoir créé votre modèle, évaluez ses performances à l'aide de la fonction ML.EVALUATE. La fonction ML.EVALUATE compare les valeurs prédites aux données réelles. La requête permettant d'évaluer le modèle est la suivante :

SELECT
  *
FROM
  ML.EVALUATE (MODEL movies.movies_score_model,
    (
    SELECT
      *
    FROM
      movies.movies_score
    WHERE
      data_cat= ‘TEST'
    )
  )

La fonction ML.EVALUATE accepte le modèle entraîné à l'étape précédente et les données d'évaluation renvoyées par une sous-requête SELECT. La fonction renvoie une seule ligne de statistiques concernant le modèle.

b54b0ebd6514a498.png

Étant donné que vous avez effectué une régression logistique, les résultats incluent les métriques que vous voyez dans la capture d'écran ci-dessus : précision, rappel, justesse, score F1, log_loss et roc_auc, qui sont vraiment essentielles pour évaluer les performances du modèle. Vous pouvez également appeler la fonction ML.EVALUATE sans fournir de données d'entrée. ML.EVALUATE récupère les métriques d'évaluation dérivées pendant l'entraînement, lequel utilise l'ensemble de données d'évaluation réservé automatiquement.

Métriques clés en un coup d'œil:

Précision : quelle proportion d'identifications positives était effectivement correcte ? Précision = Vrai positif / (Vrai positif + Faux positif) Rappel : quelle proportion de résultats positifs réels a été identifiée correctement ? Précision : métrique permettant d'évaluer les modèles de classification. Il s'agit de la fraction des prédictions que notre modèle a effectivement correctement effectuées. Précision = Nombre de prédictions correctes / Nombre total de prédictions

Prédire la note d'un film à l'aide de ML.PREDICT

La requête suivante prédit la note de chaque film dans la partie PREDICT de l'ensemble de données.

SELECT
  *
FROM
  ML.PREDICT (MODEL movies.movies_score_model,
    (
    SELECT
      *
    FROM
      movies.movies_score
    WHERE
      data_cat= ‘PREDICT'
     )
  )

Voici un extrait des résultats:

1efb91967acc1f0c.png

Le résultat du modèle indique le SCORE prédit du film sur une échelle de 1 à 10 (classification). Vous vous demandez peut-être pourquoi plusieurs lignes de prédiction sont associées à chaque film. En effet, le modèle a renvoyé les étiquettes prédites possibles et la probabilité d'occurrence de chacune d'elles dans l'ordre décroissant.

Analyser les résultats de prédiction et le modèle

Vous pouvez également effectuer deux grandes étapes d'analyse dans les résultats de prédiction:

  1. Pour comprendre pourquoi votre modèle génère ces résultats de prédiction, vous pouvez utiliser la fonction ML.EXPLAIN_PREDICT.
  2. Pour identifier les caractéristiques les plus importantes pour déterminer la tranche de revenu en général, vous pouvez utiliser la fonction ML.GLOBAL_EXPLAIN.

Pour en savoir plus sur ces étapes, consultez la documentation.

7. Prédire la note d'un film à l'aide de BigQuery AutoML

AutoML est idéal si vous souhaitez laisser le service BigQuery créer le modèle à votre place et vous détendre jusqu'à ce que les résultats du modèle soient générés. La fonctionnalité AUTOML est disponible directement dans BQML (model_type=AUTOML_CLASSIFIER ou AUTOML_REGRESSOR) et est beaucoup plus facile à appeler si les données se trouvent déjà dans BigQuery.

CREATE OR REPLACE MODEL movies.auto_movies
       OPTIONS(model_type='AUTOML_CLASSIFIER',
               input_label_cols=['score'],
               budget_hours=1.0)
AS 
SELECT
  * EXCEPT(id, data_cat)
FROM
  movies.movies_score;

Une fois le modèle créé, vous pouvez effectuer les étapes d'EVALUATE, PREDICT et EXPLAIN_PREDICT comme nous l'avons vu dans le modèle BQML personnalisé. Pour en savoir plus sur BigQuery AutoML, consultez la documentation.

8. Déployer des modèles BQML dans Vertex AI Model Registry en un clic

Vous pouvez désormais afficher tous vos modèles de ML dans Vertex AI Model Registry. Cela permet à votre organisation de gérer et de déployer plus facilement les modèles. Cela inclut les modèles créés avec BigQuery ML, AutoML et les modèles entraînés personnalisés. Procédez comme suit :

CREATE OR REPLACE MODEL
  `movies.movies_score_model`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
   data_split_method='NO_SPLIT',
   model_registry='vertex_ai',
  vertex_ai_model_version_aliases=['logistic_reg', 'experimental'],
    input_label_cols=[‘score']
  ) AS
SELECT
  * EXCEPT(id, data_cat)
FROM
  ‘movies.movies_score'
WHERE
  data_cat = 'TRAIN';

Incluez l'option model_registry="vertex_ai" dans la requête CREATE MODEL afin que BigQuery ML puisse choisir les modèles qu'il souhaite enregistrer explicitement dans Vertex AI Model Registry. Pour en savoir plus, consultez cet article de blog.

9. Résumé

En moins de 30 minutes, nous avons:

  1. Configurer BigQuery comme base de données pour le projet d'analyse
  2. J'ai créé un modèle de prédiction personnalisé à l'aide de requêtes SQL sur les données BigQuery et sans autre codage.
  3. Vous avez créé un modèle AutoML BQ à l'aide de requêtes SQL uniquement.
  4. Modèle BQML déployé dans Vertex AI Model Registry

10. Effectuer un nettoyage

Pour éviter que les ressources utilisées dans cet article soient facturées sur votre compte Google Cloud, procédez comme suit:

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

11. Félicitations !

Félicitations ! Vous avez créé un modèle de prédiction de la note d'un film avec BQML personnalisé et AutoML, et vous l'avez déployé dans Vertex AI Model Registry, le tout à l'aide de SQL uniquement.