La declaración CREATE MODEL para la factorización de matrices

Declaración CREATE MODEL para la factorización de matrices

Para crear un modelo de factorización de matrices en BigQuery, usa la declaración CREATE MODEL de BigQuery ML y especifica MODEL_TYPE como 'MATRIX_FACTORIZATION'.

Sintaxis 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

Crea un modelo nuevo de BigQuery ML en el conjunto de datos especificado. Si el nombre del modelo ya existe, CREATE MODEL muestra un error.

CREATE MODEL IF NOT EXISTS

Crea un modelo de BigQuery ML nuevo solo si el modelo no existe en el conjunto de datos especificado.

CREATE OR REPLACE MODEL

Crea un modelo de BigQuery ML nuevo y reemplaza cualquier modelo existente con el mismo nombre en el conjunto de datos especificado.

model_name

model_name es el nombre del modelo de BigQuery ML que estás creando o reemplazando. El nombre del modelo debe ser único por conjunto de datos: ningún otro modelo o tabla puede tener el mismo nombre. El nombre del modelo debe seguir las mismas reglas de denominación que una tabla de BigQuery. Un nombre de modelo puede contener lo siguiente:

  • Hasta 1,024 caracteres
  • Letras en mayúscula o minúscula, números y guiones bajos

model_name no distingue entre mayúsculas y minúsculas.

Si no tienes un proyecto predeterminado configurado, antepone el ID del proyecto al nombre del modelo en el siguiente formato, incluidos los acentos graves:

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

Por ejemplo:

`myproject.mydataset.mymodel`

CREATE MODEL admite las siguientes opciones:

MODEL_TYPE

Sintaxis

MODEL_TYPE = 'MATRIX_FACTORIZATION'

Descripción

Especifica el tipo de modelo. Para crear un modelo de factorización de matrices, establece model_type en 'MATRIX_FACTORIZATION'.

model_option_list

En model_option_list, se requiere la opción model_type. Todas las demás son opcionales.

Los modelos de factorización de matrices admiten las siguientes opciones:

FEEDBACK_TYPE

Sintaxis

FEEDBACK_TYPE = { 'EXPLICIT' | 'IMPLICIT' }

Descripción

Especifica el tipo de comentarios para los modelos de factorización de matrices. El tipo de comentarios determina el algoritmo que se usa durante el entrenamiento.

Existen dos tipos de calificaciones (comentarios de los usuarios): 'IMPLICIT' y 'EXPLICIT'. Usa el tipo de comentarios deseado en las opciones de creación del modelo en función de tu caso práctico.

  • Si el usuario proporcionó de manera explícita una calificación (por ejemplo, del 1 al 5) a un elemento, como recomendaciones de películas, especifica FEEDBACK_TYPE='EXPLICIT'. Con esto, se entrenará el modelo mediante el algoritmo de mínimos cuadrados alternos.

  • La mayoría de los problemas de recomendación de productos no tienen comentarios explícitos de los usuarios. En su lugar, el valor de la calificación debe construirse de manera artificial según la interacción del usuario con el elemento (por ejemplo, los clics, las páginas vistas y las compras). En esta situación, especifica FEEDBACK_TYPE='IMPLICIT'. Con esto, se entrenará el modelo mediante el algoritmo de mínimos cuadrados ponderados alternos.

Para obtener más información sobre las diferencias entre los dos tipos de comentarios y cuándo usarlos, consulta la Información adicional sobre los tipos de comentarios.

Argumentos

El valor predeterminado es 'EXPLICIT'.

NUM_FACTORS

Sintaxis

NUM_FACTORS = int64_value

Descripción

Especifica la cantidad de factores latentes que se usarán en los modelos de factorización de matrices.

Argumentos

int64_value es un 'INT64'. Se permiten valores incluidos en el rango del 2 al 200. El valor predeterminado es log2(n), en el que n es la cantidad de ejemplos de entrenamiento.

USER_COL

Sintaxis

USER_COL = string_value

Descripción

El nombre de la columna de usuarios de los modelos de factorización de matrices.

Argumentos string_value es una 'STRING'. El valor predeterminado es 'user'.

ITEM_COL

Sintaxis

ITEM_COL = string_value

Descripción

El nombre de la columna de elementos de los modelos de factorización de matrices.

Argumentos string_value es una 'STRING'. El valor predeterminado es 'item'.

RATING_COL

Sintaxis

RATING_COL = string_value

Descripción

El nombre de la columna de calificaciones de los modelos de factorización de matrices.

Argumentos string_value es una 'STRING'. El valor predeterminado es 'rating'.

WALS_ALPHA

Sintaxis

WALS_ALPHA = float64_value

Descripción

Un hiperparámetro del modelo de factorización de matrices 'IMPLICIT'.

Para obtener más información, consulta la Información adicional sobre los tipos de comentarios.

Argumentos float64_value es un 'FLOAT64'. El valor predeterminado es 40.

L2_REG

Sintaxis

L2_REG = float64_value

Descripción

Se aplicó la cantidad de regularización L2.

Argumentos

float64_value es un FLOAT64. El valor predeterminado es 1.0.

MAX_ITERATIONS

Sintaxis

MAX_ITERATIONS = int64_value

Descripción

Es la cantidad máxima de iteraciones o pasos de entrenamiento.

Argumentos

int64_value es un INT64. El valor predeterminado es 20.

EARLY_STOP

Sintaxis

EARLY_STOP = { TRUE | FALSE }

Descripción

Si el entrenamiento debe detenerse después de la primera iteración en la que la mejora de la pérdida relativa es menor que el valor especificado para MIN_REL_PROGRESS

Argumentos

El valor es BOOL. El valor predeterminado es TRUE.

MIN_REL_PROGRESS

Sintaxis

MIN_REL_PROGRESS = float64_value

Descripción

Es la mejora de la pérdida relativa mínima necesaria para continuar con el entrenamiento cuando EARLY_STOP se establece en verdadero. Por ejemplo, un valor de 0.01 especifica que cada iteración debe reducir la pérdida en un 1% para que el entrenamiento continúe.

Argumentos

float64_value es un FLOAT64. El valor predeterminado es 0.01.

DATA_SPLIT_METHOD

Sintaxis

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

Descripción

Es el método para dividir los datos de entrada en conjuntos de entrenamiento y evaluación. Los datos de entrenamiento se utilizan para entrenar el modelo. Los datos de evaluación se utilizan para evitar un sobreajuste mediante interrupciones anticipadas.

Argumentos

Acepta los siguientes valores:

'AUTO_SPLIT': esta es la estrategia de división automática:

  • Cuando hay menos de 500 filas en los datos de entrada, todas las filas se utilizan como datos de entrenamiento.
  • Cuando hay entre 500 y 50,000 filas en los datos de entrada, el 20% de los datos se utiliza como datos de evaluación en una división RANDOM.
  • Cuando hay más de 50,000 filas en los datos de entrada, solo 10,000 de ellos se usan como datos de evaluación en una división RANDOM.

'RANDOM': divide datos de forma aleatoria. Una división aleatoria es determinista: las diferentes ejecuciones de entrenamiento producen los mismos resultados de división si los datos de entrenamiento subyacentes siguen siendo los mismos.

'CUSTOM': divide datos con una columna de tipo BOOL que proporciona el cliente. Las filas con un valor de TRUE se utilizan como datos de evaluación. Las filas con un valor de FALSE se utilizan como datos de entrenamiento.

'SEQ': divide datos de forma secuencial mediante el uso de una columna que proporciona el cliente. La columna puede tener cualquier tipo de datos que se pueda ordenar: NUMERIC, STRING o TIMESTAMP. Todas las filas con valores divididos más pequeños que el umbral se usan como datos de entrenamiento. Las filas restantes, incluidas NULLs, se utilizan como datos de evaluación.

'NO_SPLIT': Usa todos los datos como datos de entrenamiento.

DATA_SPLIT_EVAL_FRACTION

Sintaxis

DATA_SPLIT_EVAL_FRACTION = float64_value

Descripción

Esta opción se usa con divisiones 'RANDOM' y 'SEQ'. Especifica la fracción de los datos utilizados para la evaluación, con una precisión de dos decimales.

Argumentos

float64_value es un FLOAT64. El valor predeterminado es 0.2.

DATA_SPLIT_COL

Sintaxis

DATA_SPLIT_COL = string_value

Descripción

Identifica la columna utilizada para dividir los datos. Esta columna no se puede usar como un atributo ni como una etiqueta, y se excluirá de los atributos automáticamente.

  • Cuando el valor de DATA_SPLIT_METHOD es 'CUSTOM', la columna correspondiente debe ser del tipo BOOL. Las filas con valores TRUE o NULL se usan como datos de evaluación. Las filas con valores FALSE se usan como datos de entrenamiento.

  • Cuando el valor de DATA_SPLIT_METHOD es 'SEQ', las últimas filas n de menor a mayor en la columna correspondiente se utilizan como datos de evaluación, en los que n es el valor especificado para DATA_SPLIT_EVAL_FRACTION. Las primeras filas se utilizan como datos de entrenamiento.

Para obtener información sobre los tipos de entrada admitidos, consulta Tipos de entrada admitidos para DATA_SPLIT_COL.

Argumentos

string_value es una STRING.

query_statement

La cláusula AS query_statement especifica la consulta de SQL estándar que se usa para generar los datos de entrenamiento. Para obtener información sobre la sintaxis de SQL admitida de la cláusula query_statement, consulta Sintaxis de consulta de SQL estándar.

Para los modelos de factorización de matrices, se espera que el valor de query_statement contenga 3 columnas (user, item y rating), a menos que el usuario especifique un DATA_SPLIT_METHOD que requiera un DATA_SPLIT_COL.

Entradas admitidas

La declaración CREATE MODEL admite los siguientes tipos de datos para las columnas de usuarios, elementos y calificaciones.

Tipos de datos admitidos para las entradas del modelo de factorización de matrices

BigQuery ML admite diferentes tipos de datos de SQL estándar en las columnas de entrada para la factorización de matrices. Los tipos de datos admitidos para cada columna incluyen los siguientes:

Matrix factorization input column Supported types
user Cualquier tipo de datos agrupables
item Cualquier tipo de datos agrupables
rating INT64
NUMERIC
FLOAT64

Información adicional sobre los tipos de comentarios

Una parte importante de la creación de un buen modelo de factorización de matrices para hacer recomendaciones consiste en asegurarse de que los datos se entrenen con el algoritmo más adecuado. En el caso de los modelos de factorización de matrices, hay dos maneras de obtener una calificación para un par de usuario y elemento.

Las calificaciones que el usuario tuvo que ingresar y establecer se consideran comentarios explícitos. Las calificaciones explícitas bajas implican que el usuario se sintió disconforme con un elemento, mientras que las altas implican que le agradó. Los sitios de transmisión de películas en los que los usuarios dan calificaciones son ejemplos de conjuntos de datos etiquetados de manera explícita. Para los problemas de comentarios explícitos, usamos el algoritmo de mínimos cuadrados alternos, más conocido como ALS. El ALS busca minimizar la siguiente función de pérdida:

$$ 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)$$

En el ejemplo anterior, se ilustra lo siguiente:

\(r_{ui} = \) las calificaciones que el usuario \(u\) dio al elemento \(i\)
\(x_u = \) vector de pesos de factores latentes del usuario \(u\). Es la longitud de NUM_FACTORS.
\(y_i = \) vector de pesos de factores latentes del elemento \(i \). Es la longitud de NUM_FACTORS.
\(\lambda = \) L2_REG

Sin embargo, los usuarios casi nunca etiquetan los datos de tiempo. A menudo, las únicas métricas que tiene una empresa respecto de si a un usuario le gustó un elemento o una película son las tasas de clics o el tiempo de participación. En ocasiones, esto se puede usar como una calificación de proxy, pero no siempre es una indicación definitiva de si al usuario le gustó o no un elemento. Los datos de estos conjuntos de datos se consideran comentarios implícitos. Para los problemas de comentarios implícitos, usamos una variante de este algoritmo denominada mínimos cuadrados ponderados alternos, o WALS, que se describe en http://yifanhu.net/PUB/cf.pdf. En este enfoque, se usan estas clasificaciones de proxy y se las trata como una confianza de una observación que un usuario hace sobre un elemento. El WALS busca minimizar la siguiente función de pérdida:

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

Además de las variables definidas antes, la función también presenta las siguientes variables:

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

Para la factorización de matrices explícita, la entrada suele estar compuesta por números enteros dentro de un rango fijo conocido. Para la factorización de matrices implícita, las calificaciones de entrada pueden ser dobles o números enteros que abarcan un rango más amplio. Recomendamos que te asegures de que no haya valores atípicos en las calificaciones de entrada y que escales las calificaciones si el modelo tiene un rendimiento deficiente.

Limitaciones conocidas

Las declaraciones CREATE MODEL para los modelos de factorización de matrices deben cumplir con las siguientes reglas:

  • Si se muestra el error “El modelo es demasiado grande (más de 100 MB)”, verifica los datos de entrada. Esto se debe a que hay un exceso de calificaciones de un solo usuario o elemento. Aplicar hashing en las columnas de usuarios o elementos en un valor INT64 o reducir el tamaño de los datos puede ayudar. Una fórmula general para determinar si esto ocurrirá es la siguiente:

    max(num_rated_user, num_rated_item) < 100 million

    En esta fórmula, num_rated_user es la calificación máxima de un elemento que ingresó un solo usuario, y num_rated_items es la calificación máxima de un usuario respecto de un elemento determinado.

Ejemplos de CREATE MODEL

En el siguiente ejemplo, se crean modelos llamados mymodel en mydataset en el proyecto predeterminado.

Entrena un modelo de factorización de matrices con comentarios explícitos

En este ejemplo, se crea un modelo de factorización de matrices con comentarios explícitos.

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

Entrena un modelo de factorización de matrices con comentarios implícitos

En este ejemplo, se crea un modelo de factorización de matrices con comentarios implícitos.

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

Próximos pasos