Modelo de regressão no Ads Data Hub

As regressões logísticas e lineares são modelos de aprendizado de máquina que permitem gerar previsões significativas com base em dados de publicidade.

  • A regressão linear cria uma função para ajustar uma linha aos dados de modo a diminuir a distância entre os pontos de dados e a linha. Esse modelo pode ser usado para prever um valor numérico com base em entradas, como a previsão do valor da vida útil de um usuário de acordo com as compras, interações anteriores etc.
  • A regressão logística é usada em problemas de classificação preditiva. O modelo pode ser de dois tipos, dependendo de quantas variáveis você fornece:
    • A regressão logística binária responde a perguntas com "sim/não", como a probabilidade de ocorrer um evento de conversão.
    • A regressão logística multiclasse é usada para prever vários valores possíveis. Por exemplo, determinar se um cliente é de "valor baixo", "médio" ou "alto".

As regressões logísticas e lineares aprendem com os dados de treinamento (neste caso, dados de anúncios), disponibilizando a você um modelo preditivo para tomar decisões de publicidade. Geralmente, fornecer mais dados e garantir que eles sejam de alta qualidade aprimora a precisão do modelo. Ambos os modelos têm uma performance melhor quando recebem dados de treinamento em cluster.

Privacidade diferencial

As regressões logísticas e lineares usam a privacidade diferencial, que é um sistema diferente de verificações usado por outras operações no Ads Data Hub. A privacidade diferencial garante a privacidade do usuário final injetando ruído nos resultados durante o processo de treinamento. Esse nível de ruído permanece baixo o suficiente para que os resultados finais ainda sejam úteis, mas alto o suficiente para que os usuários finais não sejam identificados. Além disso, o ruído não é determinístico, ou seja, os resultados têm um nível inconsistente dele, garantindo ainda mais a privacidade do usuário final.

Limitação de consultas

Há um limite de 100 consultas de modelos de regressões logísticas e lineares por "dia de dados" ao usar o EPSILON_PER_MODEL padrão. "Dia de dados" são os eventos gerados em um determinado dia. Esses eventos correspondem às datas de início e término fornecidas ao executar a consulta, além das datas de início e término usadas na criação das tabelas utilizadas na consulta, como as tabelas temporárias de treinamento. Isso significa que os dados de um dia podem ser usados em, no máximo, 100 modelos. Se você especificar um valor de EPSILON_PER_MODEL maior que o padrão, vai poder criar menos modelos, mas a qualidade deles será maior. Se você escolher valores menores de EPSILON_PER_MODEL, vai poder treinar mais modelos, mas eles terão qualidade inferior.

Como funciona

O fluxo de trabalho segue estas etapas essenciais:

  1. Preparação de dados de treinamento.
  2. Criação de um modelo.
  3. Coleta de insights do modelo.

Preparação de dados de treinamento

Como mencionado acima, o uso de conjuntos de dados maiores e de alta qualidade geralmente leva a melhores resultados. Além disso, como os dados de entrada são ajustados usando escalonamento mínimo e máximo, os dados em cluster esparsos ou com outliers significativos podem afetar negativamente o modelo movendo a média.

Por padrão, o Ads Data Hub seleciona aleatoriamente 18% dos seus dados de treinamento para usar na validação. A porcentagem de dados usada na validação pode ser controlada pela opção data_split_eval_fraction.

Criação de um modelo

Especifique parâmetros e dados de entrada para treinar seu modelo.

Práticas recomendadas

Um dos fatores mais importantes na qualidade de um modelo é o tamanho do conjunto de treinamento. No entanto, o tamanho/qualidade vai ser diferente dependendo do problema e dos fatores listados abaixo. Conte sua experiência. * Notamos precisão > 0,70 em modelos de regressão logística criados com base em conjuntos de treinamento que têm pelo menos 100.000 usuários. * Vimos que o valor R ao quadrado > 0,70 para modelos de regressão linear criados com base em conjuntos de treinamento que têm pelo menos 800.000 usuários.

Há outros fatores que podem reduzir a qualidade de um modelo. * Modelos logísticos em que uma classe é muito mais representada do que as outras. De maneira específica, quando um rótulo tem poucos usuários do conjunto de treinamento, ter muitos deles com outros rótulos não vai aumentar muito a precisão do modelo no rótulo pequeno. Por exemplo, 20.000 e 1.000 usuários do conjunto de treinamento para dois rótulos é pior do que 10.000 e 2.000. * Dados de recursos que não fornecem um indicador forte para os rótulos. * Dados brutos que precisam de engenharia de atributos mais extensa. Por exemplo, alguns campos podem ter um número muito grande de valores possíveis. Uma forma de melhorar os dados desse tipo é transformar os valores em um recurso com um número menor de categorias ou buckets.

Coleta de insights

É possível chamar funções para avaliar a performance do modelo com dados de validação, inspecionar recursos e informações sobre iterações de treinamento (como os pesos subjacentes usados por um modelo durante a previsão) e estimar dados não vistos.

Instrução CREATE MODEL

CREATE MODEL cria um modelo com o nome e o conjunto de dados especificados. Se o nome do modelo já existir, CREATE MODEL vai substituir o atual.

Sintaxe de CREATE MODEL

CREATE MODEL
model_name
OPTIONS
(
  // model_option_list:
  // Required parameter.
  MODEL_TYPE = { 'ADH_LINEAR_REGRESSION' | 'ADH_LOGISTIC_REGRESSION'}

  // Optional tuning parameters.
  [, L1_REG = float64_value ]
  [, L2_REG = float64_value ]
  [, DATA_SPLIT_EVAL_FRACTION = float64_value ]
  [, OPTIMIZE_STRATEGY = { 'AUTO_STRATEGY' | 'BATCH_GRADIENT_DESCENT' |
                           'NORMAL_EQUATION' } ]
  [, MAX_ITERATIONS = int64_value ]
  [, LEARN_RATE_STRATEGY = { 'LINE_SEARCH' | 'CONSTANT' } ]
  [, LEARN_RATE = float64_value ]
  [, EARLY_STOP = { TRUE | FALSE } ]
  [, MIN_REL_PROGRESS = float64_value ]
  [, LS_INIT_LEARN_RATE = float64_value ]
  [, EPSILON_PER_MODEL = float64_value ]
  [, AUTOMATIC_IMPUT_SCALING = bool_value ]
  [, MIN_MAX_SCALED_COLS = [string_value, string_value... ] ]
  [, STANDARD_SCALED_COLS = [string_value, string_value... ] ]
  [, QUANTILE_BUCKETIZED_COLS = [
        STRUCT(string_value AS col_name, int64_value AS num_buckets), 
       STRUCT(string_value AS col_name, int64_value AS num_buckets)... ] ]
)
AS query_statement

model_name

Um nome alfanumérico, que inclui sublinhados e traços. Não é possível incluir pontos. Se o nome do modelo fornecido já existir, o modelo mais antigo será substituído.

query_statement

Especifica a consulta SQL padrão usada para gerar os dados de treinamento. Se você estiver criando vários modelos usando os mesmos dados de treinamento, crie uma tabela temporária com esses dados e faça referência a ela aqui. Essa tática evita possíveis erros na verificação de diferenças devido a exclusão permanente ou spam atrasado.

model_option_list

model_type

A única opção obrigatória. Pode ser "adh_linear_regression" ou "adh_logistic_regression"

l1_reg

(Opcional) Quantidade de regularização L1 aplicada. Essa regularização penaliza as ponderações na proporção à soma dos valores absolutos delas. Pode ser qualquer número não negativo. O padrão é zero.

l2_reg

(Opcional) Quantidade de regularização L2 aplicada. Essa regularização penaliza as ponderações na proporção à raiz quadrada da soma dos quadrados delas. Pode ser qualquer número não negativo. O padrão é zero.

data_split_eval_fraction

(Opcional) Precisa estar entre 0,01 e 0,99, e o padrão é 0,18. Determina a fração de dados que termina no conjunto de avaliação. Isso afeta a precisão do modelo, reduzindo o número de linhas que acabam no modelo, mas também aumenta o número de modelos que um usuário pode executar. Confira um gráfico dessa relação, supondo que TODO modelo em um determinado conjunto de dados tem a mesma fração:

Fração de validação Consultas permitidas
0,01 7
0,1 8
0,15 8
0,18 9
0,2 9
0,3 10
0,5 14
0,9 50

optimize_strategy

(Opcional) Estratégia para treinar modelos de regressão linear.

Argumentos

"AUTO_STRATEGY" determina a estratégia de treinamento desta maneira:

  • Se l1_reg ou warm_start estiver especificado, a estratégia batch_gradient_descent vai ser usada.
  • Se o total de cardinalidades dos recursos de treinamento for superior a 10.000, a estratégia batch_gradient_descent vai ser usada.
  • Se houver um problema de overfitting (o número de exemplos de treinamento for menor que 10, a cardinalidade total), a estratégia batch_gradient_descent vai ser usada.
  • A estratégia NORMAL_EQUATION vai ser usada para todos os outros casos.

"BATCH_GRADIENT_DESCENT" (somente logística) treina o modelo usando o método do gradiente descendente em lote, que otimiza a função de perda usando a gradiente.

"NORMAL_EQUATION" (somente linear) calcula diretamente a solução menos quadrada do problema de regressão linear com a fórmula analítica. A equação normal não pode ser usada quando:

  • l1_reg é especificado.
  • warm_start é especificado.
  • a cardinalidade total dos recursos de treinamento é maior que 10.000.
  • O valor padrão é "AUTO_STRATEGY".

max_iterations

(Opcional) O número de iterações ou etapas de treinamento. Como essa consulta cria uma árvore para cada iteração, esse também é o número de árvores. Precisa ser um número inteiro maior que 1. O padrão é 20.

learn_rate_strategy

(Opcional, somente logística) Estratégia para especificar a taxa de aprendizado durante o treinamento.

Argumentos

"LINE_SEARCH" usa o método de pesquisa linear para calcular a taxa de aprendizado. A taxa de aprendizado inicial da pesquisa linear é o valor especificado para LS_INIT_LEARN_RATE.

  • A pesquisa linear desacelera o treinamento e aumenta o número de bytes processados, mas geralmente converge mesmo que a taxa de aprendizado inicial especificada seja maior.

"CONSTANT" define a taxa de aprendizado com o valor especificado para LEARN_RATE.

O valor padrão é "LINE_SEARCH".

learn_rate

(Opcional, somente logística) A taxa de aprendizado do gradiente descendente quando LEARN_RATE_STRATEGY é definido como CONSTANT. Se LEARN_RATE_STRATEGY for definido como "LINE_SEARCH", vai ser retornado um erro.

Argumentos

float64_value pode ser qualquer número de pontos flutuantes de 64 bits. O padrão é 0,1 (10%).

early_stop

(Opcional) 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

TRUE para "sim", FALSE para "não". O valor padrão é TRUE.

min_rel_progress

(Opcional) Melhoria mínima de perda relativa, necessária para continuar o treinamento quando EARLY_STOP for definido como verdadeiro. 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.

Argumentos

float64_value pode ser qualquer número de pontos flutuantes de 64 bits. O padrão é 0,1 (10%).

ls_init_learn_rate

(Opcional) Define a taxa de aprendizado inicial que LEARN_RATE_STRATEGY='LINE_SEARCH' usa. Esta opção só pode ser usada quando LINE_SEARCH é especificado.

Se a LEARN_RATE do modelo parecer estar dobrando a 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 ideal é diferente para cada modelo. Uma taxa de aprendizado inicial pode ser boa para um modelo e não para outro.

Argumentos

float64_value pode ser qualquer número de pontos flutuantes de 64 bits.

epsilon_per_model

(Opcional) Especifica o valor do orçamento de privacidade a ser usado para treinar esse modelo. Cada cliente de dados de anúncios recebe um orçamento de privacidade de 10,0 por dia de dados. Um modelo treinado com sucesso vai gastar EPSILON_PER_MODEL do orçamento para cada dia de dados no período especificado ao executar a consulta. Usar o valor padrão de ln(3)/10 permite a criação de cerca de 100 modelos. Se você usar um valor mais alto, vai poder criar menos modelos, mas eles terão qualidade maior. Se você usar um valor menor, vai poder criar mais modelos de qualidade inferior.

Argumentos

float64_value pode ser qualquer número positivo de ponto flutuante de 64 bits menor que ln(3), que é aproximadamente 1,0986. O padrão é ln(3)/10.

automatic_input_scaling

(Opcional) Quando TRUE, todas as colunas de atributos numéricos vão ter min_max_scaling aplicados de forma automática, como se os nomes das colunas fossem chamados de maneira explícita na opção min_max_scaled_cols, exceto as colunas que foram chamadas explicitamente nas opções standard_scaled_cols ou quantile_bucketized_cols.

Argumentos

bool_value é um BOOL, e o valor padrão é TRUE.

min_max_scaled_cols

(Opcional) Ajuste cada uma das colunas de atributos numeric_expression especificadas no intervalo de 0 a 1, limitadas por MIN e MAX em todas as linhas. Os mesmos MIN e MAX são usados de forma automática na previsão. Se os dados de previsão estiverem fora do intervalo MIN e MAX, eles serão limitados a 0 ou 1.

Argumentos

Matriz de string_value, em que cada string_value é uma STRING que representa o nome da coluna que vai ser transformada.

standard_scaled_cols

(Opcional) Padroniza as colunas de atributos numerical_expression especificadas em todas as linhas. Os STDDEV e MEAN calculados para padronizar a expressão são usados de maneira automática na previsão.

Argumentos

Matriz de string_value, em que cada string_value é uma STRING que representa o nome da coluna que vai ser transformada.

quantile_bucketized_cols

Agrupe as colunas de atributos numéricos contínuas especificadas em uma STRING, com o nome do bucket como o valor baseado em quantis. Os mesmos quantis são usados de maneira automática na previsão.

Argumentos

Matriz de STRUCT(string_value AS col_name, int64_value AS num_buckets), em que cada string_value é uma STRING que representa o nome da coluna numérica contínua que vai ser transformada e cada int64_value é o número de buckets em que os valores numéricos vão ser divididos.

Validação

  • Cada dia de dados no período especificado para esta consulta precisa ter orçamento de privacidade suficiente, ou seja, um valor superior a EPSILON_PER_MODEL, senão a consulta vai falhar.
  • Os parâmetros de ajuste opcionais, se especificados, vão ser validados para os intervalos mostrados acima.
  • Somente o único parâmetro model_type obrigatório precisa ser especificado de forma explícita.
  • Uma coluna no conjunto de treinamento precisa ter o nome "rótulo". No momento, não é possível usar vários rótulos.
  • A coluna de rótulos não pode conter valores NULL. Se a coluna de rótulos contiver valores NULL, a consulta vai falhar.
  • Nenhuma das colunas de atributos pode ser derivada de user_id.
  • Cada linha precisa representar de maneira exata um usuário único. Uma linha não pode representar dados de mais de um usuário. Isso pode acontecer com determinadas mesclagens, por exemplo, CORRELAÇÃO.
  • Nenhum usuário pode estar em duas linhas separadas.
  • Por motivos de privacidade, apenas as opções descritas na seção de sintaxe podem ser usadas. No momento, outras opções encontradas na documentação de consulta BQML CREATE MODEL não são compatíveis.

Funções de avaliação

ML.EVALUATE

Use a função ML.EVALUATE para avaliar as métricas do modelo. A função ML.EVALUATE pode ser usada com modelos de regressão linear ou logística.

SELECT
  *
FROM ML.EVALUATE(MODEL `linear_model_test`);

ML.ROC_CURVE

Use a função ML.ROC_CURVE para avaliar métricas específicas da regressão logística. ML.ROC_CURVE só avalia modelos desse tipo de regressão.

SELECT
  *
FROM ML.ROC_CURVE(MODEL `logistic_model_test`);

Funções de previsão

ML.PREDICT

A função ML.PREDICT pode ser usada para prever resultados usando o modelo. Os resultados gerados com ML.PREDICT estão sujeitos às mesmas verificações de privacidade que outros no Ads Data Hub. Saiba mais sobre as verificações de privacidade.

Regressão linear

/* This example outputs the average value for labels that the model predicted */
SELECT
  AVG(predicted_label) AS average_predicted_label
FROM
  ML.PREDICT(MODEL `linear_model_test`, TABLE tmp.linear_training_set);

Regressão logística

/* This example outputs the model's prediction and probabilities for said prediction over individual users. It groups by label and prediction, counting the number of users in each prediction */
SELECT
  label,
  predicted_label, /* one of the two input labels, depending on which label has the higher predicted probability */
  COUNT(*) AS num /* a tally of users */
FROM
  ML.PREDICT(MODEL `logistic_model_test`, TABLE tmp.logistic_training_set)
GROUP BY 1, 2;

Funções de inspeção de modelo e recurso

ML.TRAINING_INFO

A função ML.TRAINING_INFO permite consultar informações sobre as iterações de treinamento de um modelo.

SELECT
  *
FROM ML.TRAINING_INFO(MODEL `logistic_model_test`);

ML.FEATURE_INFO

A função ML.FEATURE_INFO permite que você consulte informações sobre os recursos de entrada usados para treinar um modelo.

SELECT
  *
FROM ML.FEATURE_INFO(MODEL `logistic_model_test`);

ML.WEIGHTS

A função ML.WEIGHTS permite que você consulte os pesos subjacentes usados por um modelo durante a previsão.

SELECT
  *
FROM ML.WEIGHTS(MODEL `linear_model_test`);

Exemplos

Criação de modelo

Todos os exemplos a seguir usam a tabela de amostra natality para demonstrar como criar um modelo.

Como treinar dados em seleção interna (linear)

O exemplo a seguir usa o peso de nascimento, gênero, semanas de gestação, idade da mãe e raça da mãe para prever o peso de nascimento de uma criança.

CREATE MODEL `natality_model`
OPTIONS
  (model_type='adh_linear_regression') AS
SELECT
  weight_pounds as label,
  is_male,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL

Como treinar dados em seleção interna (logística)

O exemplo a seguir usa o peso de nascimento, gênero, semanas de gestação, idade da mãe e raça da mãe para prever o gênero de uma criança.

CREATE MODEL `natality_model`
OPTIONS
  (model_type='adh_logistic_regression') AS
SELECT
  weight_pounds,
  is_male as label,
  gestation_weeks,
  mother_age,
  CAST(mother_race AS string) AS mother_race
FROM
  `bigquery-public-data.samples.natality`
WHERE
  weight_pounds IS NOT NULL