BigQuery ML: Una breve introducción

0

Hace unos meses, Google anunció una nueva característica de Google BigQuery llamada BigQuery ML, que actualmente se encuentra en Beta.

Consiste en un conjunto de extensiones del lenguaje SQL que permite crear modelos de aprendizaje automático, evaluar su desempeño predictivo y hacer predicciones para nuevos datos directamente en BigQuery.

Fuente: https://twitter.com/sfeir / status / 1039135212633042945

Una de las ventajas de BigQuery ML (BQML) es que solo se necesita saber SQL estándar para usarlo (sin necesidad de usar R o Python para entrenar modelos).  Lo que hace que el aprendizaje automático sea más accesible. Incluso maneja la transformación de datos, la división de entrenamiento / prueba, etc.

Además, reduce el tiempo de entrenamiento de los modelos porque trabaja directamente donde se almacenan los datos (BigQuery) y, por lo tanto, no es necesario exportar los datos a otros

Pero no todo es una ventaja.
  1.  Los modelos implementados actualmente son limitados (aunque veremos que ofrece cierta flexibilidad), lo que probablemente siempre será así debido al hecho de adaptarse a SQL.
  2. En segundo lugar (y, en mi opinión, más importante), a pesar de que BQML facilita la capacitación del modelo, una persona que no está familiarizada con el aprendizaje automático puede tener dificultades para interpretar el modelo que ha creado, evaluar su desempeño e intentar mejorarlo.

En este post, explicaré las funciones principales de BQML y cómo usarlas para crear nuestro modelo, evaluarlo y usarlo para hacer predicciones.

Este proceso constará de los siguientes pasos:
  1. Crear un conjunto de datos (opcional)
  2. Crear un modelo
  3. Información del modelo (opcional)
  4. Evaluar el modelo
  5. Predecir

Crear un dataset (opcional)

Al igual que con las tablas de BigQuery (BQ), el modelo debe guardarse en un conjunto de datos, por lo que primero debe decidir en qué conjunto de datos desea guardar el modelo: uno existente o en uno nuevo.

Si su caso es el último, crear un nuevo conjunto de datos es tan sencillo como:
  1. En la Interfaz BQ seleccione el proyecto en el que desea crear el conjunto de datos y haga clic en “crear datos botón “set”.

BigQuery ML - Interface BQ

 

  1. Nombre el nuevo conjunto de datos y elija una ubicación donde se almacenarán los datos y la caducidad. Puede encontrar más información sobre estos campos en este enlace .

BigQuery ML: Crear un modelo

En el aprendizaje automático supervisado, se utiliza un conjunto de datos de entrenamiento cuyas variables de respuesta se conocen para generar un modelo que captura el patrones subyacentes de los datos para que pueda predecir el resultado de datos invisibles.

BQML le permite realizar este proceso directamente dentro de BigQuery. Actualmente, admite tres tipos de modelos:

  1. Regresión lineal . Se utiliza para predecir el resultado de una variable numérica continua, como el ingreso.
  2. Regresión logística binaria . Se usa para predecir el resultado de una variable categórica con dos clases posibles, como cuando se quiere determinar si un usuario comprará o no .
  3. Multinomial Regresión logística (o multiclase). Se usa para predecir el resultado de una variable categórica con más de dos clases.
Para crear (y entrenar) un modelo con BQML, se debe usar la siguiente sintaxis:

#standardSQL
{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL} `project.dataset.model_name`
OPTIONS(model_option_list)
AS query_statement

Esta consulta creará un modelo (CREATE MODEL) con las opciones especificadas (OPTIONS) y utilizando el resultado de un Consulta (AS) como datos de entrenamiento. Tenemos que especificar:

1) El nombre del modelo y dónde debe guardarse. CREAR MODELO

Crea y entrena el modelo (que se guardará con el nombre “ nombre_modelo ” dentro del conjunto de datos especificado) siempre que no haya un modelo creado con el mismo nombre. Si el nombre del modelo existe, la consulta con CREATE MODEL devolverá un error. Para evitar este error, podemos usar dos alternativas:

  • CREAR MODELO SI NO EXISTE, que crea y entrena el modelo solo si no hay un modelo ya creado con el mismo nombre.
  • CREAR O REEMPLAZAR EL MODELO, lo que crea el model (si no existe) o lo reemplaza (si existe) y lo entrena.

2) model_option_list .

Una lista que especifica algunas opciones relacionadas con el modelo y el proceso de capacitación. El formato es el siguiente: opción1 = valor1, opción2 = valor2,… Las dos opciones más importantes son:

  • modelo_tipo (obligatorio): especifica el tipo de modelo que queremos entrenar: linear_reg para regresión lineal o logistic_reg para regresión logística binaria o multiclase.
  • input_label_cols: especifica el nombre de la columna de la tabla con los datos de entrenamiento que contienen la variable de respuesta. Si la columna se llama etiqueta este campo es opcional; si no, debe especificarse como [‘column_name’].

Aunque BigQuery ML tiene opciones predeterminadas para el entrenamiento de modelos, ofrece cierta flexibilidad para elegir opciones relacionadas con evitar el sobreajuste y la optimización de los parámetros del modelo.

Por ejemplo, podemos aplicar la regularización L1 o L2, dividir los datos en un conjunto de entrenamiento y un conjunto de validación. O establecer el número máximo de iteraciones del descenso del degradado. Puede encontrar todas las opciones disponibles en este enlace .

3) query_statement .

Consulta que genera la tabla que se utilizará como datos de entrenamiento. Una de las ventajas de BigQuery ML es que es responsable de la transformación de datos para el entrenamiento de modelos. En particular:

  • Las características categóricas (de tipo BOOL, STRING, BYTES, DATE, DATETIME o TIME) están encasilladas (es decir, se convierten en una variable binaria para cada clase). Debido al problema conocido como multicolinealidad esto no se recomienda si desea extraer conclusiones sobre las relaciones entre las características y la variable de respuesta.
  • Las características numéricas (tipo NUMERIC, FLOAT64 o INT64) están estandarizadas tanto para los datos de entrenamiento como para las predicciones futuras.
  • Los valores NULL se reemplazan por el promedio en el caso de las variables numéricas o por una nueva clase que agrupa todos estos datos faltantes en el caso de las características categóricas.

Con respecto a la respuesta variable, debe tenerse en cuenta que:

En la regresión lineal:
  • No puede tener valores infinitos o NaN.
En la regresión logística:
  • Binaria: debe tener exactamente dos valores posibles.
  • Multiclase: puede tener un máximo de 50 categorías diferentes.

Por ejemplo, imaginemos que queremos predecir si una sesión web terminará comprando o no, dependiendo de varias características relacionadas con la navegación del usuario ac tividad (número de visitas a la página, duración de la sesión, tipo de usuario, dispositivo que usa y si se trata de tráfico pagado o no). En caso de que desee seguir este ejemplo, utilizaremos el conjunto de datos de prueba de Google Analytics ofrecido por BigQuery . Para crear el modelo, usaríamos la siguiente consulta:

#standardSQL
CREATE MODEL `project.dataset.sample_model`
OPTIONS(model_type='logistic_reg',
input_label_cols=['isBuyer'])
AS
SELECT
IF(totals.transactions IS NULL, 0, 1) AS isBuyer,
IFNULL(totals.pageviews, 0) AS pageviews,
IFNULL(totals.timeOnSite, 0) AS timeOnSite,
IFNULL(totals.newVisits, 0) AS isNewVisit,
IF(device.deviceCategory = 'mobile', 1, 0) AS isMobile,
IF(device.deviceCategory = 'desktop', 1, 0) AS isDesktop,
IF(trafficSource.medium in ('affiliate', 'cpc', 'cpm'), 1, 0) AS isPaidTraffic
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE
_TABLE_SUFFIX BETWEEN '20160801' AND '20170630'

Dado que nuestra variable de respuesta es categórica con dos clases (1 = “con compra” o 0 = “sin compra”), hemos tenido que especificar en las opciones que el tipo de El modelo es una regresión logística (logistic_reg).

Además, tenga en cuenta que la variable de respuesta se llama “isBuyer”, por lo que también hemos tenido que especificar eso en las opciones.

 

BigQuery ML: Información del modelo (opcional)

En los modelos lineales, cada variable explicativa tiene un coeficiente asociado (o peso) que determina la relación entre esta característica y la variable de respuesta. A mayor magnitud, mayor impacto tiene en la variable de respuesta.

Además, el signo positivo (negativo) indica si la respuesta aumenta (disminuye) cuando aumenta el valor de esta variable explicativa (o, en el caso de las variables categóricas, la categoría está presente).

En BigQuery ML, podemos obtener los pesos del modelo entrenado con la siguiente consulta:

#standardSQL
SELECT *
FROM ML.WEIGHTS(MODEL `project.dataset.model_name`)

Como se mencionó anteriormente, si no lo hace Convierta las variables categóricas en binario “manualmente” en su consulta (como hemos hecho con isMobile y isDesktop, por ejemplo), cada categoría posible tendrá un peso y la confiabilidad de los coeficientes se verá comprometida debido a la multicolinealidad.

Por ejemplo, el modelo que creamos en la sección anterior tiene los siguientes coeficientes:

Es decir, ser una sesión de un nuevo usuario, usar un dispositivo móvil o acceder a la web a través de un canal de pago disminuye la probabilidad de que esa visita termine en la compra. . Mientras que usar el escritorio o pasar más tiempo en el sitio aumenta la probabilidad de conversión.

Evalúe el modelo

Una vez que tengamos el modelo capacitado, debemos evaluar su desempeño predictivo.

Esto siempre debe hacerse en un conjunto de pruebas diferente al conjunto de entrenamiento para evitar el sobreajuste. Que ocurre cuando nuestro modelo memoriza los patrones de nuestros datos de entrenamiento y, por lo tanto, es muy preciso en nuestro conjunto de entrenamiento. Pero no es capaz de hacer buenas predicciones en datos nuevos.

BQML proporciona varias funciones para evaluar nuestros modelos:
  • ML.TRAINING_INFO

Proporciona información sobre las iteraciones durante el entrenamiento modelo, incluida la pérdida tanto en el entrenamiento como en el conjunto de validación en cada iteración. El resultado esperado es que la pérdida disminuye en ambos conjuntos (idealmente, a 0, lo que significa que el modelo siempre tiene la razón).

  • ML.EVALUATE.

Proporciona las métricas más comunes para evaluar el rendimiento predictivo de un modelo. Esta función se puede utilizar para cualquier tipo de modelo (regresión lineal, regresión logística binaria, regresión logística multiclase), pero las métricas serán diferentes dependiendo de si se trata de una regresión o una tarea de clasificación.

  • ML.CONFUSION_MATRIX.

Devuelve la matriz de confusión para un conjunto de datos determinado, lo que nos permite conocer las predicciones correctas y los errores para cada clase posible en un modelo de clasificación. Solo se puede utilizar para modelos de clasificación, es decir, regresión logística y regresión logística multiclase.

  • ML.ROC_CURVE

Esta función nos permite construir la curva ROC, que es una visualización gráfica utilizada para evaluar la capacidad predictiva de un modelo de clasificación binaria. En este caso, solo se puede usar para modelos de regresión logística binaria.

En este post nos centraremos en ML.EVALUATE, pero le daremos la sintaxis y los ejemplos de las otras funciones en caso de que alguien esté interesado en usarlas.

  • ML.EVALUATE

Para evaluar un modelo creado anteriormente, debe utilizarse la siguiente sintaxis:
#standardSQL
SELECT *
FROM ML.EVALUATE(MODEL `project.dataset.model_name`,
{TABLE table_name | (query_statement)}
[, STRUCT(XX AS threshold)])

Donde tenemos que especificar:
  • El modelo.
  • La ​​tabla para la cual queremos calcular la métrica de evaluación, que puede ser la resultado de una consulta. Obviamente, este conjunto de pruebas debe tener las mismas columnas que el conjunto de entrenamiento, incluida la variable de respuesta (para comparar las predicciones del modelo con los valores reales). Si no se especifica ninguna tabla o consulta, utilizará el conjunto de validación (si se especificó al crear el modelo) o el conjunto de capacitación (si no se especificó un conjunto de validación).
  • En el caso de una regresión logística, un umbral. Este valor es opcional y especifica el valor a partir del cual las predicciones de nuestro modelo (que son valores entre 0 y 1 que se pueden interpretar como probabilidades de que esta observación sea de clase 1) serán para la clase 0 o para la clase 1. De manera predeterminada, el umbral será 0.5.

El resultado de esta consulta es una fila única con las métricas más comunes para evaluar las predicciones de un modelo, que dependerá del tipo de modelo utilizado.

En particular, las métricas que BigQuery ML proporciona para la regresión logística y los modelos de regresión logística multiclase son:
  • precisión
  • recuerdo
  • precisión
  • f1_score
  • log_loss
  • roc_auc en el caso lineal regresión, ellos son:
    • mean_absolute_error
    • mean_squared_error
    • mean_squared_log_error
    • bronca_respaciente de la luz de la luz de la luz de la mano
    • debe utilizar:

#standardSQL
SELECT *
FROM ML.EVALUATE(MODEL `project.dataset.sample_model`,
(
SELECT
IF(totals.transactions IS NULL, 0, 1) AS isBuyer,
IFNULL(totals.pageviews, 0) AS pageviews,
IFNULL(totals.timeOnSite, 0) AS timeOnSite,
IFNULL(totals.newVisits, 0) AS isNewVisit,
IF(device.deviceCategory = 'mobile', 1, 0) AS isMobile,
IF(device.deviceCategory = 'desktop', 1, 0) AS isDesktop,
IF(trafficSource.medium in ('affiliate', 'cpc', 'cpm'), 1, 0) AS isPaidTraffic
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE
_TABLE_SUFFIX BETWEEN '20170701' AND '20170801'
),
STRUCT(0.5 AS threshold)
)

Tenga en cuenta que las fechas utilizadas para generar los datos son diferentes de las utilizadas para crear el modelo.

El resultado de la consulta anterior es:

Otras funciones para evaluar modelos

1. ML.TRAINING_INFO

Sintaxis:

#standardSQL
SELECT *
FROM ML.TRAINING_INFO(MODEL `project.dataset.model_name`)

Ejemplo:

#standardSQL
SELECT *
FROM ML.TRAINING_INFO(MODEL `project.dataset.sample_model`)

2. ML.CONFUSION_MATRIX

Sintaxis:

#standardSQL
ML.CONFUSION_MATRIX(MODEL `project.dataset.model_name`,
{TABLE table_name | (query_statement)}
[, STRUCT(XX AS threshold)])

 

Ejemplo:

#standardSQL
SELECT *
FROM ML.CONFUSION_MATRIX(MODEL `project.dataset.sample_model`,
(
SELECT
IF(totals.transactions IS NULL, 0, 1) AS isBuyer,
IFNULL(totals.pageviews, 0) AS pageviews,
IFNULL(totals.timeOnSite, 0) AS timeOnSite,
IFNULL(totals.newVisits, 0) AS isNewVisit,
IF(device.deviceCategory = 'mobile', 1, 0) AS isMobile,
IF(device.deviceCategory = 'desktop', 1, 0) AS isDesktop,
IF(trafficSource.medium in ('affiliate', 'cpc', 'cpm'), 1, 0) AS isPaidTraffic
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE
_TABLE_SUFFIX BETWEEN '20170701' AND '20170801'
),
STRUCT(0.5 AS threshold)
)

3. ML.ROC_CURVE

Sintaxis:
#standardSQL
ML.ROC_CURVE(MODEL `project.dataset.model_name`,
{TABLE table_name | (query_statement)},
[GENERATE_ARRAY(thresholds)])

Ejemplo:

#standardSQL
SELECT *
FROM ML.ROC_CURVE(MODEL `project.dataset.sample_model`,
(
SELECT
IF(totals.transactions IS NULL, 0, 1) AS isBuyer,
IFNULL(totals.pageviews, 0) AS pageviews,
IFNULL(totals.timeOnSite, 0) AS timeOnSite,
IFNULL(totals.newVisits, 0) AS isNewVisit,
IF(device.deviceCategory = 'mobile', 1, 0) AS isMobile,
IF(device.deviceCategory = 'desktop', 1, 0) AS isDesktop,
IF(trafficSource.medium in ('affiliate', 'cpc', 'cpm'), 1, 0) AS isPaidTraffic
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE
_TABLE_SUFFIX BETWEEN '20170701' AND '20170801'
),
GENERATE_ARRAY(0.0, 1.0, 0.01)
)

Predicciones

Para usar un modelo creado con BigQuery ML para hacer predicciones, las siguientes se debe utilizar la sintaxis:
#standardSQL
ML.PREDICT(MODEL model_name,
{TABLE table_name | (query_statement)}
[, STRUCT(XX AS threshold)])

Esta consulta usará un modelo (MODEL) y Hacer predicciones de un nuevo conjunto de datos (TABLA). Obviamente, la tabla debe tener las mismas columnas que los datos de entrenamiento.

Aunque no es necesario incluir la variable de respuesta (ya que no la necesitamos para hacer predicciones de nuevos datos).

En la regresión logística, opcionalmente puede especificar un umbral que defina desde qué probabilidad estimada se considera como una predicción final de una clase u otra.

El resultado de esta consulta tendrá tantas filas como el conjunto de datos que hemos proporcionado y Incluye tanto la tabla de entrada como las predicciones del modelo.

En el caso de los modelos de regresión logística (binarios o multiclase), además de la clase que predice el modelo, también se proporciona la probabilidad estimada de cada una de las posibles clases.

Y continuando con nuestro ejemplo:

#standardSQL
SELECT *
FROM ML.PREDICT(MODEL `project.dataset.sample_model`,
(
SELECT
IFNULL(totals.pageviews, 0) AS pageviews,
IFNULL(totals.timeOnSite, 0) AS timeOnSite,
IFNULL(totals.newVisits, 0) AS isNewVisit,
IF(device.deviceCategory = 'mobile', 1, 0) AS isMobile,
IF(device.deviceCategory = 'desktop', 1, 0) AS isDesktop,
IF(trafficSource.medium in ('affiliate', 'cpc', 'cpm'), 1, 0) AS isPaidTraffic
FROM
`bigquery-public-data.google_analytics_sample.ga_sessions_*`
WHERE
_TABLE_SUFFIX BETWEEN '20170701' AND '20170801'
)
)

Tenga en cuenta que la columna con la respuesta (isBuyer) no es obligatoria.

El resultado de la consulta anterior es:

 

La primera columna devuelve la clase que nuestro modelo predice para cada nueva observación. La segunda y tercera columnas nos dan la probabilidad estimada para cada una de las clases (la clase cuya probabilidad estimada es mayor es la de la primera columna).

El resto de las columnas son los datos cuyas predicciones hemos solicitado.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *