Instrução CREATE MODEL

Modelos no BigQuery ML

Um modelo no BigQuery ML representa o que um sistema de ML aprendeu com os dados de treinamento.

Dois tipos de modelos são compatíveis com o BigQuery ML:

  • Regressão linear para previsão - por exemplo, as vendas de um item em determinado dia. Os rótulos têm valor real e não podem ser +/-infinito ou NaN.
  • Regressão logística binária para classificação - por exemplo, determinar se um cliente fará uma compra. Os rótulos somente podem ter dois valores possíveis.

No BigQuery ML, um modelo pode ser usado com dados de vários conjuntos de dados do BigQuery para treinamento e previsão.

Quando você cria um modelo, as variáveis categóricas, do tipo BOOL, STRING, BYTES, DATE, DATETIME ou TIME, são codificadas como one-hot por padrão, durante o treinamento e a previsão.

Por padrão, TIMESTAMP não é codificado como one-hot atualmente. Use a função CAST para converter as colunas TIMESTAMP em STRING para que o BigQuery ML trate a coluna como categórica.

Para recursos codificados, cada valor de coluna é uma matriz de estruturas, no seguinte formato: [<String_Value, Weight>]. O comprimento da matriz é a cardinalidade (número de valores) desse recurso. Um recurso é uma variável de entrada usada para fazer uma previsão.

Por padrão, variáveis numéricas, do tipo NUMERIC, FLOAT64 ou INT64, são padronizadas. Além disso, a padronização é aplicada automaticamente durante a previsão.

Instrução CREATE MODEL

Para criar um modelo no BigQuery, use a instrução BigQuery ML CREATE MODEL. Essa instrução é semelhante à instrução DDL CREATE TABLE. Quando você executa uma consulta SQL padrão em que há uma instrução CREATE MODEL, é gerado um job de consulta que processa a consulta.

Limitações do CREATE MODEL

As instruções CREATE MODEL do BigQuery ML estão sujeitas às seguintes limitações:

  • Quando você usa uma instrução CREATE MODEL, é preciso que o tamanho do modelo seja de até 90 MB, ou a consulta apresentará falha. Geralmente, se todas as variáveis categóricas forem strings curtas, haverá compatibilidade para uma cardinalidade de recurso total (dimensão do modelo) de 5-10 MB. A dimensionalidade é dependente da cardinalidade e do comprimento das variáveis de string.
  • Quando você usa uma instrução CREATE MODEL, a coluna de rótulos não pode conter valores "NULL". Se a coluna de rótulos contiver valores NULL, a consulta falhará.
  • Atualmente, a cláusula CREATE MODEL IF NOT EXISTS sempre atualiza o último carimbo de data/hora modificado de um modelo.
  • Atualmente, não há compatibilidade para a cláusula CREATE OR REPLACE MODEL na região de Tóquio.
  • Não há compatibilidade ara instruções CREATE MODEL que usam a opção warm_start na região de Tóquio.

Sintaxe CREATE MODEL

{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL}
model_name
[OPTIONS(model_option_list)]
[AS query_statement]

em que:

{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL} é uma das seguintes instruções:

  • CREATE MODEL - cria e treina um novo modelo no conjunto de dados especificado. Se o nome do modelo existir, CREATE MODEL retornará um erro. A menos que você especifique opções de divisão, o conjunto de dados de treinamento é automaticamente dividido em dados de treinamento e de avaliação.
  • CREATE MODEL IF NOT EXISTS - cria e treina novo modelo apenas se não existir um no conjunto de dados especificado.
  • CREATE OR REPLACE MODEL - cria e treina um modelo e substitui um modelo existente com o mesmo nome no conjunto de dados especificado.

É preciso que as instruções CREATE MODEL obedeçam às seguintes regras:

  • Apenas uma instrução CREATE é permitida.
  • Para modelos de regressão linear, é preciso que a coluna label tenha valor real (os valores das colunas não podem ser +/- infinito ou NaN).
  • Para modelos de regressão logística, é preciso que a coluna de rótulos tenha apenas dois valores distintos.
  • Na model_option_list, a opção model_type é obrigatória. Todas as outras são opcionais.

model_name

model_name é o nome do modelo que você está criando ou substituindo. O nome do modelo precisa ser exclusivo por conjunto de dados. É preciso que o nome do modelo siga as mesmas regras de nomenclatura de uma tabela do BigQuery. Um nome de modelo pode:

  • conter até 1.024 caracteres;
  • conter letras (maiúsculas e minúsculas), números e sublinhados.

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

Se você não tiver um projeto padrão já configurado, adicione o código do projeto ao nome do modelo, no seguinte formato: `[PROJECT_ID].[DATASET].[MODEL]`, incluindo os acentos graves. Por exemplo, `myproject.mydataset.mymodel`.

model_option_list

A instrução model_option_list permite especificar outras opções do modelo. Para incluir várias opções, use uma lista separada por vírgulas.

Especifique uma lista de opções de tabela no seguinte formato:

NAME=VALUE, ...

NAME e VALUE precisam ser uma das combinações a seguir:

NAME VALUE Detalhes
model_type

linear_reg

logistic_reg

linear_reg cria um modelo de regressão linear.

logistic_reg cria um modelo de regressão logística.

A opção model_type é obrigatória. Todas as outras são opcionais.

input_label_cols STRING

Nome(s) da coluna de rótulo nos dados de treinamento. input_label_cols aceita uma matriz de strings, mas apenas um elemento de matriz é compatível com modelos linear_reg e logistic_reg.

Se os labels não forem especificados, a coluna denominada "rótulo" nos dados de treinamento será usada. Se nenhum deles existir, a consulta falhará.

Para modelos de regressão linear, é preciso que a coluna de rótulo tenha valor real, isto é, os valores da coluna precisam ser números reais. Para modelos de regressão logística, é preciso que a coluna de rótulo tenha apenas dois valores distintos.

l1_reg FLOAT64

Quantidade de regularização de L1 aplicada. O valor padrão é 0.

l2_reg FLOAT64

Quantidade de regularização de L2 aplicada. O valor padrão é 0.

max_iterations INT64

Número máximo de iterações de treinamento (etapas). O valor padrão é 20.

learn_rate_strategy line_search
constant

Escolha a estratégia para especificar a taxa de aprendizado durante o treinamento. O valor padrão é line_search.

A pesquisa de linha retarda o treinamento e aumenta o número de bytes processados, mas em compensação, a convergência é feita mesmo que a taxa de aprendizado inicial especificada seja maior.

Se o modelo learn_rate aparentemente estiver duplicando cada iteração (conforme indicado por ml.training_info ), tente definir ls_init_learn_rate como a última taxa de aprendizado duplicada. A taxa de aprendizado inicial ótima é diferente para cada modelo. Uma taxa de aprendizado inicial pode ser boa para um modelo e não para outro.

learn_rate FLOAT64

Taxa de aprendizado para gradiente descendente quando learn_rate_strategy for definida como constant. Se learn_rate_strategy estiver definido como line_search, será retornado um erro. O valor padrão é 0,1.

early_stop BOOL

Mostra que o treinamento deve parar após a primeira iteração em que a melhoria da perda relativa for menor que o min_rel_progress. O valor padrão é true.

min_rel_progress FLOAT64

Melhoria mínima de perda relativa, necessária para continuar o treinamento quando early_stop for definida como true. Por exemplo, com um valor de 0,01, fica especificado que as iterações precisam reduzir a perda em 1% para que o treinamento continue. O valor padrão é 0,01.

data_split_method

auto_split

random

custom

seq

no_split

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 sobreajuste por meio de parada antecipada. O valor padrão é auto_split.

random divide os dados aleatoriamente. Uma divisão aleatória é não determinística — diferentes execuções de treinamento produzem diferentes resultados de divisão.

custom divide os dados usando uma coluna BOOL (booleana) fornecida pelo cliente. As linhas com um valor booleano de "true" são usadas como dados de avaliação. As linhas com um valor "false" são usadas como dados de treinamento.

seq divide 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 são usadas como dados de treinamento. As linhas restantes (incluindo NULLs) são usadas como dados de avaliação.

no_split usa todos os dados como dados de treinamento.

Se data_split_method não for especificado ou explicitamente definido como auto_split, a estratégia de divisão automática será a seguinte:

  1. Quando houver menos de 500 linhas nos dados de entrada, todas as linhas serão usadas como dados de treinamento.
  2. Quando houver entre 500 e 50.000 linhas nos dados de entrada, 20% dos dados serão usados como dados de avaliação em uma divisão random.
  3. Quando houver mais de 50.000 linhas nos dados de entrada, somente 10.000 delas serão usadas como dados de avaliação em uma divisão random.
data_split_eval_fraction FLOAT64

Esta opção é usada com divisões random e seq. data_split_eval_fraction é a fração dos dados usados para avaliação, com precisão de duas casas decimais. O valor padrão é 0,2.

data_split_col STRING

Esta opçã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 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 falsos são usadas como dados de treinamento.

Quando data_split_method for seq, as últimas linhas data_split_fraction, da menor para a maior, na coluna correspondente serão usadas como dados de avaliação. As primeiras linhas serão usadas como dados de treinamento.

ls_init_learn_rate DOUBLE

Define a taxa de aprendizado inicial que learn_rate_strategy='line_search' usa. Esta opção só pode ser usada se line_search for especificado.

warm_start BOOL

Essa opção é usada para treinar novamente um modelo com novos dados de treinamento, novas opções de modelo ou ambos. A menos que sejam explicitamente substituídas, as opções iniciais usadas para treinar o modelo são usadas para a execução de inicialização a quente. O valor padrão é falso.

Em uma inicialização a quente, os números da iteração são redefinidos para iniciar do zero. O número training_run ou as colunas TIMESTAMP podem ser usados para distinguir a execução de inicialização a quente da execução original.

As opções model_type e labels e o esquema de dados de treinamento não podem ser alterados em uma inicialização a quente.

query_statement

Com a cláusula AS query_statement, você especifica a consulta SQL padrão usada para gerar os dados de treinamento. Para informações sobre a compatibilidade da sintaxe SQL da cláusula query_statement, consulte a página Sintaxe de consulta SQL padrão.

Todas as colunas referenciadas pela query_statement são usadas como entradas para o modelo, exceto pelas colunas incluídas em input_label_cols e data_split_col.

Exemplos de CREATE MODEL

Com a instrução CREATE MODEL é possível criar um modelo com as opções especificadas. Se o nome da tabela constar no conjunto de dados, será retornado o seguinte erro:

Already Exists: [PROJECT_ID]:[DATASET].[MODEL]

Para substituir um modelo existente, use a instrução CREATE OR REPLACE MODEL.

Os exemplos a seguir criam modelos chamados mymodel no mydataset no projeto padrão.

Como treinar um modelo de regressão linear

O exemplo a seguir cria e treina um modelo de regressão linear. A taxa de aprendizado é definida como 0,15, a regularização de L1 é definida como 1, e o número máximo de iterações de treinamento é definido como 5.

CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  ( model_type='linear_reg',
    ls_init_learn_rate=.15,
    l1_reg=1,
    max_iterations=5 ) AS
SELECT
  column1,
  column2,
  column3,
  label
FROM
  `mydataset.mytable`
WHERE
  column4 < 10

Como treinar um modelo de regressão linear com uma divisão de dados sequencial

Neste exemplo, você cria um modelo de regressão linear com uma divisão de dados sequencial. A fração de divisão é .3, e a divisão usa a coluna timestamp como base para a divisão.

CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  ( model_type='linear_reg',
    ls_init_learn_rate=.15,
    l1_reg=1,
    max_iterations=5,
    data_split_method='seq',
    data_split_eval_fraction=0.3,
    data_split_col='timestamp' ) AS
SELECT
  column1,
  column2,
  column3,
  timestamp,
  label
FROM
  `mydataset.mytable`
WHERE
  column4 < 10

Como treinar um modelo de regressão linear com uma divisão de dados personalizada

Neste exemplo, você dividiu seus dados manualmente em uma tabela de treinamento e em uma tabela de avaliação. A tabela de treinamento é denominada training_table. A tabela de avaliação é denominada evaluation_table.

Com este comando, você cria um modelo de regressão linear usando um método de divisão personalizada e treina o modelo unindo os dados das tabelas de avaliação e treinamento.

CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  ( model_type='linear_reg',
    data_split_method='custom',
    data_split_col='split_col' ) AS
SELECT
  *,
  false AS split_col
FROM
  `mydataset.training_table`
UNION ALL
SELECT
  *,
  true AS split_col
FROM
  `mydataset.evaluation_table`

Neste exemplo, todas as colunas na tabela de treinamento e na tabela de avaliação são recursos ou rótulo. A consulta usa SELECT * e UNION ALL para anexar todos os dados da coluna split_col aos dados existentes.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.