Crea un modelo de agrupamiento en clústeres de k-means

BigQuery ML admite el aprendizaje no supervisado. Puedes aplicar el algoritmo k-means para agrupar tus datos en clústeres. A diferencia del aprendizaje automático supervisado, que es sobre estadísticas predictivas, el aprendizaje no supervisado tiene que ver con estadísticas descriptivas. Se trata de comprender tus datos para poder tomar decisiones basadas en datos.

En este instructivo, usarás un modelo de k-means en BigQuery ML para compilar clústeres de datos en el conjunto de datos públicos de Alquileres de bicicletas de Londres. Los datos de Alquileres de bicicletas de Londres contienen la cantidad de alquileres del Esquema de alquileres de bicicletas Santander de Londres desde 2011 hasta el presente. Los datos incluyen marcas de tiempo de inicio y parada, nombres de estaciones y duración del viaje.

Las consultas en este instructivo usan Funciones geográficas disponibles en BigQuery GIS. Si deseas obtener más información sobre BigQuery GIS, consulta Introducción a BigQuery GIS.

Objetivos

En este instructivo, harás lo siguiente:

  • Crear un modelo de agrupamiento en clústeres de k-means
  • Tomar decisiones basadas en datos según la visualización de BigQuery ML de los clústeres.

Costos

En este instructivo, se usan componentes facturables de Cloud Platform, incluidos los siguientes:

  • BigQuery
  • BigQuery ML

Para obtener información sobre los costos de BigQuery, consulta la página Precios de BigQuery.

Para obtener información sobre los costos de BigQuery ML, consulta la página Precios de BigQuery ML.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En la página de selección de proyectos de Cloud Console, selecciona o crea un proyecto de Cloud.

    Ir a la página Selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Obtén información sobre cómo confirmar que tienes habilitada la facturación para tu proyecto.

  4. BigQuery se habilita de forma automática en proyectos nuevos. Para activar BigQuery en un proyecto existente, ve a Habilita la API BigQuery.

    Habilita la API

Introducción

Tus datos pueden contener clústeres de datos o agrupaciones naturales. Es posible que desees identificar estas agrupaciones de forma descriptiva para tomar decisiones basadas en datos. Por ejemplo, es posible que un minorista quiera identificar agrupaciones naturales de clientes que tengan hábitos o lugares de compra similares. Este proceso se conoce como segmentación de clientes.

Los datos que usas para realizar la segmentación de clientes pueden incluir la tienda que visitaron, los artículos que compraron, cuánto pagaron, etcétera. Deberías crear un modelo para tratar de entender cómo son estos grupos de clientes a fin de que puedas diseñar artículos que atraigan a los miembros del grupo.

También puedes encontrar grupos de productos entre los artículos comprados. En este caso, agruparías los artículos en clústeres, en función de quién los compró, cuándo se compraron, dónde se compraron, etcétera. Deberías crear un modelo con el fin de determinar las características de un grupo de productos para que puedas tomar decisiones fundamentadas, como la forma de mejorar la venta cruzada.

En este instructivo, usarás BigQuery ML para crear un modelo de k-means que agrupa en clústeres los datos de Alquileres de bicicletas de Londres en función de los atributos de las estaciones de bicicletas.

La creación de tu modelo de k-means consta de los siguientes pasos:

  • Paso uno: Crea un conjunto de datos para almacenar tu modelo.
    El primer paso es crear un conjunto de datos que almacene tu modelo.
  • Paso dos: Examina tus datos de entrenamiento.
    El siguiente paso es examinar los datos que utilizas para entrenar tu modelo de agrupamiento en clústeres mediante la ejecución de una consulta en la tabla london_bicycles. Debido a que k-means es una técnica de aprendizaje no supervisado, el entrenamiento de modelos no requiere etiquetas ni que dividas los datos en datos de entrenamiento y de evaluación.
  • Paso tres: Crea un modelo de k-means.
    El tercer paso es crear tu modelo de k-means. Cuando creas el modelo, el campo de agrupación en clústeres es station_name y agrupa los datos según el atributo de estación, por ejemplo, la distancia de la estación al centro de la ciudad.
  • Paso cuatro: Usa la función ML.PREDICT para predecir el clúster de una estación.
    A continuación, usa la función ML.PREDICT para predecir el clúster de un conjunto determinado de estaciones. Puedes predecir clústeres para todos los nombres de estaciones que contengan la string Kennington.
  • Paso cinco: Usa tu modelo para tomar decisiones basadas en datos.
    El último paso es usar el modelo para tomar decisiones basadas en datos. Por ejemplo, en función de los resultados del modelo, puedes determinar qué estaciones se beneficiarían de una capacidad adicional.

Paso uno: Crea tu conjunto de datos

El primer paso es crear un conjunto de datos de BigQuery a fin de almacenar tu modelo. Para crear tu conjunto de datos, sigue estos pasos:

  1. Ve a la IU web de BigQuery en Cloud Console.

    Ir a la IU web de BigQuery

  2. En el panel de navegación, en la sección Recursos, haz clic en el nombre de tu proyecto.

  3. En el panel de detalles a la derecha, haz clic en Crear conjunto de datos (Create dataset).

    Crear conjunto de datos

  4. En la página Crear conjunto de datos, sigue estos pasos:

    • En ID del conjunto de datos (Dataset ID), ingresa bqml_tutorial.
    • En Ubicación de datos (Data location), selecciona Unión Europea (UE) (European Union (EU)). El conjunto de datos públicos de Alquileres de bicicletas de Londres se almacena en la ubicación multirregión EU. Tu conjunto de datos debe estar en la misma ubicación.

      Crear página de conjunto de datos

  5. Usa los valores predeterminados para el resto de la configuración y haz clic en Crear conjunto de datos.

Paso dos: Examina tus datos de entrenamiento

A continuación, examina los datos usados para entrenar tu modelo de k-means. En este instructivo, agruparás en clústeres las estaciones de bicicletas en función de los siguientes atributos:

  • Duración de los alquileres
  • Cantidad de viajes por día
  • Distancia desde el centro de la ciudad

La siguiente consulta recopila tus datos de entrenamiento. Esta consulta se incluye en tu declaración CREATE MODEL más adelante en este instructivo.

WITH
  hs AS (
  SELECT
    h.start_station_name AS station_name,
    IF
    (EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 1
      OR EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 7,
      "weekend",
      "weekday") AS isweekday,
    h.duration,
    ST_DISTANCE(ST_GEOGPOINT(s.longitude,
        s.latitude),
      ST_GEOGPOINT(-0.1,
        51.5))/1000 AS distance_from_city_center
  FROM
    `bigquery-public-data.london_bicycles.cycle_hire` AS h
  JOIN
    `bigquery-public-data.london_bicycles.cycle_stations` AS s
  ON
    h.start_station_id = s.id
  WHERE
    h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
    AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
  stationstats AS (
  SELECT
    station_name,
    AVG(duration) AS duration,
    COUNT(duration) AS num_trips,
    MAX(distance_from_city_center) AS distance_from_city_center
  FROM
    hs
  GROUP BY
    station_name )
SELECT
  *
FROM
  stationstats
ORDER BY
  distance_from_city_center ASC

Detalles de la consulta

Esta consulta extrae datos sobre el alquiler de bicicletas, incluidos start_station_name y duration, y los une con la información de la estación, incluida distance-from-city-center. Luego, calcula los atributos de la estación en stationstats, incluida la duración promedio de los viajes y la cantidad de viajes, y pasa por el atributo de estación distance_from_city_center.

En esta consulta, se usa la cláusula WITH para definir subconsultas. También se usan las funciones de BigQuery GIS ST_DISTANCE y ST_GEOGPOINT. Para obtener más información sobre estas funciones, consulta Funciones geográficas. Si deseas obtener más información sobre BigQuery GIS, consulta Introducción a BigQuery GIS.

Ejecuta la consulta

Para ejecutar la consulta que compila los datos de entrenamiento de tu modelo:

  1. En la IU web de BigQuery, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de SQL estándar en el área de texto del Editor de consultas.

    WITH
      hs AS (
      SELECT
        h.start_station_name AS station_name,
        IF
        (EXTRACT(DAYOFWEEK
          FROM
            h.start_date) = 1
          OR EXTRACT(DAYOFWEEK
          FROM
            h.start_date) = 7,
          "weekend",
          "weekday") AS isweekday,
        h.duration,
        ST_DISTANCE(ST_GEOGPOINT(s.longitude,
            s.latitude),
          ST_GEOGPOINT(-0.1,
            51.5))/1000 AS distance_from_city_center
      FROM
        `bigquery-public-data.london_bicycles.cycle_hire` AS h
      JOIN
        `bigquery-public-data.london_bicycles.cycle_stations` AS s
      ON
        h.start_station_id = s.id
      WHERE
        h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
        AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
      stationstats AS (
      SELECT
        station_name,
        AVG(duration) AS duration,
        COUNT(duration) AS num_trips,
        MAX(distance_from_city_center) AS distance_from_city_center
      FROM
        hs
      GROUP BY
        station_name )
    SELECT
      *
    FROM
      stationstats
    ORDER BY
      distance_from_city_center ASC
    
    
  3. Haz clic en Ejecutar.

  4. Cuando se complete la consulta, haz clic en la pestaña Resultados (Results) debajo del área de texto de la consulta. La pestaña de resultados muestra las columnas consultadas que se utilizan para entrenar su modelo: station_name, duration, num_trips, distance_from_city_center. Los resultados deberían verse de la siguiente manera.

    Resultados de la consulta

Paso tres: Crea un modelo de k-means

Ahora que examinaste tus datos de entrenamiento, el siguiente paso es crear un modelo de k-means con los datos.

Puedes crear y entrenar un modelo k-means mediante la declaración CREATE MODEL con la opción model_type=kmeans. En la siguiente consulta, se agrega una declaración CREATE MODEL a la consulta anterior y se quitan los campos id en los datos.

CREATE OR REPLACE MODEL
  bqml_tutorial.london_station_clusters OPTIONS(model_type='kmeans',
    num_clusters=4) AS
WITH
  hs AS (
  SELECT
    h.start_station_name AS station_name,
  IF
    (EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 1
      OR EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 7,
      "weekend",
      "weekday") AS isweekday,
    h.duration,
    ST_DISTANCE(ST_GEOGPOINT(s.longitude,
        s.latitude),
      ST_GEOGPOINT(-0.1,
        51.5))/1000 AS distance_from_city_center
  FROM
    `bigquery-public-data.london_bicycles.cycle_hire` AS h
  JOIN
    `bigquery-public-data.london_bicycles.cycle_stations` AS s
  ON
    h.start_station_id = s.id
  WHERE
    h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
    AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
  stationstats AS (
  SELECT
    station_name,
    isweekday,
    AVG(duration) AS duration,
    COUNT(duration) AS num_trips,
    MAX(distance_from_city_center) AS distance_from_city_center
  FROM
    hs
  GROUP BY
    station_name, isweekday)
SELECT
  * EXCEPT(station_name, isweekday)
FROM
  stationstats

Detalles de la consulta

La declaración CREATE MODEL especifica la cantidad deseada de clústeres: cuatro. En la declaración SELECT, la cláusula EXCEPT excluye la columna station_name porque station_name no es un atributo. La consulta crea una fila única por station_name y en la declaración SELECT solo se mencionan los atributos.

Si omites la opción num_clusters, BigQuery ML elegirá un valor predeterminado razonable según la cantidad total de filas en los datos de entrenamiento. También puedes realizar el ajuste de hiperparámetros para encontrar una cantidad apropiada. Con el fin de determinar una cantidad óptima de clústeres, deberías ejecutar la consulta CREATE MODEL para diferentes valores de num_clusters, buscar la medida de error y elegir el punto en el que la medida de error esté en su valor mínimo. Puedes obtener la medida de error si seleccionas tu modelo y haces clic en la pestaña Entrenamiento. La pestaña de entrenamiento muestra el índice de Davies-Bouldin.

Pestaña de entrenamiento

Ejecuta la consulta CREATE MODEL

Para ejecutar la consulta que crea tu modelo de k-means, sigue estos pasos:

  1. En la IU web de BigQuery, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de SQL estándar en el área de texto del Editor de consultas.

    CREATE OR REPLACE MODEL
      bqml_tutorial.london_station_clusters OPTIONS(model_type='kmeans',
        num_clusters=4) AS
    WITH
      hs AS (
      SELECT
        h.start_station_name AS station_name,
      IF
        (EXTRACT(DAYOFWEEK
          FROM
            h.start_date) = 1
          OR EXTRACT(DAYOFWEEK
          FROM
            h.start_date) = 7,
          "weekend",
          "weekday") AS isweekday,
        h.duration,
        ST_DISTANCE(ST_GEOGPOINT(s.longitude,
            s.latitude),
          ST_GEOGPOINT(-0.1,
            51.5))/1000 AS distance_from_city_center
      FROM
        `bigquery-public-data.london_bicycles.cycle_hire` AS h
      JOIN
        `bigquery-public-data.london_bicycles.cycle_stations` AS s
      ON
        h.start_station_id = s.id
      WHERE
        h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
        AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
      stationstats AS (
      SELECT
        station_name,
        isweekday,
        AVG(duration) AS duration,
        COUNT(duration) AS num_trips,
        MAX(distance_from_city_center) AS distance_from_city_center
      FROM
        hs
      GROUP BY
        station_name, isweekday)
    SELECT
      * EXCEPT(station_name, isweekday)
    FROM
      stationstats
    
  3. Haz clic en Ejecutar.

  4. En la IU web de BigQuery, en la sección Recursos, expande el nombre del proyecto, haz clic en bqml_tutorial y, luego, haz clic en london_station_clusters.

  5. Haz clic en la pestaña Esquema (Schema). El esquema del modelo enumera los cuatro atributos de estación que BigQuery ML usó para realizar el agrupamiento en clústeres. El esquema debe verse de la siguiente manera.

    Información de esquema del clúster

  6. Haz clic en la pestaña Evaluación (Evaluation). Esta pestaña muestra visualizaciones de los clústeres identificados por el modelo k-means. En Atributos numéricos (Numerical features), los gráficos de barras muestran hasta 10 de los valores de atributos numéricos más importantes para cada centroide. Puedes seleccionar qué atributos visualizar en el menú desplegable.

    Gráficos de atributos numéricos

Paso cuatro: Usa la función ML.PREDICT para predecir el clúster de una estación

Para identificar el clúster al que pertenece una estación en particular, usa la función ML.PREDICT. La siguiente consulta predice el clúster de cada estación que tiene la string “Kennington” en su nombre.

WITH
  hs AS (
  SELECT
    h.start_station_name AS station_name,
    IF
    (EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 1
      OR EXTRACT(DAYOFWEEK
      FROM
        h.start_date) = 7,
      "weekend",
      "weekday") AS isweekday,
    h.duration,
    ST_DISTANCE(ST_GEOGPOINT(s.longitude,
        s.latitude),
      ST_GEOGPOINT(-0.1,
        51.5))/1000 AS distance_from_city_center
  FROM
    `bigquery-public-data.london_bicycles.cycle_hire` AS h
  JOIN
    `bigquery-public-data.london_bicycles.cycle_stations` AS s
  ON
    h.start_station_id = s.id
  WHERE
    h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
    AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
  stationstats AS (
  SELECT
    station_name,
    AVG(duration) AS duration,
    COUNT(duration) AS num_trips,
    MAX(distance_from_city_center) AS distance_from_city_center
  FROM
    hs
  GROUP BY
    station_name )
SELECT
  * EXCEPT(nearest_centroids_distance)
FROM
  ML.PREDICT( MODEL bqml_tutorial.london_station_clusters,
    (
    SELECT
      *
    FROM
      stationstats
    WHERE
      REGEXP_CONTAINS(station_name, 'Kennington')))

Detalles de la consulta

En esta consulta, se usa la función REGEXP_CONTAINS para buscar todas las entradas en la columna station_name que contienen la string “Kennington”. La función ML.PREDICT usa esos valores para predecir qué clústeres contendrían esas estaciones.

Ejecuta la consulta ML.PREDICT

Para ejecutar la consulta ML.PREDICT, sigue estos pasos:

  1. En la IU web de BigQuery, haz clic en el botón Redactar consulta nueva.

  2. Ingresa la siguiente consulta de SQL estándar en el área de texto del Editor de consultas.

    WITH
      hs AS (
      SELECT
        h.start_station_name AS station_name,
        IF
        (EXTRACT(DAYOFWEEK
          FROM
            h.start_date) = 1
          OR EXTRACT(DAYOFWEEK
          FROM
            h.start_date) = 7,
          "weekend",
          "weekday") AS isweekday,
        h.duration,
        ST_DISTANCE(ST_GEOGPOINT(s.longitude,
            s.latitude),
          ST_GEOGPOINT(-0.1,
            51.5))/1000 AS distance_from_city_center
      FROM
        `bigquery-public-data.london_bicycles.cycle_hire` AS h
      JOIN
        `bigquery-public-data.london_bicycles.cycle_stations` AS s
      ON
        h.start_station_id = s.id
      WHERE
        h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP)
        AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ),
      stationstats AS (
      SELECT
        station_name,
        AVG(duration) AS duration,
        COUNT(duration) AS num_trips,
        MAX(distance_from_city_center) AS distance_from_city_center
      FROM
        hs
      GROUP BY
        station_name )
    SELECT
      * EXCEPT(nearest_centroids_distance)
    FROM
      ML.PREDICT( MODEL bqml_tutorial.london_station_clusters,
        (
        SELECT
          *
        FROM
          stationstats
        WHERE
          REGEXP_CONTAINS(station_name, 'Kennington')))
    
    
  3. Haz clic en Ejecutar.

  4. Cuando la consulta finalice, haz clic en la pestaña Resultados (Results) debajo del área de texto de la consulta. Los resultados deberían verse de la siguiente manera.

    Resultados de ML.PREDICT

Paso cinco: Usa tu modelo para tomar decisiones basadas en datos

Los resultados de la evaluación pueden ayudarte a interpretar los diferentes clústeres.

Gráficos de atributos numéricos

En este ejemplo, Cluster#3 muestra una estación de la ciudad ocupada que se encuentra cerca del centro de la ciudad. Cluster#2 muestra la segunda estación de la ciudad que está menos ocupada. Cluster#1 muestra una subestación suburbana menos ocupada, con alquileres de mayor duración. Cluster#4 muestra otra estación suburbana con viajes que son más cortos. En función de estos resultados, puedes usar los datos para tomar decisiones fundamentadas. Por ejemplo:

  • Supongamos que necesitas experimentar con un tipo nuevo de anclaje. ¿Qué clúster de estaciones deberías elegir para realizar este experimento? Las estaciones en Cluster#1, Cluster#2 o Cluster#4 parecen elecciones lógicas porque no son las estaciones más concurridas.

  • Supongamos que deseas abastecer algunas estaciones con bicicletas de carrera. ¿Qué estaciones debes elegir? Cluster#1 es el grupo de estaciones que están lejos del centro de la ciudad y tienen los viajes más largos. Estas son las posibles candidatas para las bicicletas de carrera.

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

  • Puedes borrar el proyecto que creaste.
  • De lo contrario, puedes mantener el proyecto y borrar el conjunto de datos.

Borra tu conjunto de datos

Borrar tu proyecto quita todos sus conjuntos de datos y tablas. Si prefieres volver a usar el proyecto, puedes borrar el conjunto de datos que creaste en este instructivo:

  1. Si es necesario, abre la IU web de BigQuery.

    Ir a la IU web de BigQuery

  2. En el panel de navegación, haz clic en el conjunto de datos bqml_tutorial que creaste.

  3. Haz clic en Borrar conjunto de datos en el lado derecho de la ventana. Esta acción borra el conjunto de datos y el modelo.

  4. En el cuadro de diálogo Borrar conjunto de datos, ingresa el nombre del conjunto de datos (bqml_tutorial) y, luego, haz clic en Borrar para confirmar el comando de borrado.

Borra tu proyecto

Para borrar el proyecto, haz lo siguiente:

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a la página Administrar recursos

  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar .
  3. En el cuadro de diálogo, escribe el ID del proyecto y haz clic en Cerrar para borrar el proyecto.

Próximos pasos