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 de publicidad.

  • 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 basado en entradas, como predecir el valor del ciclo de vida del cliente en función de compras, interacciones previas, etcétera.
  • La regresión logística se usa para los problemas de clasificación predictiva. El modelo puede ser de 2 tipos, según la cantidad de variables que proporciones:
    • La regresión logística binaria responde a preguntas de “sí/no”, como la probabilidad de que ocurra 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, medio o alto.

Tanto la regresión lineal como la logística aprenden los datos de entrenamiento (en este caso, tus datos publicitarios), lo que te brinda un modelo predictivo para tomar decisiones publicitarias. En general, proporcionar más datos y garantizar que los que proporcionas son de alta calidad mejorará la precisión 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 verificación de privacidad distinto al que usan otras operaciones en el Centro de Datos de Anuncios. La privacidad diferencial garantiza la privacidad del usuario final, ya que inserta 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 no es 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

Tienes un límite de 100 consultas de modelado de regresión lineal y logística por “día de datos” cuando usas el EPSILON_PER_MODEL predeterminado. Día de los datos hace referencia 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 las tablas que utiliza tu consulta, como las tablas temporales utilizadas 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 más alto que el predeterminado, podrás crear menos modelos, pero tendrán una calidad más alta. Y si eliges valores más bajos de EPSILON_PER_MODEL, puedes entrenar más modelos, pero tendrán una calidad menor.

Cómo funciona

El flujo de trabajo sigue estos pasos esenciales:

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

Prepara los datos de entrenamiento

Como se mencionó anteriormente, el uso de conjuntos de datos más grandes y de alta calidad suele generar mejores resultados. Además, dado que los datos de entrada se escalan con escalamiento mínimo y máximo, los datos agrupados en clústeres dispersos o los datos con valores atípicos significativos pueden afectar negativamente al modelo si se mueven la media.

De forma predeterminada, el Centro de Datos de Anuncios selecciona de forma aleatoria un 18% de tus datos de entrenamiento para usarlos en la validación. El porcentaje de datos que se usa para la validación se puede controlar con la opción data_split_eval_fraction.

Crea un modelo

Especifica los parámetros y los 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 enumeran a continuación. Cuéntanos tu experiencia.

  • Observamos una exactitud 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.
  • Vimos que r al cuadrado es mayor que 0.70 en los modelos de regresión lineal creados 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 demás. Específicamente, cuando una etiqueta tiene pocos usuarios del conjunto de entrenamiento, tener muchos usuarios de conjuntos de entrenamiento con otras etiquetas probablemente no sea de mucha ayuda para la exactitud del modelo en la etiqueta pequeña. Por ejemplo, 20,000 y 1,000 usuarios de conjuntos de entrenamiento para dos etiquetas es peor que 10,000 y 2,000.
  • Datos de atributos que no proporcionan un indicador claro para las etiquetas.
  • Datos sin procesar que necesitan una ingeniería de atributos más exhaustiva. 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 menor cantidad de categorías o buckets.

Reunir información

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

Declaración CREATE MODEL

La declaración 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, con guiones bajos y guiones. No puede incluir puntos. Si el nombre de modelo que proporcionaste 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 en la verificación de diferencias debido a la limpieza o al 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

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 y el valor predeterminado es cero.

l2_reg

(Opcional) Cantidad de regularización L2 aplicada. 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 y el valor predeterminado es cero.

data_split_eval_fraction

(Opcional) Debe estar entre 0 .01 y 0 .99, con el valor predeterminado de 0 .18. Determina la fracción de datos que terminan 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 un usuario puede ejecutar. Aquí hay un gráfico de esa relación suponiendo que TODOS los modelos de un conjunto de datos determinado 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

La 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 directamente 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 crea un árbol para cada iteración, esta es también la cantidad de árboles. Debe ser un número entero mayor que 1. La configuración predeterminada es 20.

learn_rate_strategy

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

Argumentos

"LINE_SEARCH" usa el método de búsqueda de líneas 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íneas ralentiza el entrenamiento y aumenta la cantidad de bytes procesados, pero, en general, converge incluso con una tasa de aprendizaje inicial mayor especificada.

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

El valor predeterminado es "LINE_SEARCH".

learn_rate

(Opcional, solo para logística) La tasa de aprendizaje para el descenso de gradientes cuando LEARN_RATE_STRATEGY se establece en CONSTANT. Si LEARN_RATE_STRATEGY se establece como "LINE_SEARCH", se mostrará 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

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

Argumentos

TRUE para “sí”, FALSE para “no”. La configuración predeterminada es TRUE.

min_rel_progress

Opcional: La mejora de pérdida relativa mínima que se necesita para continuar con el entrenamiento cuando EARLY_STOP se establece como verdadero. 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 el LEARN_RATE del modelo parece que 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. Es posible que una tasa de aprendizaje inicial buena para un modelo no sea adecuada para otro.

Argumentos

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

epsilon_per_model

(Opcional) Especifica el presupuesto de privacidad que se usará para entrenar este modelo. Cada cliente de datos de anuncios recibe un presupuesto de privacidad de 10.0 por día de datos. Un modelo entrenado correctamente invertirá EPSILON_PER_MODEL del presupuesto por cada día de datos en el período especificado cuando se ejecute la consulta. Usar el valor predeterminado de ln(3)/10 permitirá crear 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, todas las columnas de atributos numéricos tendrán aplicados automáticamente min_max_scaling, como si los nombres de columna se mencionaran de forma explícita en la opción min_max_scaled_cols, a excepción de cualquier columna que se haya llamado de manera explícita en las opciones standard_scaled_cols o quantile_bucketized_cols.

Argumentos

bool_value es BOOL y el valor predeterminado es TRUE.

min_max_scaled_cols

(Opcional) Escala cada una de las columnas de atributos numéricas especificadas en el rango de 0 a 1, con una limitación 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 están fuera del rango MIN, MAX, se limita a 0 o 1.

Argumentos

Array 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

Array 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

Agrupa en buckets 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

Array 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 continuo de la columna numérica que se transformará y cada int64_value es la cantidad de buckets en los que se deben dividir los valores numéricos.

Datos

  • Cada día de datos del período especificado para esta consulta debe tener un presupuesto de privacidad suficiente, es decir, más de EPSILON_PER_MODEL; de lo contrario, la consulta fallará.
  • Los parámetros de ajuste opcionales, si se especifican, se validarán para los rangos que se muestran arriba.
  • Solo se debe especificar de forma explícita un parámetro model_type obligatorio.
  • Una columna en el conjunto de entrenamiento debe llamarse “label”. Actualmente, no se admiten varias etiquetas.
  • La columna de etiquetas no puede contener valores NULL. Si la columna de etiquetas contiene valores NULOS, la consulta falla.
  • Ninguna de las columnas de atributos puede derivar de user_id.
  • Cada fila debe representar exactamente un usuario único. Una fila no puede representar datos de más de un usuario. Esto puede ocurrir con ciertas uniones, como una CROSS JOIN.
  • Ningún usuario puede estar en dos filas separadas.
  • Por razones de privacidad, solo se pueden usar las opciones descritas en la sección de sintaxis. Por el momento, no se admiten otras opciones que se pueden encontrar en la documentación de consulta 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 usan el peso al nacer, el género, las semanas de gestación, la edad de la madre y el origen étnico 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 la selección interna (logística)

En el siguiente ejemplo, se usan el peso al nacer, el género, las semanas de gestación, la edad de la madre y el origen étnico 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