Instrução CREATE MODEL para fatoração de matrizes

Instrução CREATE MODEL para fatoração de matrizes

Para criar um modelo de fatoração de matrizes no BigQuery, use a instrução CREATE MODEL do BigQuery ML e especifique MODEL_TYPE como 'MATRIX_FACTORIZATION'.

Sintaxe 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

Cria um novo modelo do BigQuery ML no conjunto de dados especificado. Se o nome do modelo já estiver em uso, CREATE MODEL retornará um erro.

CREATE MODEL IF NOT EXISTS

Cria um novo modelo do BigQuery ML somente se não houver um outro modelo de mesmo nome no conjunto de dados especificado.

CREATE OR REPLACE MODEL

Cria um novo modelo do BigQuery ML e substitui qualquer modelo que já existe com o mesmo nome no conjunto de dados especificado.

model_name

model_name é o nome do modelo do BigQuery ML que você está criando ou substituindo. O nome do modelo precisa ser exclusivo por conjunto de dados: nenhum outro modelo ou tabela pode ter o mesmo nome. O nome do modelo precisa seguir as mesmas regras de nomenclatura de uma tabela do BigQuery. Um nome de modelo pode conter:

  • até 1.024 caracteres
  • letras maiúsculas, minúsculas, números e sublinhados

model_name não diferencia maiúsculas de minúsculas.

Se você não tiver um projeto padrão configurado, preceda o nome do modelo com o ID do projeto no seguinte formato, incluindo os acentos graves:

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

Por exemplo:

`myproject.mydataset.mymodel`

CREATE MODEL é compatível com as seguintes opções:

MODEL_TYPE

Sintaxe

MODEL_TYPE = 'MATRIX_FACTORIZATION'

Descrição

Especifica o tipo do modelo. Para criar um modelo de fatoração de matrizes, defina model_type como 'MATRIX_FACTORIZATION'.

model_option_list

Em model_option_list, a opção model_type é obrigatória. Todas as outras são opcionais.

Os modelos de fatoração de matrizes são compatíveis com as seguintes opções:

FEEDBACK_TYPE

Sintaxe

FEEDBACK_TYPE = { 'EXPLICIT' | 'IMPLICIT' }

Descrição

Especifica o tipo de feedback para modelos de fatoração de matrizes. O tipo de feedback determina o algoritmo usado durante o treinamento.

Existem dois tipos de classificações (feedback do usuário): 'EXPLICIT' e 'IMPLICIT'. Escolha o tipo de feedback pretendido nas opções de criação do modelo, dependendo do seu caso de uso.

  • Se o usuário forneceu explicitamente uma classificação (por exemplo, de 1 a 5) para um item, como em recomendações de filmes, especifique FEEDBACK_TYPE='EXPLICIT'. Isso treinará um modelo usando o algoritmo de mínimos quadrados alternados (em inglês).

  • A maioria dos problemas de recomendação de produtos não tem feedback explícito do usuário. Em vez disso, o valor da classificação precisa ser criado artificialmente com base na interação do usuário com o item, por exemplo, por meio de cliques, visualizações de página e compras. Nesse caso, especifique FEEDBACK_TYPE='IMPLICIT'. Isso treinará um modelo usando o algoritmo de mínimos quadrados ponderados alternados (em inglês).

Para saber mais sobre as diferenças entre os dois tipos de feedback e quando usar cada um deles, consulte outras informações sobre os tipos de feedback.

Argumentos

O valor padrão é 'EXPLICIT'.

NUM_FACTORS

Sintaxe

NUM_FACTORS = int64_value

Descrição

Especifica o número de fatores latentes a serem usados para modelos de fatoração de matrizes.

Argumentos

int64_value é um 'INT64'. Os valores permitidos são de 2 a 200. O valor padrão é log2(n), em que n é o número de exemplos de treinamento.

USER_COL

Sintaxe

USER_COL = string_value

Descrição

O nome da coluna de usuários para modelos de fatoração de matrizes.

Argumentos string_value é um 'STRING'. O valor padrão é 'user'.

ITEM_COL

Sintaxe

ITEM_COL = string_value

Descrição

O nome da coluna de itens para modelos de fatoração de matrizes.

Argumentos string_value é um 'STRING'. O valor padrão é 'item'.

RATING_COL

Sintaxe

RATING_COL = string_value

Descrição

O nome da coluna de classificações para modelos de fatoração de matrizes.

Argumentos string_value é um 'STRING'. O valor padrão é 'rating'.

WALS_ALPHA

Sintaxe

WALS_ALPHA = float64_value

Descrição

Um hiperparâmetro para o modelo de fatoração de matrizes 'IMPLICIT'.

Para saber mais, consulte outras informações sobre os tipos de feedback.

Argumentos float64_value é um 'FLOAT64'. O valor padrão é 40.

L2_REG

Sintaxe

L2_REG = float64_value

Descrição

Quantidade de regularização L2 (em inglês) aplicada.

Argumentos

float64_value é um FLOAT64. O valor padrão é 1,0.

MAX_ITERATIONS

Sintaxe

MAX_ITERATIONS = int64_value

Descrição

Número máximo de iterações de treinamento (ou etapas).

Argumentos

int64_value é um INT64. O valor padrão é 20.

EARLY_STOP

Sintaxe

EARLY_STOP = { TRUE | FALSE }

Descrição

Indica se o treinamento precisa parar após a primeira iteração em que a melhoria da perda relativa é menor que o valor especificado para MIN_REL_PROGRESS.

Argumentos

O valor é um BOOL. O valor padrão é TRUE.

MIN_REL_PROGRESS

Sintaxe

MIN_REL_PROGRESS = float64_value

Descrição

Melhoria mínima de perda relativa, necessária para continuar o treinamento quando EARLY_STOP for definido como "true". Por exemplo, o valor 0,01, especifica que cada iteração precisa reduzir a perda em 1% para que o treinamento continue.

Argumentos

float64_value é um FLOAT64. O valor padrão é 0,01.

DATA_SPLIT_METHOD

Sintaxe

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

Descrição

Método para dividir dados de entrada em conjuntos de treinamento e avaliação. Dados de treinamento são usados para treinar o modelo. Os dados de avaliação são usados para evitar o overfitting (em inglês) por meio de parada antecipada.

Argumentos

Aceita os seguintes valores:

'AUTO_SPLIT' A estratégia de divisão automática é a seguinte:

  • Quando há menos de 500 linhas nos dados de entrada, todas as linhas são usadas como dados de treinamento.
  • Quando há entre 500 e 50.000 linhas nos dados de entrada, 20% dos dados são usados como dados de avaliação em uma divisão RANDOM.
  • Quando há mais de 50.000 linhas nos dados de entrada, somente 10.000 delas são usadas como dados de avaliação em uma divisão RANDOM.

'RANDOM' Divide dados aleatoriamente. Uma divisão aleatória é determinística: diferentes execuções de treinamento produzirão os mesmos resultados de divisão se os dados de treinamento subjacentes permanecerem os mesmos.

'CUSTOM' Divide os dados sequencialmente usando uma coluna fornecida pelo cliente do tipo BOOL. As linhas com o valor TRUE são usadas como dados de avaliação. As linhas com o valor FALSE são usadas como dados de treinamento.

'SEQ' Divide os dados sequencialmente usando uma coluna fornecida pelo cliente. A coluna pode ter qualquer tipo de dados solicitados: NUMERIC, STRING ou TIMESTAMP. Todas as linhas com valores divididos menores que o limite serão usadas como dados de treinamento. As linhas restantes, inclusive NULLs, serão usadas como dados de avaliação.

'NO_SPLIT' usa todos os dados como dados de treinamento.

DATA_SPLIT_EVAL_FRACTION

Sintaxe

DATA_SPLIT_EVAL_FRACTION = float64_value

Descrição

Essa opção é usada com divisões 'RANDOM' e 'SEQ'. Ela especifica a fração dos dados usados para avaliação, com precisão de duas casas decimais.

Argumentos

float64_value é um FLOAT64. O valor padrão é 0,2.

DATA_SPLIT_COL

Sintaxe

DATA_SPLIT_COL = string_value

Descrição

Identifica a coluna usada para dividir os dados. Ela não pode ser usada como um recurso ou rótulo e será excluída dos recursos automaticamente.

  • Quando o valor de DATA_SPLIT_METHOD for 'CUSTOM', a coluna correspondente deverá ser do tipo BOOL. As linhas com valores TRUE ou NULL são usadas como dados de avaliação. Linhas com valores FALSE são usadas como dados de treinamento.

  • Quando o valor de DATA_SPLIT_METHOD é 'SEQ', as últimas n linhas, da menor para a maior na coluna correspondente, são usadas como dados de avaliação, em que n é o valor especificado para DATA_SPLIT_EVAL_FRACTION. As primeiras linhas são usadas como dados de treinamento.

Para informações sobre os tipos de entrada compatíveis, consulte Tipos de entrada compatíveis para DATA_SPLIT_COL.

Argumentos

string_value é um STRING.

query_statement

A cláusula AS query_statement especifica a consulta SQL padrão usada para gerar os dados de treinamento. Para mais informações sobre a sintaxe SQL compatível com a cláusula query_statement, consulte Sintaxe de consulta SQL padrão.

Para modelos de fatoração de matrizes, o query_statement precisa conter exatamente três colunas (user, item e rating), a menos que o usuário especifique um DATA_SPLIT_METHOD que exija o uso de DATA_SPLIT_COL.

Entradas compatíveis

A instrução CREATE MODEL aceita os seguintes tipos de dados para as colunas de usuário, item e classificação.

Tipos de dados compatíveis com entradas de modelo de fatoração de matrizes

O BigQuery ML é compatível com diferentes tipos de dados SQL padrão em colunas de entrada para fatoração de matrizes. Os tipos de dados compatíveis para cada coluna são:

Matrix factorization input column Supported types
user Qualquer tipo de dados agrupável
item Qualquer tipo de dados agrupáveis
rating INT64
NUMERIC
FLOAT64

Outras informações sobre os tipos de feedback

Uma parte importante da criação de um bom modelo de fatoração de matrizes para recomendações é garantir que os dados sejam treinados com o algoritmo mais adequado. No caso dos modelos de fatoração de matrizes, há duas maneiras diferentes de conseguir uma classificação para um par de usuário e item.

As classificações que o usuário precisou inserir e definir são consideradas um feedback explícito. Uma classificação explícita baixa tende a sugerir que o usuário tem sentimentos negativos com relação a um determinado item, enquanto uma classificação explícita alta sugere que o usuário gostou do item. Sites de streaming de filmes em que os usuários dão notas (classificações) são exemplos de conjuntos de dados explicitamente rotulados. Em problemas de feedback explícito, usamos o algoritmo de mínimos quadrados alternados (também chamado de ALS, na sigla em inglês). O ALS procura minimizar a seguinte função de perda:

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

Em que

\(r_{ui} = \) nota ou classificação que o usuário \(u\) deu ao item \(i\);
\(x_u = \) vetor de ponderação de fatores latentes para o usuário \(u\). É o tamanho de NUM_FACTORS;
\(y_i = \) vetor de ponderação de fatores latentes para o item \(i\). É o tamanho de NUM_FACTORS;
\(\lambda = \) L2_REG.

No entanto, na maioria das vezes, os dados raramente são rotulados pelos usuários. Muitas vezes, a única métrica que uma empresa tem sobre se um usuário gostou ou não de um item ou filme é a taxa de cliques ou o tempo de engajamento. Geralmente, isso pode ser usado como uma classificação substituta, mas nem sempre é uma indicação definitiva da opinião do usuário. Os dados nesses conjuntos de dados são considerados como feedback implícito. Em problemas de feedback implícito, usamos uma variante desse algoritmo chamada de mínimos quadrados ponderados alternados (WALS, na sigla em inglês), que está descrita em http://yifanhu.net/PUB/cf.pdf (em inglês). Essa abordagem usa tais classificações substitutas e as trata como confiança de uma observação dada por um usuário a um item. O algoritmo WALS procura minimizar a seguinte função de perda:

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

Além das variáveis definidas acima, a função também introduz as seguintes variáveis, em que:

\(p_{ui} = 1\) quando \(r_{ui} > 0\) e \(p_{ui} = 0\) quando \(r_{ui} < 0\);
\(c_{ui} = 1 + \alpha r_{ui}\);
\(\alpha = \) WALS_ALPHA.

Na fatoração de matrizes explícita, a entrada normalmente é um número inteiro dentro de um intervalo fixo conhecido. Já na fatoração de matrizes implícita, as classificações de entrada podem ser duplicações ou números inteiros que fazem parte de um intervalo mais amplo. Recomendamos que você verifique se não há outliers nas classificações de entrada e que as dimensione se o modelo tiver um desempenho insatisfatório.

Limitações conhecidas

As instruções CREATE MODEL para modelos de fatoração de matrizes precisam obedecer às seguintes regras:

  •  Se o erro "O modelo é muito grande (mais de 100 MB)" for gerado, verifique os dados de entrada. Isso é causado quando há muitas classificações para apenas um usuário ou item. Fazer hash das colunas de usuário ou item para um valor INT64 ou reduzir o tamanho dos dados pode ajudar. Há uma fórmula geral para determinar se isso ocorrerá:

    max(num_rated_user, num_rated_item) < 100 million

    Em que num_rated_user é o número máximo de classificações de item inseridas por um usuário e num_rated_items é o número máximo de classificações de usuário para um determinado item.

Exemplos de CREATE MODEL

O exemplo a seguir cria modelos denominados mymodel em mydataset do projeto padrão.

Como treinar um modelo de fatoração de matrizes com feedback explícito

O exemplo abaixo cria um modelo de fatoração de matrizes com uso de feedback explícito.

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

Como treinar um modelo de fatoração de matrizes com feedback implícito

O exemplo abaixo cria um modelo de fatoração de matrizes de feedback implícito.

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

A seguir