Puedes hacer predicciones con un modelo de regresión logística o lineal existente
con pesos conocidos sin usar ML.PREDICT
, incluso sin acceso al modelo
a sí mismo. Para ello, debes usar una solución alternativa para usar la privacidad diferencial
(DP) en las consultas de activación de públicos del Centro de Datos de Anuncios.
En este ejemplo paso a paso, aprenderás a realizar la inferencia simulada
para modelos de regresión logística lineal y binaria reales, y luego comparar los
resultados con el de ML.PREDICT
para mostrar la exactitud de los resultados simulados.
También demostrará un ejemplo práctico de cómo crear una lista de público.
con un modelo logístico binario, que se usaría para aplicar un modelo de conversión
a la activación de públicos.
Descripción general del ejemplo:
- Genera datos
- Entrenar el modelo
- Obtén los pesos e intercepta
- Simula la predicción
- Comparar resultados
Ejemplo paso a paso
1. Genera datos
Crear una tabla con datos simulados para entrenar el modelo Marcar una fracción de las filas del conjunto de aislamiento.
Regresión lineal
CREATE OR REPLACE TABLE DATASET_NAME.LIN_REG_TRAINING_SET AS
WITH
A AS (
SELECT
*
FROM
UNNEST(GENERATE_ARRAY(1, 100000)) AS row_number),
B AS (
SELECT
row_number,
RAND() AS rand_label,
RAND() AS rand_feature_1,
RAND() AS rand_feature_2,
RAND() AS rand_feature_3,
RAND() AS rand_feature_4,
RAND() AS rand_feature_5,
RAND() AS rand_feature_6,
RAND() AS rand_feature_7,
RAND() AS rand_feature_8,
RAND() AS rand_feature_9,
RAND() AS rand_feature_10
FROM
A),
C AS (
SELECT
rand_label AS label,
*
FROM
B),
D AS (
SELECT
row_number,
CAST(round(10 * label) AS INT64) AS label,
(rand_label + rand_feature_1) / 2 AS feature_1,
(rand_label + rand_feature_2) / 2 AS feature_2,
(rand_label + rand_feature_3) / 2 AS feature_3,
(rand_label + rand_feature_4) / 2 AS feature_4,
(rand_label + rand_feature_5) / 2 AS feature_5,
(rand_label + rand_feature_6) / 2 AS feature_6,
(rand_label + rand_feature_7) / 2 AS feature_7,
(rand_label + rand_feature_8) / 2 AS feature_8,
(rand_label + rand_feature_9) / 2 AS feature_9,
(rand_label + rand_feature_10) / 2 AS feature_10
FROM
C)
SELECT
label,
feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10,
RAND() < 0.1 AS holdback -- Ten percent will be true.
FROM
D
Regresión logística binaria
SELECT
CASE
WHEN label < 5 THEN 0
WHEN label >= 5 THEN 1
END
AS label,
* EXCEPT (label)
FROM
`DATASET_NAME.BIN_LOG_REG_TRAINING_SET`
2. Entrenar el modelo
Entrenar un modelo de regresión a partir del conjunto de entrenamiento
Regresión lineal
CREATE OR REPLACE MODEL `DATASET_NAME.LIN_REG_MODEL` OPTIONS (model_type="linear_reg") AS
SELECT
* except (holdback)
FROM
`DATASET_NAME.LIN_REG_TRAINING_SET`
WHERE
NOT holdback
Ten en cuenta que agregamos suficiente ruido a los datos simulados para obtener un modelo con R2 = 0.9009.
Medición | Valor |
---|---|
Error absoluto promedio | 0,7359 |
Error cuadrático medio | 0,8432 |
Error logarítmico cuadrático medio | 0.0810 |
Mediana de error absoluto | 0,6239 |
R al cuadrado | 0,9009 |
Regresión logística binaria
CREATE OR REPLACE MODEL `DATASET_NAME.BIN_LOG_REG_MODEL` OPTIONS (model_type="logistic_reg") AS
SELECT
* EXCEPT (holdback)
FROM
`DATASET_NAME.BIN_LOG_REG_TRAINING_SET`
WHERE
NOT holdback
Resultados de muestra. Observa la precisión de 0.9260.
Medición | Valor |
---|---|
Clase positiva | 1 |
Clase negativa | 0 |
Precisión | 0.0810 |
Recuperación | 0,9315 |
Precisión | 0,9260 |
Puntuación F1 | 0,9328 |
Los valores en negrita de esta matriz de confusión muestran la frecuencia con la que el modelo clasificó cada etiqueta de forma correcta, y los valores que no están en negrita muestran la frecuencia con la que el modelo clasificó incorrectamente cada etiqueta.
Etiqueta de confianza | Etiqueta predicha 1 | Etiqueta predicha 2 |
---|---|---|
1 | Un 93% | 7% |
0 | 8% | Un 92% |
3. Obtener pesos e interceptar
Obtén los pesos y la intercepción para el modelo:
Regresión lineal
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.LIN_REG_MODEL`)
peso | category_weights.category |
---|---|
feature_1 | 1,8263055528635743 |
feature_2 | 1,8143804404490813 |
feature_3 | 1,8601204874033492 |
feature_4 | 1,8507603439031859 |
feature_5 | 1,7899764387123640 |
feature_6 | 1,8645246630251291 |
feature_7 | 1,8698005281925356 |
feature_8 | 1,7904637080330201 |
feature_9 | 1,8036887855406274 |
feature_10 | 1,8117115890624449 |
INTERSECCION.EJE (INTERCEPT) | -4,1428754911504306 |
Regresión logística binaria
SELECT
*
FROM
ML.WEIGHTS(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`)
peso | category_weights.category |
---|---|
feature_1 | 3,823533928 |
feature_2 | 3.734812819 |
feature_3 | 3.842239823 |
feature_4 | 3.785488823 |
feature_5 | 3.737386716 |
feature_6 | 3,567663961 |
feature_7 | 3.819643052 |
feature_8 | 3.734673763 |
feature_9 | 3,839301406 |
feature_10 | 3,787306994 |
INTERSECCION.EJE (INTERCEPT) | −17.922169920 |
4. Simula la predicción
Regresión lineal
Usa el producto escalar de los valores de los atributos con los pesos y agrega los
interceptar, para hacer la predicción con SQL estándar sin usar
ML.PREDICT
Esta consulta compara las predicciones que usan esta técnica con
aquellos que usan ML.PREDICT
. Observa cómo las líneas en negrita de SQL funcionan
el producto de los valores de atributos para la fila con los pesos del modelo y, luego, suma
la intercepción.
WITH
T AS (
SELECT
label AS actual_label,
predicted_label AS ml_predicted_label,
[feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10] AS features,
[1.8263055528635743,
1.8143804404490813,
1.8601204874033492,
1.8507603439031859,
1.789976438712364,
1.8645246630251291,
1.8698005281925356,
1.7904637080330201,
1.8036887855406274,
1.8117115890624449] AS weights
FROM
ML.PREDICT(MODEL `DATASET_NAME.LIN_REG_MODEL`,
(
SELECT
*
FROM
`PROJECT_NAME.DATASET_NAME.LIN_REG_TRAINING_SET`))
WHERE
holdback),
P AS (
SELECT
actual_label,
ml_predicted_label,
(
SELECT
SUM(element1 * element2) - 4.1428754911504306
FROM
T.features element1
WITH
OFFSET
pos
JOIN
T.weights element2
WITH
OFFSET
pos
USING
(pos) ) sql_predicted_label,
features,
weights
FROM
T)
SELECT
actual_label,
ml_predicted_label,
sql_predicted_label,
ABS(ml_predicted_label - sql_predicted_label) < 0.00000000001 AS diff_is_negligible
FROM
P
Regresión logística binaria
En la regresión logística binaria, la técnica para simular las predicciones es es muy similar a la regresión lineal, además de aplicar la función sigmoidea en el último paso con el umbral deseado.
Usa el producto escalar de los valores de los atributos con los pesos y agrega los
interceptar, para hacer la predicción con SQL estándar sin usar ML.PREDICT
.
Luego, usa la función sigmoidea con un umbral de 0.5 en el resultado para predecir
ya sea 0 o 1. Esta consulta compara las predicciones que usan esta técnica con aquellas
usando ML.PREDICT
.
WITH
T AS (
SELECT
label AS actual_label,
predicted_label AS ml_predicted_label,
[feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10] AS features,
[3.8235339279050287,
3.7348128191185244,
3.8422398227859471,
3.7854888232502479,
3.7373867156553713,
3.5676639605351026,
3.8196430517007811,
3.7346737628343032,
3.8393014063170749,
3.7873069939244743] AS weights
FROM
ML.PREDICT(MODEL `DATASET_NAME.BIN_LOG_REG_MODEL`,
(
SELECT
*
FROM
`PROJECT_NAME.DATASET_NAME.BIN_LOG_REG_TRAINING_SET`))
WHERE
holdback),
P AS (
SELECT
actual_label,
ml_predicted_label,
(
SELECT
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
FROM
T.features element1
WITH
OFFSET
pos
JOIN
T.weights element2
WITH
OFFSET
pos
USING
(pos) ) sql_predicted_label,
features,
weights
FROM
T)
SELECT
actual_label,
ml_predicted_label,
sql_predicted_label,
ml_predicted_label = sql_predicted_label AS simulation_is_accurate
FROM
P
El bloque de código SQL en negrita en la consulta anterior está realizando el producto punto. de los valores de atributos para cada fila con los pesos del modelo y sumar interceptar para obtener la predicción de regresión lineal:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Luego, aplica la función sigmoidea Y = 1 / (1+e^-z)
al producto escalar.
e interceptar con SQL estándar:
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Por último, se compara el resultado de la función sigmoidea con el valor límite de 0.5 para llegar a la predicción de regresión logística binaria de 0, si es menor que 0.5, o 1, si no lo es. Ten en cuenta que puedes usar cualquier umbral un valor entre 0 y 1.
IF((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
Esta técnica también puede extenderse a la regresión logística multiclase. En ese caso, los pesos del modelo serán una matriz nxn, en lugar de un vector, y el los pesos serían un vector y no un escalar. Multiplicarías el atributo de valores por la matriz de ponderaciones y agrega el vector de intercepción. El vector resultante tendría una puntuación para cada etiqueta y podrías elegir la etiqueta con la puntuación más alta para tu predicción. Si quisieras devolver un de probabilidad, aplicarías la función sigmoidea a cada elemento del .
5. Comparar resultados
Regresión lineal
Los resultados de la muestra son casi idénticos, excepto por un pequeño error de redondeo.
actual_label | ml_predicted_label | sql_predicted_label | diff_is_negligible |
---|---|---|---|
6 | 5,2062349420751834 | 5.2062349420751826 | verdadero |
0 | 0,40318472770048075 | 0,403184727700479 | verdadero |
3 | 3.0703766078249597 | 3.0703766078249597 | verdadero |
7 | 7.0588171538562 | 7.0588171538562 | verdadero |
6 | 6.7802375930646 | 6.7802375930646 | verdadero |
6 | 5,1088569571339368 | 5,1088569571339377 | verdadero |
4 | 4,051839078116874 | 4,051839078116874 | verdadero |
4 | 5,1810254680219243 | 5,1810254680219234 | verdadero |
6 | 6.1440349466401223 | 6.1440349466401205 | verdadero |
1 | 2,0842399472783519 | 2,0842399472783519 | verdadero |
2 | 2,1911209811886847 | 2,1911209811886838 | verdadero |
3 | 3,0236086790006622 | 3,0236086790006613 | verdadero |
2 | 2,573083132964213 | 2,5730831329642125 | verdadero |
7 | 5,68662973136732 | 5,6866297313673186 | verdadero |
9 | 8,1860026312677938 | 8,1860026312677938 | verdadero |
Regresión logística binaria
La comparación de la inferencia simulada con los resultados reales de
Las ML.PREDICT
son perfectas, no una sola contradicción en cuanto al aislamiento de las 10,000 filas
automático. Hay algunas filas en las que tanto ML.PREDICT
como la inferencia simulada
ambos no están de acuerdo con la etiqueta real, y eso se espera como la exactitud del modelo
es alrededor del 93%, y hay valores pequeños, pero distintos de cero, en las celdas fuera de la diagonal
de la matriz de confusión.
actual_label | ml_predicted_label | sql_predicted_label | simulation_is_accurate |
---|---|---|---|
0 | 1 | 1 | verdadero |
0 | 0 | 0 | verdadero |
0 | 0 | 0 | verdadero |
0 | 0 | 0 | verdadero |
0 | 0 | 0 | verdadero |
0 | 0 | 0 | verdadero |
0 | 0 | 0 | verdadero |
0 | 0 | 0 | verdadero |
0 | 0 | 0 | verdadero |
0 | 0 | 0 | verdadero |
0 | 1 | 1 | verdadero |
0 | 0 | 0 | verdadero |
Crea una lista de activación de público con AA
Un caso de uso típico sería crear una logística binaria con privacidad diferencial modelo de regresión para predecir conversiones y, luego, aplicar inferencias en este modelo mientras creas una lista de público. Supongamos que el modelo logístico binario creó en el ejemplo anterior es el modelado de conversiones y que cada fila del entrenamiento y los conjuntos de evaluación representan a un usuario distinto.
La siguiente consulta muestra cómo crear una lista de público con los usuarios que que el modelo predice que convertirán:
WITH
T AS (
SELECT
*,
label AS actual_label,
[feature_1,
feature_2,
feature_3,
feature_4,
feature_5,
feature_6,
feature_7,
feature_8,
feature_9,
feature_10] AS features,
[3.8235339279050287,
3.7348128191185244,
3.8422398227859471,
3.7854888232502479,
3.7373867156553713,
3.5676639605351026,
3.8196430517007811,
3.7346737628343032,
3.8393014063170749,
3.7873069939244743] AS weights
FROM
`PROJECT_NAME.DATASET_NAME.BIN_LOG_REG_TRAINING_SET`
WHERE
holdback),
P AS (
SELECT
*,
(
SELECT
IF
((1 / (1 + EXP(-(SUM(element1 * element2) -17.922169920432161)))) < 0.5, 0, 1)
FROM
T.features element1
WITH
OFFSET
pos
JOIN
T.weights element2
WITH
OFFSET
pos
USING
(pos) ) predicted_label,
features,
weights
FROM
T),
SELECT
user_id
FROM
P
WHERE
predicted_label = 1;