Modelagem de regressão no Ads Data Hub

A regressão linear e a regressão logística são modelos de aprendizagem automática que permitem gerar previsões significativas a partir de dados de publicidade.

  • A regressão linear cria uma função para ajustar uma linha aos dados de modo que a distância entre os pontos de dados e a linha seja minimizada. Em seguida, este modelo pode ser usado para prever um valor numérico baseado em entradas, como prever o valor do cliente de um utilizador com base em compras, interações anteriores, etc.
  • A regressão logística é usada para problemas de classificação preditiva. O modelo pode ser um de 2 tipos, consoante o número de variáveis que fornecer:
    • A regressão logística binária responde a perguntas de "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, como determinar se um cliente é de "valor baixo", "valor médio" ou "valor elevado".

A regressão linear e a regressão logística aprendem com os dados de preparação (neste caso, os seus dados de publicidade), o que lhe oferece um modelo preditivo para tomar decisões de publicidade. Geralmente, fornecer mais dados e garantir que os dados fornecidos são de alta qualidade melhora a precisão do modelo. Ambos os modelos têm um melhor desempenho quando são fornecidos dados de preparação em grupos mais compactos.

Privacidade diferencial

A regressão linear e a regressão logística usam a privacidade diferencial, que é um sistema de verificações de privacidade diferente do usado por outras operações no Ads Data Hub. A privacidade diferencial garante a privacidade do utilizador final ao injetar ruído nos resultados durante o processo de preparação. Este nível de ruído permanece suficientemente baixo para que os resultados finais sejam úteis, mas suficientemente elevado para que não seja possível identificar os utilizadores finais. Além disso, o nível de ruído não é determinístico, pelo que os resultados têm um nível de ruído inconsistente, o que também garante a privacidade do utilizador final.

Limitação de consultas

Quando usa o EPSILON_PER_MODEL predefinido, tem um limite de 100 consultas de modelagem de regressão linear e regressão logística por "dia de dados". Dia de dados refere-se a eventos gerados num determinado dia. Estes eventos correspondem às datas de início e de fim que fornece ao executar a consulta, bem como às datas de início e de fim usadas ao criar as tabelas que a consulta usa, como as tabelas temporárias utilizadas na preparação. Isto significa que não é possível usar dados de 1 dia em mais de 100 modelos. Se optar por especificar um valor de EPSILON_PER_MODEL superior à predefinição, poderá criar menos modelos, mas terão maior qualidade. Se escolher valores inferiores de EPSILON_PER_MODEL, pode treinar mais modelos, mas terão menor qualidade.

Como funciona

O fluxo de trabalho segue estes passos essenciais:

  1. Organize os dados de preparação.
  2. Crie um modelo.
  3. Obtenha informações do modelo.

Organize os dados de preparação

Conforme mencionado acima, a utilização de conjuntos de dados maiores e de alta qualidade costuma resultar em melhores resultados. Além disso, uma vez que os dados de entrada são dimensionados com base na escala mínima-máxima, os dados em grupos mais dispersos ou os dados com discrepâncias significativas podem afetar negativamente o modelo ao mover a média.

Por predefinição, o Ads Data Hub seleciona aleatoriamente 18% dos dados de preparação para usar na validação. A percentagem de dados usada para a validação pode ser controlada pela opção data_split_eval_fraction.

Crie um modelo

Especifique os parâmetros e os dados de entrada para preparar o modelo.

Práticas recomendadas

Um dos fatores mais importantes na qualidade de um modelo é o tamanho do conjunto de preparação. No entanto, o compromisso entre o tamanho e a qualidade será diferente consoante o problema e os fatores apresentados abaixo. Conte-nos a sua experiência. * Verificámos uma precisão superior a 0,70 em modelos de regressão logística criados a partir de conjuntos de preparação com, pelo menos, 100 000 utilizadores. * Verificámos um valor de r ao quadrado superior a 0,70 em modelos de regressão linear criados a partir de conjuntos de preparação com, pelo menos, 800 000 utilizadores.

Existem outros fatores que podem reduzir a qualidade de um modelo. * Modelos de logística em que uma classe é muito mais representada do que a outra. Especificamente, quando uma etiqueta tem poucos utilizadores no conjunto de preparação, é provável que ter muitos utilizadores no conjunto de preparação não contribua muito para a precisão do modelo na etiqueta pequena. Por exemplo, haver 20 000 e 1000 utilizadores no conjunto de preparação para duas etiquetas é pior do que haver 10 000 e 2000. * Dados de funcionalidades que não fornecem um sinal forte para as etiquetas. * Dados não processados que precisam de uma engenharia de funcionalidades mais abrangente. Por exemplo, alguns campos podem ter um número muito elevado de valores possíveis. Uma forma de melhorar os dados deste tipo é transformar os valores numa funcionalidade com um número mais pequeno de categorias ou contentores.

Recolha estatísticas

Pode chamar funções para avaliar o desempenho do modelo em dados de validação, inspecionar funcionalidades e informações sobre iterações de preparação (como as ponderações subjacentes usadas por um modelo durante a previsão) e fazer previsões com base em dados não visualizados.

Declaração CREATE MODEL

A declaração CREATE MODEL cria um modelo com o nome e o conjunto de dados especificados. Se o nome do modelo já existir, CREATE MODEL substitui o modelo existente.

Sintaxe 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, incluindo sublinhados e travessões. Não é possível incluir pontos. Se o nome do modelo que fornecer já existir, o modelo mais antigo será substituído.

query_statement

Especifica a consulta SQL padrão usada para gerar os dados de preparação. Se estiver a criar vários modelos com os mesmos dados de preparação, crie uma tabela temporária com os dados de preparação e faça referência à mesma aqui. Esta tática evita potenciais erros de verificação diferencial devido à limpeza ou ao spam atrasado.

model_option_list

model_type

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

l1_reg

(Opcional) A quantidade de regularização L1 aplicada. A regularização L1 penaliza as ponderações de forma proporcional à soma dos valores absolutos das ponderações. Pode ser qualquer número não negativo, predefinido para zero.

l2_reg

(Opcional) A quantidade de regularização L2 aplicada. A regularização L2 penaliza as ponderações de forma proporcional à raiz quadrada da soma dos valores ao quadrado das ponderações. Pode ser qualquer número não negativo, predefinido para zero.

data_split_eval_fraction

(Opcional) Tem de ser 0,01 e 0,99, sendo a predefinição 0,18. Determina a fração de dados que acaba no conjunto de avaliação. Isto afeta a precisão do modelo ao reduzir o número de linhas que acabam no modelo, mas também aumenta o número de modelos que um utilizador pode executar. Segue-se um gráfico dessa relação assumindo que TODOS os modelos num determinado conjunto de dados têm 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) A estratégia para preparar modelos de regressão linear.

Argumentos

"AUTO_STRATEGY" determina a estratégia de preparação da seguinte forma:

  • Se especificar l1_reg ou warm_start, é usada a estratégia batch_gradient_descent.
  • Se as cardinalidades totais das funcionalidades de preparação forem superiores a 10 000, é usada a estratégia batch_gradient_descent.
  • Se existir um problema de sobreajustamento (o número de exemplos de preparação é inferior a 10 • a cardinalidade total), é usada a estratégia batch_gradient_descent.
  • A estratégia NORMAL_EQUATION é usada em todos os outros casos.

"BATCH_GRADIENT_DESCENT" (apenas na regressão logística) prepara o modelo através do método de descida do gradiente em lote, que otimiza a função de perda com a função de gradiente.

"NORMAL_EQUATION" (apenas na regressão linear) calcula diretamente a solução menos quadrada do problema de regressão linear com a fórmula analítica. Não é possível usar a equação normal nos seguintes casos:

  • l1_reg está especificado.
  • warm_start está especificado.
  • A cardinalidade total das funcionalidades de preparação é superior a 10 000.
  • O valor predefinido é "AUTO_STRATEGY".

max_iterations

(Opcional) O número de passos ou iterações de preparação. Uma vez que esta consulta cria uma árvore para cada iteração, este é também o número de árvores. Tem de ser um número inteiro superior a 1. A predefinição é 20.

learn_rate_strategy

(Opcional, apenas na regressão logística) A estratégia para especificar a taxa de aprendizagem durante a preparação.

Argumentos

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

  • A pesquisa de linhas torna a preparação mais lenta e aumenta o número de bytes processados, mas, geralmente, converge mesmo com uma taxa de aprendizagem inicial especificada maior.

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

O valor predefinido é "LINE_SEARCH".

learn_rate

(Opcional, apenas na regressão logística) A taxa de aprendizagem da descida do gradiente quando LEARN_RATE_STRATEGY está definido como CONSTANT. Se LEARN_RATE_STRATEGY estiver definido como "LINE_SEARCH", é devolvido um erro.

Argumentos

float64_value pode ser qualquer número de vírgula flutuante de 64 bits. A predefinição é 0,1 (10%).

early_stop

(Opcional) Indica se a preparação deve ser interrompida após a primeira iteração, em que a melhoria da perda relativa é inferior ao valor especificado para MIN_REL_PROGRESS.

Argumentos

TRUE para "sim" e FALSE para "não". A predefinição é TRUE.

min_rel_progress

(Opcional) A melhoria da perda relativa mínima que é necessário para continuar a preparação quando EARLY_STOP está definido como verdadeiro. Por exemplo, um valor de 0,01 especifica que cada iteração tem de reduzir a perda em 1% para que a preparação possa continuar.

Argumentos

float64_value pode ser qualquer número de vírgula flutuante de 64 bits. A predefinição é 0,1 (10%).

ls_init_learn_rate

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

Se parecer que LEARN_RATE do modelo está a duplicar cada iteração, conforme indicado por ML.TRAINING_INFO, experimente definir LS_INIT_LEARN_RATE como a última taxa de aprendizagem duplicada. A melhor taxa de aprendizagem inicial é diferente para cada modelo. Uma boa taxa de aprendizagem inicial para um modelo pode não ser uma boa taxa de aprendizagem inicial para outro.

Argumentos

float64_value pode ser qualquer número de vírgula flutuante de 64 bits.

epsilon_per_model

(Opcional) Especifica o valor do orçamento de privacidade a usar na preparação deste modelo. Cada cliente de dados de anúncios recebe um orçamento de privacidade de 10,0 por dia de dados. Um modelo preparado com sucesso irá gastar EPSILON_PER_MODEL do orçamento para cada dia de dados no intervalo de datas especificado ao executar a consulta. A utilização do valor predefinido de ln(3)/10 permite a criação de cerca de 100 modelos. Se usar um valor superior, poderá criar menos modelos, mas serão de maior qualidade. Se usar um valor inferior, poderá criar mais modelos de menor qualidade.

Argumentos

float64_value pode ser qualquer número de vírgula flutuante de 64 bits positivo inferior a ln(3), que é cerca de 1,0986. A predefinição é ln(3)/10.

automatic_input_scaling

(Opcional) Quando é TRUE, é aplicado automaticamente min_max_scaling a todas as colunas de funcionalidades numéricas, como se os nomes das colunas fossem chamados explicitamente na opção min_max_scaled_cols, à exceção das colunas que tenham sido chamadas explicitamente nas opções standard_scaled_cols ou quantile_bucketized_cols.

Argumentos

bool_value é BOOL e o valor predefinido é TRUE.

min_max_scaled_cols

(Opcional) Dimensiona cada uma das colunas de funcionalidades numerical_expression especificadas no intervalo de 0 a 1, limitado por MIN e MAX em todas as linhas. Os mesmos MIN e MAX são usados automaticamente na previsão. Se os dados da previsão estiverem fora do intervalo MINMAX, estão limitados a 0 ou 1.

Argumentos

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

standard_scaled_cols

(Opcional) Padroniza as colunas de funcionalidades numerical_expression especificadas em todas as linhas. STDDEV e MEAN, calculados para padronizar a expressão, são usados automaticamente na previsão.

Argumentos

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

quantile_bucketized_cols

Agrupa em forma de contentor as colunas de funcionalidade numéricas contínuas especificadas numa STRING com o nome do contentor como o valor baseado em quantis. Os mesmos quantis são usados automaticamente 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 a ser transformada e cada int64_value é o número de contentores em que os valores numéricos serão divididos.

Validação

  • Cada dia de dados no intervalo de datas especificado para esta consulta tem de ter um orçamento de privacidade suficiente, ou seja, mais de EPSILON_PER_MODEL para a consulta não falhar.
  • Os parâmetros de ajuste opcionais, se especificados, serão validados para os intervalos que figuram acima.
  • Só é necessário especificar explicitamente o parâmetro model_type obrigatório.
  • Uma coluna no conjunto de preparação tem de ser denominada "etiqueta". De momento, não são suportadas várias etiquetas.
  • A coluna de etiquetas não pode conter valores nulos. Se a coluna de etiquetas contiver valores nulos, a consulta falha.
  • Nenhuma das colunas de funcionalidades pode ser derivada de user_id.
  • Cada linha tem de representar exatamente um utilizador único. Uma linha não pode representar dados de mais do que um utilizador. Isto pode acontecer com determinadas junções, como, por exemplo, uma UNIÃO CRUZADA.
  • Nenhum utilizador pode estar em duas linhas separadas.
  • Por motivos de privacidade, só é possível usar as opções descritas na secção de sintaxe. De momento, outras opções que possa encontrar na documentação de consultas BQML CREATE MODEL não são suportadas.

Funções de avaliação

ML.EVALUATE

Use a função ML.EVALUATE para avaliar métricas do modelo. A função ML.EVALUATE pode ser usada com modelos de regressão linear ou de regressão 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 apenas avalia modelos de regressão logística.

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

Funções de previsão

ML.PREDICT

Pode usar a função ML.PREDICT para prever resultados com o modelo. Os resultados obtidos com ML.PREDICT estão sujeitos às mesmas verificações de privacidade que os outros resultados 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 modelos e funcionalidades

ML.TRAINING_INFO

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

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

ML.FEATURE_INFO

A função ML.FEATURE_INFO permite ver informações acerca das funcionalidades de entrada usadas para preparar um modelo

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

ML.WEIGHTS

A função ML.WEIGHTS permite ver as ponderações subjacentes usadas por um modelo durante a previsão.

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

Exemplos

Crie um modelo

Os exemplos seguintes usam a tabela de amostras natality para demonstrar como criar um modelo.

Dados de preparação na seleção interna (linear)

O exemplo seguinte usa o peso ao nascer, o género, as semanas de gestação, bem como a idade e a raça da mãe, para prever o peso de uma criança ao nascer.

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

Dados de preparação na seleção interna (logística)

O exemplo seguinte usa o peso ao nascer, o género, as semanas de gestação, bem como a idade e a 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