Modelización mediante regresión en el Centro de Datos de Anuncios

La regresión lineal y la regresión logística son modelos de aprendizaje automático que permiten generar predicciones valiosas a partir de datos publicitarios.

  • La regresión lineal crea una función de línea recta a lo largo de los puntos de datos de modo que la distancia entre los puntos y la línea sea la mínima. Este modelo se puede usar para predecir un valor numérico basándose en datos; por ejemplo, puede predecir el valor del tiempo de vida de un usuario según sus compras, interacciones previas, etc.
  • La regresión logística sirve para solucionar problemas de clasificación predictiva. El modelo puede ser de uno de 2 tipos, según el número de variables que proporciones:
    • La regresión logística binaria responde a preguntas que se responden con "sí o no"; por ejemplo, la probabilidad de que se produzca un evento de conversión.
    • La regresión logística multiclase sirve para predecir varios valores posibles; por ejemplo, determinar si un cliente es de "valor bajo", "valor medio" o "valor alto".

La regresión logística y la lineal aprenden de datos de entrenamiento (en este caso, tus datos publicitarios), lo que te proporciona un modelo predictivo para tomar decisiones publicitarias. Por lo general, si añades más datos y te aseguras de que los datos que proporcionas sean de alta calidad, la precisión del modelo mejorará. Ambos modelos funcionan mejor cuando se les proporcionan datos de entrenamiento en clústeres muy concentrados.

Privacidad diferencial

La regresión logística y lineal usan privacidad diferencial, que es un sistema diferente de las comprobaciones de privacidad que usan otras operaciones en el Centro de Datos de Anuncios. La privacidad diferencial protege la privacidad de los usuarios finales insertando "ruido" en tus resultados durante el proceso de entrenamiento. Este nivel de ruido se mantiene lo suficientemente bajo como para que los resultados finales sigan siendo útiles, pero lo suficientemente alto como para que no se pueda identificar a los usuarios finales. Además, el nivel de ruido no es determinista, por lo que los resultados tienen un nivel de ruido impredecible, lo que protege aún más la privacidad del usuario final.

Límite de consultas

Hay un límite de 100 consultas de modelización mediante regresión logística y lineal por día de datos cuando se usa el valor EPSILON_PER_MODEL predeterminado. El concepto "día de datos" hace referencia a los eventos generados en un día determinado. Estos eventos corresponden a las fechas de inicio y finalización que indicas al ejecutar la consulta, y a las fechas de inicio y finalización utilizadas al crear cualquier tabla que utilice tu consulta, como las tablas temporales usadas para el entrenamiento. Esto significa que los datos de 1 día se pueden usar hasta en 100 modelos. Si especificas un valor de EPSILON_PER_MODEL superior al predeterminado, podrás crear menos modelos, pero tendrán una mayor calidad. Si eliges valores más pequeños de EPSILON_PER_MODEL, podrás entrenar más modelos, pero serán de menor calidad.

Cómo funciona

El proceso incluye estos pasos fundamentales:

  1. Preparar los datos de entrenamiento.
  2. Crear un modelo.
  3. Obtener información valiosa del modelo.

Preparar los datos de entrenamiento

Como se ha mencionado anteriormente, usar conjuntos de datos más grandes y de alta calidad suele generar mejores resultados. Además, dado que los datos de entrada se escalan mediante el escalado mínimo-máximo, los datos en clústeres dispersos o los datos con valores atípicos significativos pueden cambiar la media y, en consecuencia, afectar negativamente al modelo.

De forma predeterminada, el Centro de Datos de Anuncios selecciona aleatoriamente el 18 % de los datos de entrenamiento para la validación. El porcentaje de datos que se usan para la validación se puede controlar con la opción data_split_eval_fraction.

Crear un modelo

Especifica los parámetros y los datos de entrada con los que vas a entrenar tu modelo.

Prácticas recomendadas

Uno de los factores más importantes de la calidad de un modelo es el tamaño del conjunto de entrenamiento. Sin embargo, el equilibrio entre el tamaño y la calidad variará según el problema y los factores que se indican a continuación. Te agradeceríamos que nos contaras tu experiencia. * Hemos observado una precisión superior a 0,70 en los modelos de regresión logística creados a partir de conjuntos de entrenamiento con al menos 100.000 usuarios. * Hemos observado un coeficiente de determinación superior a 0,70 en los modelos de regresión lineal creados a partir de conjuntos de entrenamiento con al menos 800.000 usuarios.

Hay otros factores que pueden reducir la calidad de un modelo. * Modelos logísticos en los que una clase está mucho más representada que las otras. En concreto, si una etiqueta tiene pocos usuarios en el conjunto de entrenamiento, es probable que tener muchos usuarios con otras etiquetas en el conjunto de entrenamiento no ayude mucho con la precisión del modelo sobre la etiqueta pequeña. Por ejemplo, un conjunto de entrenamiento con dos etiquetas de 20.000 y 1000 usuarios sería peor que uno con 10.000 y 2000. * Datos de función que no proporcionan una señal clara de las etiquetas. * Datos en bruto que necesitan una ingeniería de funciones más exhaustiva. Por ejemplo, algunos campos pueden tener un gran número de valores posibles. Una forma de mejorar los datos de este tipo es transformar los valores en una función con un número más reducido de categorías o grupos.

Obtener información valiosa

Puedes llamar a funciones para evaluar el rendimiento de tu modelo en lo relativo a los datos de validación, inspeccionar funciones e información sobre las iteraciones de entrenamiento (como las ponderaciones subyacentes que usa un modelo durante la predicción) y hacer predicciones basadas en datos que el modelo no conoce.

Instrucción CREATE MODEL

La instrucción CREATE MODEL crea un modelo con el nombre y el conjunto de datos que especifiques. Si ya hay un modelo con ese nombre, CREATE MODEL reemplaza el modelo existente.

Sintaxis 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

Nombre alfanumérico, incluidos guiones bajos y guiones. No puede incluir puntos. Si ya hay un modelo con el nombre que proporcionas, se sobrescribirá el modelo anterior.

query_statement

Especifica la consulta de SQL estándar que se utiliza para generar los datos de entrenamiento. Si vas a crear varios modelos con los mismos datos de entrenamiento, crea una tabla temporal con los datos de entrenamiento y haz referencia a ellos aquí. Esta táctica evita posibles errores de comprobación de diferencias debido a la eliminación de datos o al spam posterior.

model_option_list

model_type

(Obligatorio) La única opción obligatoria. Puede ser adh_linear_regression o adh_logistic_regression.

l1_reg

(Opcional) Cantidad de regularización L1 aplicada. La regularización L1 penaliza las ponderaciones de forma proporcional a la suma de los valores absolutos de las ponderaciones. Puede ser cualquier número no negativo; el valor predeterminado es 0.

l2_reg

(Opcional) Cantidad de regularización L2 aplicada. La regularización L2 penaliza las ponderaciones de forma proporcional a la raíz cuadrada de la suma de los cuadrados de las ponderaciones. Puede ser cualquier número no negativo; el valor predeterminado es 0.

data_split_eval_fraction

(Opcional) Debe estar comprendido entre 0.01 y 0.99; el valor predeterminado es 0.18. Determina la fracción de datos que se utilizará en el conjunto de evaluación. Esto afecta a la precisión del modelo, ya que reduce el número de filas que se utilizarán en el modelo, pero también aumenta el número de modelos que los usuarios pueden ejecutar. A continuación, se muestra un gráfico con esa relación, suponiendo que todos los modelos de un conjunto de datos determinado tengan la misma fracción:

Fracción de validación 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) Estrategia para entrenar modelos de regresión lineal.

Argumentos

AUTO_STRATEGY determina la estrategia de entrenamiento de la siguiente manera:

  • Si se especifica l1_reg o warm_start, se usa la estrategia batch_gradient_descent.
  • Si la cardinalidad total de las funciones de entrenamiento es superior a 10.000, se usa la estrategia batch_gradient_descent.
  • Si hay un problema de sobreajuste (el número de ejemplos de entrenamiento es inferior a la cardinalidad x 10), se usa la estrategia batch_gradient_descent.
  • La estrategia NORMAL_EQUATION se usa en los demás casos.

BATCH_GRADIENT_DESCENT (solo regresión logística) entrena el modelo con el método de descenso de gradiente por lotes, que optimiza la función de pérdida usando la función de gradiente.

NORMAL_EQUATION (solo regresión lineal) calcula directamente la solución de mínimos cuadrados del problema de regresión lineal con la fórmula analítica. No se puede usar la ecuación normal en los siguientes casos:

  • Se especifica l1_reg.
  • Se especifica warm_start.
  • La cardinalidad total de las funciones de entrenamiento es superior a 10.000.
  • El valor predeterminado es AUTO_STRATEGY.

max_iterations

(Opcional) Número de iteraciones o pasos del entrenamiento. Como esta consulta crea un árbol para cada iteración, también es el número de árboles. Debe ser un número entero superior a 1. El valor predeterminado es 20.

learn_rate_strategy

(Opcional, solo regresión logística) Estrategia para especificar la tasa de aprendizaje durante el entrenamiento.

Argumentos

LINE_SEARCH usa el método de búsqueda lineal para calcular la tasa de aprendizaje. La tasa de aprendizaje inicial de la búsqueda lineal es el valor especificado para LS_INIT_LEARN_RATE.

  • La búsqueda lineal ralentiza el entrenamiento y aumenta el número de bytes procesados, pero, por lo general, converge incluso con una tasa de aprendizaje inicial específica más amplia.

CONSTANT asigna la tasa de aprendizaje al valor especificado para LEARN_RATE.

El valor predeterminado es LINE_SEARCH.

learn_rate

(Opcional, solo regresión logística) Tasa de aprendizaje del descenso de gradiente cuando el valor de LEARN_RATE_STRATEGY es CONSTANT. Si LEARN_RATE_STRATEGY tiene el valor LINE_SEARCH, se devuelve un error.

Argumentos

float64_value puede ser cualquier número de punto flotante de 64 bits. El valor predeterminado es 0.1 (10 %).

early_stop

(Opcional) Indica si el entrenamiento se debe detener después de la primera iteración en la que la mejora de la pérdida relativa es inferior al valor especificado para MIN_REL_PROGRESS.

Argumentos

TRUE indica "sí" y FALSE "no". El valor predeterminado es TRUE.

min_rel_progress

(Opcional) La mejora mínima de la pérdida relativa que es necesaria para continuar con el entrenamiento cuando a EARLY_STOP se le asigna el valor verdadero. Por ejemplo, un valor de 0.01 indica que cada iteración debe reducir la pérdida en un 1 % para que el entrenamiento pueda continuar.

Argumentos

float64_value puede ser cualquier número de punto flotante de 64 bits. El valor predeterminado es 0.1 (10 %).

ls_init_learn_rate

(Opcional) Define la tasa de aprendizaje inicial que usa LEARN_RATE_STRATEGY='LINE_SEARCH'. Esta opción solo se puede usar si se especifica LINE_SEARCH.

Si ML.TRAINING_INFO parece indicar que la LEARN_RATE del modelo se duplica con cada iteración prueba a fijar LS_INIT_LEARN_RATE en la tasa de aprendizaje que se haya duplicado la última vez. La tasa de aprendizaje inicial óptima es diferente para cada modelo. Una buena tasa de aprendizaje inicial para un modelo puede no ser buena para otro.

Argumentos

float64_value puede ser cualquier número de punto flotante de 64 bits.

epsilon_per_model

(Opcional) Especifica la cantidad de presupuesto de privacidad que se utilizará para entrenar este modelo. Cada cliente con datos sobre anuncios recibe un presupuesto de privacidad de 10,0 por día de datos. Un modelo entrenado correctamente gasta EPSILON_PER_MODEL del presupuesto por cada día de datos en el intervalo de fechas especificado al ejecutar la consulta. Si usas el valor predeterminado de ln(3)/10, podrás crear alrededor de 100 modelos. Si usas un valor superior, podrás crear menos modelos, pero serán de mayor calidad. Si usas un valor inferior, podrás crear más modelos de menor calidad.

Argumentos

float64_value puede ser cualquier número de punto flotante positivo de 64 bits inferior a ln(3), que es aproximadamente 1,0986. El valor predeterminado es ln(3)/10.

automatic_input_scaling

(Opcional) Cuando es TRUE, se aplica automáticamente min_max_scaling a todas las columnas de funciones numéricas, como si los nombres de columna se mencionaran explícitamente en la opción min_max_scaled_cols, con la excepción de las columnas que se hayan designado explícitamente en las opciones standard_scaled_cols o quantile_bucketized_cols.

Argumentos

bool_value es un BOOL. El valor predeterminado es TRUE.

min_max_scaled_cols

(Opcional) Escala cada una de las columnas de funciones numerical_expression especificadas en el intervalo de 0 a 1, con un límite de MIN y MAX en todas las filas. Los mismos MIN y MAX se usan automáticamente en la predicción. Si los datos de predicción se encuentran fuera del intervalo de MIN y MAX, se limitan a 0 o 1.

Argumentos

Array de string_value, donde cada string_value es una cadena que representa el nombre de columna que se va a transformar.

standard_scaled_cols

(Opcional) Estandariza las columnas de funciones numerical_expression especificadas en todas las filas. En las predicciones se usan automáticamente STDDEV y MEAN, que se calculan para estandarizar la expresión.

Argumentos

Array de string_value, donde cada string_value es un STRING que representa el nombre de columna que se va a transformar.

quantile_bucketized_cols

Segmenta las columnas de funciones numéricas continuas especificadas en un STRING. El nombre del segmento será un valor basado en cuantiles. Los mismos cuantiles se usan automáticamente en la predicción.

Argumentos

Array de STRUCT(string_value AS col_name, int64_value AS num_buckets), donde cada string_value es un STRING que representa el nombre de la columna numérica continua que se va a transformar y cada int64_value es el número de segmentos en los que se deben dividir los valores numéricos.

Validación

  • Todos los días de datos del intervalo de fechas especificado para esta consulta deben tener suficiente presupuesto de privacidad; es decir, más de EPSILON_PER_MODEL. De lo contrario, la consulta fallará.
  • Se verificará que los parámetros de ajuste opcionales (si se especifican) no excedan los rangos enumerados anteriormente.
  • Solo se debe especificar explícitamente el parámetro model_type que se requiera.
  • Una columna del conjunto de entrenamiento debe tener el nombre "label" (etiqueta). De momento, no se admiten varias etiquetas.
  • La columna de etiqueta no puede contener valores NULL. Si la columna de etiqueta contiene valores NULL, la consulta fallará.
  • Ninguna de las columnas de funciones se puede derivar del user_id.
  • Cada fila debe representar a un solo usuario único. Una fila no puede representar datos de más de un usuario. Esto puede ocurrir con determinadas combinaciones, como una combinación cruzada.
  • Ningún usuario puede estar en dos filas distintas.
  • Por motivos de privacidad, solo se pueden utilizar las opciones descritas en la sección de sintaxis. Actualmente no se admiten otras opciones incluidas en la documentación sobre consultas CREATE MODEL de BQML.

Funciones de evaluación

ML.EVALUATE

Usa la función ML.EVALUATE para evaluar las métricas del modelo. La función ML.EVALUATE se puede usar con modelos de regresión lineal o regresión logística.

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

ML.ROC_CURVE

Usa la función ML.ROC_CURVE para evaluar métricas específicas de regresión logística. ML.ROC_CURVE solo evalúa modelos de regresión logística.

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

Funciones de predicción

ML.PREDICT

La función ML.PREDICT se puede utilizar para predecir resultados mediante el modelo. Los resultados que se obtienen con ML.PREDICT están sujetos a las mismas comprobaciones de privacidad que el resto de los resultados del Centro de Datos de Anuncios. Consulta más información sobre las comprobaciones de privacidad.

Regresión lineal

/* 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);

Regresión 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;

Funciones de inspección de funciones y modelos

ML.TRAINING_INFO

La función ML.TRAINING_INFO te permite ver información sobre las iteraciones de entrenamiento de un modelo.

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

ML.FEATURE_INFO

La función ML.FEATURE_INFO te permite ver información sobre las funciones de entrada usadas para entrenar un modelo.

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

ML.WEIGHTS

La función ML.WEIGHTS te permite ver las ponderaciones subyacentes que utiliza un modelo durante la predicción.

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

Ejemplos

Crear un modelo

En los siguientes ejemplos se usa la tabla de ejemplo de natality para ilustrar cómo se crea un modelo.

Datos de entrenamiento en selección interna (lineal)

En el siguiente ejemplo se utiliza el peso al nacer, el sexo, las semanas de gestación, la edad de la madre y la raza de la madre para predecir el peso de un bebé.

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

Datos de entrenamiento en selección interna (logística)

En el siguiente ejemplo se utiliza el peso al nacer, el sexo, las semanas de gestación, la edad de la madre y la raza de la madre para predecir el sexo de un bebé.

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