Instruction CREATE MODEL pour la factorisation matricielle

Instruction CREATE MODEL pour la factorisation matricielle

Pour créer un modèle de factorisation matricielle dans BigQuery, utilisez l'instruction BigQuery ML CREATE MODEL et spécifiez la valeur de MODEL_TYPE sur 'MATRIX_FACTORIZATION'.

Syntaxe de CREATE MODEL

{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL}
model_name
OPTIONS(MODEL_TYPE = 'MATRIX_FACTORIZATION'
  [, FEEDBACK_TYPE = {'EXPLICIT' | 'IMPLICIT'} ]
  [, NUM_FACTORS = int64_value ]
  [, USER_COL = string_value ]
  [, ITEM_COL = string_value ]
  [, RATING_COL = string_value ]
  [, WALS_ALPHA = float64_value ]
  [, L2_REG = float64_value ]
  [, MAX_ITERATIONS = int64_value ]
  [, EARLY_STOP = { TRUE | FALSE } ]
  [, MIN_REL_PROGRESS = float64_value ]
  [, DATA_SPLIT_METHOD = { 'AUTO_SPLIT' | 'RANDOM' | 'CUSTOM' | 'SEQ' | 'NO_SPLIT' } ]
  [, DATA_SPLIT_EVAL_FRACTION = float64_value ]
  [, DATA_SPLIT_COL = string_value ])
AS query_statement

CREATE MODEL

Crée un modèle BigQuery ML dans l'ensemble de données spécifié. Si le nom du modèle existe, CREATE MODEL renvoie une erreur.

CREATE MODEL IF NOT EXISTS

Crée un modèle BigQuery ML uniquement si ce modèle n'existe pas dans l'ensemble de données spécifié.

CREATE OR REPLACE MODEL

Crée un modèle BigQuery ML et remplace tout modèle existant du même nom dans l'ensemble de données spécifié.

model_name

model_name correspond au nom du modèle BigQuery ML que vous créez ou remplacez. Le nom du modèle doit être unique pour chaque ensemble de données. Aucun autre modèle, ni table ne peut porter le même nom. Le nom du modèle doit respecter les mêmes règles de dénomination que celles des tables BigQuery. Un nom de modèle peut contenir les éléments suivants :

  • Jusqu'à 1 024 caractères
  • Des lettres majuscules ou minuscules, des chiffres et des traits de soulignement

model_name n'est pas sensible à la casse.

Si aucun projet par défaut n'est configuré, ajoutez l'ID du projet au début du nom du modèle au format suivant, en intégrant les accents graves :

`[PROJECT_ID].[DATASET].[MODEL]`

Exemple :

`myproject.mydataset.mymodel`

CREATE MODEL accepte les options suivantes :

MODEL_TYPE

Syntaxe

MODEL_TYPE = 'MATRIX_FACTORIZATION'

Description

Spécifie le type de modèle. Pour créer un modèle de factorisation matricielle, définissez la valeur de model_type sur 'MATRIX_FACTORIZATION'.

model_option_list

model_option_listrequiert l'option model_type. Toutes les autres options sont facultatives.

Les modèles de factorisation matricielle sont compatibles avec les options suivantes :

FEEDBACK_TYPE

Syntaxe

FEEDBACK_TYPE = { 'EXPLICIT' | 'IMPLICIT' }

Description

Spécifie le type de commentaires pour les modèles de factorisation matricielle. Le type de commentaires détermine l'algorithme utilisé pendant l'entraînement.

Il existe deux types de notes (commentaires des utilisateurs) : 'EXPLICIT' et 'IMPLICIT'. Utilisez le type de commentaires souhaité dans les options de création de modèle, selon votre cas d'utilisation.

  • Si l'utilisateur a explicitement attribué une note (de 1 à 5, par exemple) à un élément, par exemple des recommandations de films, spécifiez FEEDBACK_TYPE='EXPLICIT'. Cela entraînera un modèle à l'aide de l'algorithme des moindres carrés alternés.

  • La plupart des problèmes rencontrés dans le contexte de la recommandation de produits surviennent en raison de l'absence de commentaires explicites de la part des utilisateurs. Au lieu de cela, la valeur de la note doit être construite artificiellement en fonction des interactions entre l'utilisateur et l'élément (par exemple, les clics, les pages vues et les achats). Dans ce cas, spécifiez FEEDBACK_TYPE='IMPLICIT'. Cela entraînera un modèle à l'aide de l'algorithme des moindres carrés alternés pondérés.

Pour en savoir plus sur les différences entre les deux types de commentaires et savoir quand les utiliser, consultez la section Informations supplémentaires sur les types de commentaires.

Arguments

La valeur par défaut est 'EXPLICIT'.

NUM_FACTORS

Syntaxe

NUM_FACTORS = int64_value

Description

Spécifie le nombre de facteurs latents à utiliser pour les modèles de factorisation matricielle.

Arguments

L'élément int64_value appartient au groupe 'INT64'. Les valeurs autorisées sont comprises entre 2 et 200. La valeur par défaut est log2(n), où n correspond au nombre d'exemples d'entraînement.

USER_COL

Syntaxe

USER_COL = string_value

Description

Nom de la colonne utilisateur pour les modèles de factorisation matricielle.

Arguments string_value appartient au groupe 'STRING'. La valeur par défaut est 'user'.

ITEM_COL

Syntaxe

ITEM_COL = string_value

Description

Nom de la colonne d'élément pour les modèles de factorisation matricielle.

Arguments string_value appartient au groupe 'STRING'. La valeur par défaut est 'item'.

RATING_COL

Syntaxe

RATING_COL = string_value

Description

Nom de la colonne de note pour les modèles de factorisation matricielle.

Arguments string_value appartient au groupe 'STRING'. La valeur par défaut est 'rating'.

WALS_ALPHA

Syntaxe

WALS_ALPHA = float64_value

Description

Hyperparamètre pour le modèle de factorisation matricielle 'IMPLICIT'.

Pour en savoir plus, consultez la section Informations supplémentaires sur les types de commentaires.

Arguments float64_value appartient au groupe 'FLOAT64'. La valeur par défaut est 40.

L2_REG

Syntaxe

L2_REG = float64_value

Description

La quantité de régularisation L2 appliquée.

Arguments

L'élément float64_value appartient au groupe FLOAT64. La valeur par défaut est 1.0.

MAX_ITERATIONS

Syntaxe

MAX_ITERATIONS = int64_value

Description

Le nombre maximal d'itérations ou d'étapes d'entraînement.

Arguments

L'élément int64_value appartient au groupe INT64. La valeur par défaut est 20.

EARLY_STOP

Syntaxe

EARLY_STOP = { TRUE | FALSE }

Description

Indique si l'entraînement doit s'arrêter après la première itération pour laquelle l'amélioration de la perte relative est inférieure à la valeur spécifiée pour MIN_REL_PROGRESS.

Arguments

Il s'agit d'une valeur booléenne (BOOL). La valeur par défaut est TRUE.

MIN_REL_PROGRESS

Syntaxe

MIN_REL_PROGRESS = float64_value

Description

La valeur minimale de l'amélioration de la perte relative nécessaire pour poursuivre l'entraînement lorsque EARLY_STOP est défini sur true. Par exemple, une valeur de 0,01 spécifie que chaque itération doit réduire la perte de 1 % pour que l'entraînement persiste.

Arguments

L'élément float64_value appartient au groupe FLOAT64. La valeur par défaut est 0,01.

DATA_SPLIT_METHOD

Syntaxe

DATA_SPLIT_METHOD = { 'AUTO_SPLIT' | 'RANDOM' | 'CUSTOM' | 'SEQ' | 'NO_SPLIT' }

Description

La méthode permettant de scinder les données d'entrée en ensembles d'entraînement et d'évaluation. Les données d'entraînement servent à entraîner le modèle. Les données d'évaluation permettent d'éviter le surentraînement via un arrêt prématuré.

Arguments

Accepte les valeurs suivantes :

'AUTO_SPLIT' : la stratégie de répartition automatique est la suivante :

  • Lorsque les données d'entrée comprennent moins de 500 lignes, toutes les lignes sont utilisées en tant que données d'entraînement.
  • Lorsque les données d'entrée comprennent entre 500 et 50 000 lignes, 20 % de ces données sont utilisées en tant que données d'évaluation dans une répartition RANDOM.
  • Lorsque les données d'entrée comprennent plus de 50 000 lignes, seules 10 000 d'entre elles sont utilisées en tant que données d'évaluation dans une répartition RANDOM.

'RANDOM' répartit les données de manière aléatoire. La répartition aléatoire est déterministe ; plusieurs entraînements différents produisent les mêmes résultats de répartition si les données d'entraînement sous-jacentes restent identiques.

'CUSTOM' répartit les données à l'aide d'une colonne de type BOOL fournie par le client. Les lignes dont la valeur est définie sur TRUE sont utilisées en tant que données d'évaluation. Les lignes dont la valeur est définie sur FALSE sont utilisées en tant que données d'entraînement.

'SEQ' répartit les données de manière séquentielle à l'aide d'une colonne fournie par le client. La colonne peut posséder n'importe quel type de données pouvant être triées : NUMERIC, STRING ou TIMESTAMP. Toutes les lignes dont les valeurs fractionnées sont inférieures au seuil sont utilisées en tant que données d'entraînement. Les lignes restantes, y compris les valeurs NULLs, sont utilisées en tant que données d'évaluation.

'NO_SPLIT' utilise toutes les données en tant que données d'entraînement.

DATA_SPLIT_EVAL_FRACTION

Syntaxe

DATA_SPLIT_EVAL_FRACTION = float64_value

Description

Cette option est utilisée avec les répartitions 'RANDOM' et 'SEQ'. Elle spécifie la fraction des données utiles à l'évaluation, à deux décimales près.

Arguments

L'élément float64_value appartient au groupe FLOAT64. La valeur par défaut est 0,2.

DATA_SPLIT_COL

Syntaxe

DATA_SPLIT_COL = string_value

Description

Identifie la colonne permettant de répartir les données. Cette colonne ne peut pas être utilisée comme caractéristique, ni comme étiquette. Elle sera automatiquement exclue des caractéristiques.

  • Lorsque la valeur de DATA_SPLIT_METHOD est définie sur 'CUSTOM', la colonne correspondante doit être de type BOOL. Les lignes dont les valeurs sont définies sur TRUE ou NULL sont utilisées en tant que données d'évaluation. Les lignes dont les valeurs sont définies sur FALSE sont utilisées en tant que données d'entraînement.

  • Lorsque la valeur de DATA_SPLIT_METHOD est définie sur 'SEQ', les n dernières lignes par ordre de grandeur croissant dans la colonne correspondante sont utilisées en tant que données d'évaluation, où n correspond à la valeur spécifiée pour DATA_SPLIT_EVAL_FRACTION. Les premières lignes sont utilisées en tant que données d'entraînement.

Pour plus d'informations sur les types d'entrée compatibles, reportez-vous à la section Types d'entrée compatibles avec DATA_SPLIT_COL.

Arguments

L'élément string_value appartient au groupe STRING.

query_statement

La clause AS query_statement spécifie la requête en langage SQL standard permettant de générer les données d'entraînement. Pour en savoir plus sur la syntaxe SQL acceptée par la clause query_statement, consultez la page Syntaxe des requêtes en SQL standard.

Pour les modèles de factorisation matricielle, query_statement doit contenir exactement trois colonnes (user, item et rating), sauf si l'utilisateur spécifie une méthode de répartition des données (DATA_SPLIT_METHOD) nécessitant l'utilisation d'une colonne de répartition des données (DATA_SPLIT_COL).

Entrées compatibles

L'instruction CREATE MODEL accepte les types de données suivants pour les colonnes utilisateur (user), élement (item) et note (rating).

Types de données compatibles pour les entrées de modèle de factorisation matricielle

BigQuery ML est compatible avec différents types de données du langage SQL standard pour les colonnes d'entrée de factorisation matricielle. Les types de données acceptés pour chaque colonne respective sont les suivants :

Matrix factorization input column Supported types
user N'importe quel type de données groupable
item N'importe quel type de données groupable
rating INT64
NUMERIC
FLOAT64

Informations supplémentaires sur les types de commentaires

Afin de créer un bon modèle de factorisation matricielle pour les recommandations, il est important de s'assurer que les données sont entraînées sur l'algorithme le mieux adapté. Pour les modèles de factorisation matricielle, il existe deux façons d'obtenir une note pour une paire utilisateur-élément.

Les notes que l'utilisateur a dû saisir et définir sont considérées comme des commentaires explicites. Une note explicite basse tend à indiquer que l'utilisateur a eu un avis très négatif sur un élément, tandis qu'une note explicite élevée tend à indiquer que l'utilisateur a aimé cet élément. Les sites de streaming de films sur lesquels les utilisateurs donnent leur avis sont des exemples d'ensembles de données explicitement étiquetés. Pour les problèmes de commentaires explicites, nous utilisons l'algorithme des moindres carrés alternés, communément appelé ALS (pour l'anglais Alternating Least Squares). L'algorithme ALS cherche à minimiser la fonction de perte suivante :

$$ Loss = \sum_{u, i \in \text{observed ratings}} (r_{ui} - x^T_uy_i)^2 + \lambda(\sum_u||x_u||^2 + \sum_i||y_i||^2)$$

\(r_{ui} = \) : note que l'utilisateur \(u\) a attribuée à l'élément \(i\)
\(x_u = \) : vecteur de pondérations de facteurs latents pour l'utilisateur \(u\). Sa longueur est égale à NUM_FACTORS.
\(y_i = \) : vecteur de pondération de facteurs latents pour l'élément \(i\). Sa longueur est égale à NUM_FACTORS.
\(\lambda = \) : L2_REG

La plupart du temps cependant, les données sont peu étiquetées par les utilisateurs. Souvent, les seules statistiques dont dispose une entreprise pour déterminer si un utilisateur a aimé un élément ou un film sont le taux de clics ou la durée d'engagement. Souvent, ces statistiques peuvent être utilisées comme une note par procuration, mais elles n'indiquent pas nécessairement si un utilisateur aime ou non quelque chose. Les données de ces ensembles de données sont considérées comme des commentaires implicites. Pour les problèmes de commentaires implicites, nous utilisons une variante de cet algorithme, à savoir les moindres carrés alternés pondérés, ou WALS (pour l'anglais Weighted-Alternating Least Squares), décrite dans le document http://yifanhu.net/PUB/cf.pdf. Cette approche utilise ces notes par procuration comme des indices de confiance pour une observation donnée par un utilisateur pour un élément. L'algorithme WALS cherche à minimiser la fonction de perte suivante :

$$ Loss = \sum_{u, i} c_{ui}(p_{ui} - x^T_uy_i)^2 + \lambda(\sum_u||x_u||^2 + \sum_i||y_i||^2) $$

Où, en plus des variables définies ci-dessus, la fonction introduit les variables suivantes :

\(p_{ui} = 1\) lorsque \(r_{ui} > 0\) et \(p_{ui} = 0\) lorsque \(r_{ui} < 0\)
\(c_{ui} = 1 + \alpha r_{ui}\)
\(\alpha = \) WALS_ALPHA

Pour une factorisation matricielle explicite, l'entrée est généralement un nombre entier compris dans une plage fixe connue. Pour la factorisation matricielle implicite, les notes d'entrée peuvent être des nombres doubles ou entiers couvrant une plage plus large. Nous vous recommandons de vérifier que les notes d'entrée ne contiennent pas d'anomalies et de les adapter si le modèle est peu performant.

Limites connues

Les instructions CREATE MODEL pour les modèles de factorisation matricielle doivent respecter les règles suivantes :

  •  Si le message d'erreur "Le modèle est trop grand (plus de 100 Mo)" s'affiche, vérifiez les données d'entrée. Cela est dû à un nombre trop élevé de notes pour un seul utilisateur ou un seul élément. Dans ce cas, il peut être utile de procéder au hachage des colonnes utilisateur ou des colonnes d'élément dans une valeur INT64, ou de réduire la taille des données. Voici une formule générale permettant de déterminer si cette erreur risque de se produire :

    max(num_rated_user, num_rated_item) < 100 million

    Où num_rated_user correspond aux notes maximales qu'un utilisateur a saisies, et num_rated_items correspond aux notes maximales pour un élément donné.

Exemples d'instructions CREATE MODEL

L'exemple suivant crée des modèles nommés mymodel dans mydataset dans votre projet par défaut.

Entraîner un modèle de factorisation matricielle avec des commentaires explicites

Cet exemple crée un modèle de factorisation matricielle de commentaires explicites.

CREATE MODEL `project_id.mydataset.mymodel`
 OPTIONS(MODEL_TYPE='MATRIX_FACTORIZATION') AS
SELECT
  user,
  item,
  rating
FROM
  `mydataset.mytable`

Entraîner un modèle de factorisation matricielle avec des commentaires implicites

Cet exemple crée un modèle de factorisation matricielle de commentaires implicites.

CREATE MODEL `project_id.mydataset.mymodel`
 OPTIONS(MODEL_TYPE='MATRIX_FACTORIZATION',
         FEEDBACK_TYPE='IMPLICIT') AS
SELECT
  user,
  item,
  rating
FROM
  `mydataset.mytable`

Étape suivante