Modelado de regresión en el Centro de Datos de Anuncios

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

  • La regresión lineal crea una función para ajustar una línea a los datos de modo que se minimice la distancia entre los datos y la línea. Este modelo se puede usar para predecir un valor numérico en función de las entradas, como la predicción del valor del ciclo de vida del cliente según las compras, las interacciones anteriores, etcétera.
  • La regresión logística se usa para los problemas de clasificación predictiva. El modelo puede ser uno de 2 tipos según la cantidad de variables que proporciones:
    • La regresión logística binaria responde "sí/no". preguntas, como la probabilidad de que se produzca un evento de conversión.
    • La regresión logística multiclase se usa para predecir varios valores posibles, como determinar si un cliente tiene un "valor bajo", "valor medio" o "valor alto".

Tanto la regresión lineal como la logística aprenden de los datos de entrenamiento (en este caso, tus datos de publicidad), lo que te brinda un modelo predictivo para tomar decisiones publicitarias. En general, proporcionar más datos y asegurarse de que los que proporcionas son de alta calidad mejorará la exactitud de tu modelo. Ambos modelos funcionan mejor cuando se proporcionan datos de entrenamiento estrechamente agrupados.

Privacidad diferencial

Tanto la regresión lineal como la logística usan la privacidad diferencial, que es un sistema de verificaciones de privacidad diferente del que usan otras operaciones del Centro de Datos de Anuncios. La privacidad diferencial garantiza la privacidad del usuario final, ya que se inyecta ruido en los resultados durante el proceso de entrenamiento. Este nivel de ruido sigue siendo lo suficientemente bajo como para que los resultados finales sigan siendo útiles, pero lo suficientemente alto como para que no se puedan identificar los usuarios finales. Además, el nivel de ruido es no determinista, de modo que los resultados tienen un nivel de ruido inconsistente, lo que garantiza aún más la privacidad del usuario final.

Límite de consultas

Cuando usas el EPSILON_PER_MODEL predeterminado, tienes un límite de 100 consultas de modelado de regresión lineal y logística por "día de datos". El día de los datos se refiere a los eventos generados en un día determinado. Estos eventos corresponden a las fechas de inicio y finalización que proporcionas cuando ejecutas tu consulta y a las fechas de inicio y finalización que se usan cuando creas cualquier tabla que use tu consulta, como las tablas temporales usadas para el entrenamiento. Esto significa que los datos de 1 día no se pueden usar en más de 100 modelos. Si eliges especificar un valor de EPSILON_PER_MODEL mayor que el valor predeterminado, podrás crear menos modelos, pero tendrán una calidad más alta. Y si eliges valores más pequeños de EPSILON_PER_MODEL, puedes entrenar más modelos, pero tendrán una calidad inferior.

Cómo funciona

El flujo de trabajo sigue estos pasos esenciales:

  1. Preparar los datos de entrenamiento
  2. Crea un modelo.
  3. Recopila estadísticas del modelo.

Prepare los datos de entrenamiento

Como se mencionó anteriormente, el uso de conjuntos de datos más grandes y de alta calidad generalmente generará mejores resultados. Además, debido a que los datos de entrada se escalan a través del escalamiento mínimo o máximo, los datos agrupados de manera dispersa o los datos con valores atípicos significativos pueden afectar negativamente al modelo moviendo la media.

De forma predeterminada, el Centro de Datos de Anuncios selecciona de forma aleatoria el 18% de tus datos de entrenamiento para usarlo en 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.

Crea un modelo

Especifica parámetros y datos de entrada para entrenar tu modelo.

Prácticas recomendadas

Uno de los factores más importantes en la calidad de un modelo es el tamaño del conjunto de entrenamiento. Sin embargo, la compensación entre tamaño y calidad será diferente según el problema y los factores que se indican a continuación. Cuéntanos tu experiencia.

  • Observamos que la precisión > 0.70 para modelos de regresión logística creados a partir de conjuntos de entrenamiento con al menos 100,000 usuarios.
  • Observamos r al cuadrado > 0.70 para modelos de regresión lineal compilados a partir de conjuntos de entrenamiento con al menos 800,000 usuarios.

Existen 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 Específicamente, cuando una etiqueta tiene pocos usuarios de conjuntos de entrenamiento, tener muchos usuarios con otras etiquetas probablemente no ayude a la exactitud del modelo en la etiqueta pequeña. Por ejemplo, 20,000 & 1,000 usuarios del conjunto de entrenamiento para dos etiquetas es peor que 10,000 y 2,000.
  • Datos de atributos que no proporcionen una señal clara para las etiquetas.
  • Datos sin procesar que necesitan una ingeniería de atributos más extensa. Por ejemplo, algunos campos pueden tener una gran cantidad de valores posibles. Una forma de mejorar los datos de este tipo es transformar los valores en un atributo con una cantidad menor de categorías o buckets.

Recopila estadísticas

Puedes llamar a funciones para evaluar el rendimiento de tu modelo con respecto a los datos de validación, inspeccionar atributos y la información sobre iteraciones de entrenamiento (como los pesos subyacentes que usa un modelo durante la predicción) y predecir datos no vistos.

Declaración CREATE MODEL

La sentencia CREATE MODEL crea un modelo con el nombre y el conjunto de datos que especifiques. Si el nombre del modelo ya existe, CREATE MODEL reemplaza al modelo existente.

Sintaxis 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

Un nombre alfanumérico, que incluye guiones bajos y guiones. No se pueden incluir puntos. Si el nombre del modelo que proporcionas ya existe, se reemplazará el modelo anterior.

query_statement

Especifica la consulta de SQL estándar que se usa 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 o el spam tardío.

model_option_list

model_type

(Obligatorio) Es la única opción obligatoria. Puede ser "adh_linear_regression" o "adh_logistic_regression".

l1_reg

La cantidad de regularización L1 aplicada (opcional). La regularización L1 penaliza los pesos en proporción a la suma de los valores absolutos de los pesos. Puede ser cualquier número no negativo; el valor predeterminado es cero.

l2_reg

La cantidad de regularización L2 aplicada (opcional). La regularización L2 penaliza los pesos en proporción a la raíz cuadrada de la suma de los cuadrados de los pesos. Puede ser cualquier número no negativo; el valor predeterminado es cero.

data_split_eval_fraction

(Opcional) Debe estar entre 0 .01 y .99, con el valor predeterminado .18. Determina la fracción de datos que termina en el conjunto de evaluación. Esto afecta la exactitud del modelo, ya que reduce la cantidad de filas que terminan en el modelo, pero también aumenta la cantidad de modelos que puede ejecutar un usuario. Aquí hay un gráfico de esa relación, suponiendo que TODOS los modelos de un conjunto de datos dado tienen 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

Estrategia para entrenar modelos de regresión lineal (opcional).

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 las cardinalidades totales de los atributos de entrenamiento son superiores a 10,000, se usa la estrategia batch_gradient_descent.
  • Si hay un problema de sobreajuste (la cantidad de ejemplos de entrenamiento es menor que 10 • la cardinalidad total), se usa la estrategia batch_gradient_descent.
  • La estrategia NORMAL_EQUATION se usa para todos los demás casos.

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

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

  • Cuando se especifica l1_reg
  • Cuando se especifica warm_start
  • Cuando la cardinalidad total de los atributos de entrenamiento es de más de 10,000
  • El valor predeterminado es "AUTO_STRATEGY".

max_iterations

La cantidad de iteraciones o pasos de entrenamiento (opcional). Dado que esta consulta construye un árbol por cada iteración, esta también es la cantidad de árboles. Debe ser un número entero mayor que 1. La configuración predeterminada es 20.

learn_rate_strategy

La estrategia para especificar la tasa de aprendizaje durante el entrenamiento (opcional, solo logística).

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 de línea es el valor especificado para LS_INIT_LEARN_RATE .

  • La búsqueda de línea ralentiza el entrenamiento y aumenta la cantidad de bytes procesados, pero, por lo general, converge incluso con una tasa de aprendizaje inicial especificada más alta.

"CONSTANT" Establece la tasa de aprendizaje en el valor especificado para LEARN_RATE.

El valor predeterminado es "LINE_SEARCH".

learn_rate

La tasa de aprendizaje para el descenso de gradientes cuando LEARN_RATE_STRATEGY se establece en CONSTANT (opcional, solo logística). Si LEARN_RATE_STRATEGY se configura como "LINE_SEARCH", se muestra un error.

Argumentos

float64_value puede ser cualquier número de punto flotante de 64 bits. La configuración predeterminada es 0.1 (10%).

early_stop

Indica si el entrenamiento debe detenerse después de la primera iteración en la que la mejora de la pérdida relativa es menor que el valor especificado para MIN_REL_PROGRESS (opcional).

Argumentos

TRUE para "sí" y FALSE para "no". La configuración predeterminada es TRUE.

min_rel_progress

La mejora de pérdida relativa mínima que se necesita para continuar con el entrenamiento cuando EARLY_STOP se establece como verdadero (opcional). Por ejemplo, un valor de 0.01 especifica que cada iteración debe reducir la pérdida en un 1% para que el entrenamiento continúe.

Argumentos

float64_value puede ser cualquier número de punto flotante de 64 bits. La configuración predeterminada es 0.1 (10%).

ls_init_learn_rate

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

Si parece que el LEARN_RATE del modelo duplica cada iteración como lo indica ML.TRAINING_INFO, intenta configurar LS_INIT_LEARN_RATE en la última tasa de aprendizaje duplicada. La tasa de aprendizaje inicial óptima es diferente para cada modelo. Una buena tasa de aprendizaje inicial para un modelo podría no ser una buena tasa de aprendizaje inicial para otro.

Argumentos

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

epsilon_per_model

Especifica la cantidad de presupuesto de privacidad que se usará para entrenar este modelo (opcional). A cada cliente de datos de anuncios se le otorga un presupuesto de privacidad de USD 10 por día de datos. Un modelo entrenado correctamente invertirá EPSILON_PER_MODEL del presupuesto para cada día de datos en el período especificado al ejecutar la consulta. El uso del valor predeterminado de ln(3)/10 permitirá la creación de alrededor de 100 modelos. Si usas un valor más alto, podrás crear menos modelos, pero serán de mayor calidad. Si usas un valor menor, podrás crear más modelos de menor calidad.

Argumentos

float64_value puede ser cualquier número de punto flotante positivo de 64 bits menor que ln(3), que es aproximadamente 1.0986. La configuración predeterminada es ln(3)/10.

automatic_input_scaling

Cuando sea TRUE, se aplicará automáticamente min_max_scaling a todas las columnas de atributos numéricos, como si los nombres de las columnas se llamaran explícitamente en la opción min_max_scaled_cols, a excepción de las columnas que se llamaron de forma explícita 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

Escala cada una de las columnas de atributos de number_expression especificadas en el rango de 0 a 1, limitada con MIN y MAX en todas las filas (opcional). Los mismos MIN y MAX se usan automáticamente en la predicción. Si los datos de predicción están fuera del rango MIN, MAX, se limitan a 0 o 1.

Argumentos

Arreglo de string_value, en el que cada string_value es una STRING que representa el nombre de la columna que se transformará.

standard_scaled_cols

(Opcional) Estandariza las columnas de atributos numerical_expression especificadas en todas las filas. Los valores STDDEV y MEAN calculados para estandarizar la expresión se usan automáticamente en la predicción.

Argumentos

Arreglo de string_value, en el que cada string_value es una STRING que representa el nombre de la columna que se transformará.

quantile_bucketized_cols

Crea buckets para las columnas de atributos numéricos continuos especificadas en una STRING con el nombre del bucket como el valor basado en cuantiles. Los mismos cuantiles se usan automáticamente en la predicción.

Argumentos

Arreglo de STRUCT(string_value AS col_name, int64_value AS num_buckets), en el que cada string_value es un STRING que representa el nombre de columna numérica continua que se transformará y cada int64_value es el número de buckets en los que se dividirán los valores numéricos.

Validación

  • Cada día de datos en el período especificado para esta consulta debe tener suficiente presupuesto de privacidad, es decir, más de EPSILON_PER_MODEL; de lo contrario, la consulta fallará.
  • Si se especifican los parámetros de ajuste opcionales, estos se validarán para los rangos que se muestran arriba.
  • Solo se debe especificar explícitamente un parámetro model_type obligatorio.
  • Una columna del conjunto de entrenamiento debe llamarse “etiqueta”. Por el momento, no se admiten varias etiquetas.
  • La columna de etiquetas no puede contener valores NULL. Si la columna de etiquetas contiene valores NULL, la consulta falla.
  • Ninguna de las columnas de atributos puede derivar de user_id.
  • Cada fila debe representar exactamente a un usuario único. Una fila no puede representar datos de más de un usuario. Esto puede suceder con ciertas uniones, p.ej., una CROSS JOIN.
  • Ningún usuario puede estar en dos filas separadas.
  • Por motivos de privacidad, solo se pueden usar las opciones descritas en la sección de sintaxis. Por el momento, no se admiten otras opciones que pueden encontrarse en la documentación de consultas BQML CREATE MODEL.

Funciones de evaluación

ML.EVALUATE

Usa la función ML.EVALUATE para evaluar las métricas de modelos. 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 los 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 usar para predecir resultados mediante el modelo. Los resultados obtenidos con ML.PREDICT están sujetos a las mismas verificaciones de privacidad que otros resultados del Centro de Datos de Anuncios. Más información sobre las verificaciones 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 modelos y atributos

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 los atributos de entrada que se usan para entrenar un modelo

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

ML.WEIGHTS

La función ML.WEIGHTS te permite ver los pesos subyacentes que usa un modelo durante la predicción.

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

Ejemplos

Crear modelos

En los siguientes ejemplos, se usa la tabla de muestra natality para demostrar cómo crear un modelo.

Datos de entrenamiento en selección interna (lineal)

En el siguiente ejemplo, se usa el peso al nacer, el género, las semanas de gestación, la edad materna y la raza materna para predecir el peso al nacer de un niño.

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 usa el peso de nacimiento, el género, las semanas de gestación, la edad materna y la raza materna para predecir el género de un niño.

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

Activación de públicos

Puedes hacer predicciones con un modelo de regresión lineal existente, sin usar ML.PREDICT, incluso sin acceso al modelo en sí. Para descubre cómo hacerlo; consulta el Modelo de regresión para la activación de públicos Codelab.