Как использовать эмбеддинги Population Dynamics Insights

Как подготовить данные для проверки

Чтобы использовать эмбеддинги Population Dynamics, ваши фактические данные должны быть агрегированы по поддерживаемым географическим границам. Поскольку типы административных границ различаются в разных странах, вы можете сопоставить свои данные, используя универсальные математические системы координат (например, ячейки S2) или местные административные регионы (например, округа или районы, в зависимости от набора данных для определенной страны).

Вариант 1. Встроить эмбеддинги в существующую модель

  • Подготовьте существующую фундаментальную истину на основе модели. Используйте эмбеддинги в качестве геопространственных ковариат, чтобы улучшить существующую модель.
  • Обучите модель коррекции ошибок. Улучшите существующую модель, интегрировав эмбеддинги в модель, которая принимает выходные данные исходной модели, ожидаемое значение или фундаментальную истину, а также эмбеддинги, чтобы обучить новую модель коррекции ошибок.

Вариант 2. Настройте параметры для определенных случаев использования

  • Выберите модель прогнозирования. Для прогнозов можно использовать любую модель, например GBDT, MLP или линейную.
  • Используйте эмбеддинги для прогнозирования. Используйте эмбеддинги Population Dynamics в качестве входных признаков наряду с другими контекстными данными, чтобы повысить точность прогнозирования.

Специальное агрегирование по границам

Если в ваших достоверных данных используются нестандартные многоугольники, например почтовые индексы, изохроны времени в пути или торговые зоны, вы можете выполнить агрегирование границ. В этом процессе несколько векторов ячеек S2 объединяются в одно представление для целевого многоугольника. Правильный выбор метода взвешивания гарантирует, что агрегированное встраивание будет точно отражать ваши цели моделирования.

Используйте агрегирование с учетом численности населения для сценариев, ориентированных на людей, например для оценки эффективности розничных магазинов или моделирования поведения потребителей.

Использование пространственной агрегации с взвешиванием по площади для демографических данных может исказить признаки машинного обучения. Это происходит, когда незаселенные территории, такие как парки, промышленные зоны или водоемы, искажают профиль реальных жителей.

Чтобы устранить эту проблему, можно выполнить среднее значение с весом по численности населения в BigQuery. Этот подход использует наборы демографических данных с высоким разрешением, такие как WorldPop в каталоге данных Earth Engine, для расчета точной плотности каждого пересекающегося сегмента ячейки S2.

Чтобы посмотреть полный пример реализации рабочего процесса с взвешиванием по численности населения, запустите интерактивный блокнот.

2. Средневзвешенное значение по площади

Для экологических или физических вариантов использования используйте агрегирование, взвешенное по площади. Это полезно для анализа землепользования, изучения антропогенной среды или планирования инфраструктуры, когда вам нужно оценить регионы независимо от распределения населения.

В таких случаях площадь территории важнее, чем плотность населения. Это гарантирует, что каждый квадратный километр в пределах границы многоугольника вносит равный вклад в агрегированный вектор.

При этом методе вектор встраивания каждой ячейки S2 взвешивается по географической площади, которую она занимает в целевом многоугольнике.

Геопространственные операции и преобразование ячеек S2

В качестве основной пространственной единицы в Population Dynamics Insights используются токены ячеек S2 уровня 12 (хранятся в столбце geo_id в виде 7-символьных шестнадцатеричных строк). Вы можете использовать встроенные географические функции в BigQuery, чтобы преобразовать координаты точек или пользовательские пространственные границы в соответствующие токены ячеек S2. Чтобы преобразовать токены ячеек S2 в многоугольники для визуализации, можно использовать клиентские библиотеки. Подробнее о том, как получить геометрию ячейки S2 из шестнадцатеричного токена S2 уровня 12…

Преобразование координат точек в шестнадцатеричные токены S2 уровня 12

Чтобы сопоставить координаты точек широты и долготы со столбцом geo_id в статистике динамики населения, используйте функцию BigQuery S2_CELLIDFROMPOINT в сочетании с ST_GEOGPOINT.

В BigQuery идентификаторы ячеек S2 хранятся как подписанные значения INT64, из-за чего идентификаторы ячеек в некоторых регионах оцениваются как отрицательные целые числа. В примерах ниже мы определяем вспомогательную функцию TO_S2_HEX, которая преобразует целое число в стандартный шестнадцатеричный токен и удаляет нули в конце в соответствии со спецификацией S2 Geometry.

Следующий запрос преобразует координаты точки на Таймс-сквер в Нью-Йорке (широта 40.75796, долгота -73.98554) в соответствующий шестнадцатеричный токен S2 уровня 12:

CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS (
  RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0')
);

SELECT
  'Times Square, NYC' AS location_name,
  TO_S2_HEX(S2_CELLIDFROMPOINT(ST_GEOGPOINT(-73.98554, 40.75796), level => 12)) AS geo_id;

Чтобы преобразовать существующую таблицу точек со столбцами latitude и longitude в токены S2, которые можно объединять:

CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS (
  RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0')
);

SELECT
  store_id,
  TO_S2_HEX(S2_CELLIDFROMPOINT(ST_GEOGPOINT(longitude, latitude), level => 12)) AS geo_id
FROM
  `your-project.internal_data.store_locations`;

Как сгенерировать токены ячеек S2 уровня 12, покрывающих многоугольник

Если в ваших данных используются пользовательские границы областей (например, торговые зоны, зоны местной доставки или почтовые индексы в формате WKT или GeoJSON), преобразуйте текстовое представление в GEOGRAPHY с помощью ST_GEOGFROM и используйте S2_COVERINGCELLIDS, чтобы извлечь все пересекающиеся ячейки S2 уровня 12.

Следующий запрос извлекает все шестнадцатеричные токены S2 уровня 12, покрывающие многоугольник в Мидтауне на Манхэттене:

CREATE TEMP FUNCTION TO_S2_HEX(s2_int INT64) RETURNS STRING AS (
  RTRIM(FORMAT('%x%015x', (s2_int >> 60) & 0xF, s2_int & 0x0FFFFFFFFFFFFFFF), '0')
);

WITH CustomBoundary AS (
  SELECT ST_GEOGFROM('POLYGON((-73.99 40.75, -73.97 40.75, -73.97 40.76, -73.99 40.76, -73.99 40.75))') AS geom
)
SELECT
  TO_S2_HEX(s2_id) AS geo_id
FROM
  CustomBoundary,
  UNNEST(S2_COVERINGCELLIDS(geom, min_level => 12, max_level => 12)) AS s2_id;

Получить геометрию ячейки S2 из шестнадцатеричного токена S2 уровня 12

Функции BigQuery GIS выполняют одностороннее преобразование (Geometry → S2 Cell ID) и не включают функцию преобразования токена ячейки S2 в многоугольник GEOGRAPHY. Чтобы получить геометрию многоугольника токена ячейки S2 для визуализации или пространственного анализа, используйте клиентскую библиотеку на Python, например s2sphere, чтобы декодировать семизначный токен ячейки S2 в координаты ее границ, и shapely, чтобы построить многоугольник для инструментов картографирования, таких как Folium:

import s2sphere
from shapely.geometry import Polygon

def s2_token_to_polygon(s2_token: str) -> Polygon:
    """Converts a 7-character S2 cell token into a Shapely Polygon."""
    cell_id = s2sphere.CellId.from_token(s2_token)
    cell = s2sphere.Cell(cell_id)

    # Extract the 4 corner vertices of the S2 cell
    vertices = []
    for i in range(4):
        vertex = cell.get_vertex(i)
        lat_lng = s2sphere.LatLng.from_point(vertex)
        vertices.append((lat_lng.lng().degrees, lat_lng.lat().degrees))

    # Close the polygon loop
    vertices.append(vertices[0])
    return Polygon(vertices)

# Example: Get boundary for S2 token '549056f'
cell_polygon = s2_token_to_polygon('549056f')
print(cell_polygon.wkt)

Примеры запросов

Замените your-project.your_dataset.embeddings_table на название своего проекта, набора данных и целевой таблицы.

SQL: получение встраиваний

Этот запрос извлекает вектор встраивания и административные метаданные для ячеек S2 в вашем наборе данных.

SELECT
  geo_id,
  administrative_area_level_1_name AS state,
  administrative_area_level_2_name AS county,
  features -- The 330-dim vector
FROM
  `your-project.your_dataset.embeddings_table`
LIMIT 10;

SQL: поиск похожих мест

Этот запрос позволяет выявить местоположения со схожим поведением без использования внешних данных.

Для расчета косинусного сходства используется функция ML.DISTANCE, которая возвращает лучшие совпадения для целевой ячейки S2. Этот подход поддерживает сценарии планирования расширения, такие как определение места открытия нового магазина на основе профиля успешного существующего местоположения.

Чтобы визуализировать ячейки S2 на карте, необходимо преобразовать или объединить идентификатор ячейки S2 с соответствующей геометрией многоугольника, поскольку в этом наборе данных вместо точек широты и долготы используются токены ячеек S2.

WITH TargetLocation AS (
  SELECT features AS target_vector
  FROM `your-project.your_dataset.embeddings_table`
  -- Replace with your target S2 hex token (e.g., '80ead45')
  WHERE geo_id = 'YOUR_TARGET_S2_TOKEN'
)

SELECT
  t.geo_id,
  t.administrative_area_level_1_name AS state,
  t.administrative_area_level_2_name AS county,
  -- Calculate Similarity (1.0 is identical, 0.0 is dissimilar)
  (1 - ML.DISTANCE(t.features, p.target_vector, 'COSINE')) AS similarity_score
FROM
  `your-project.your_dataset.embeddings_table` t,
  TargetLocation p
WHERE
  t.geo_id != 'YOUR_TARGET_S2_TOKEN' -- Exclude the target itself
ORDER BY
  similarity_score DESC
LIMIT 20;

SQL: объединение данных клиентов

В этом примере показано, как дополнить собственные внутренние данные (например, таблицу эффективности магазина) поведенческими эмбеддингами. Убедитесь, что ваши внутренние данные включают соответствующие токены ячеек S2 (шестнадцатеричные строки).

SELECT
  store.store_id,
  store.s2_token,
  store.total_revenue,
  embeddings.features AS pdfm_vector
FROM
  `your-project.internal_data.store_performance` AS store
JOIN
  `your-project.your_dataset.embeddings_table` AS embeddings
ON
  -- Join based on the S2 hex token string
  store.s2_token = embeddings.geo_id

Python: загрузка данных для машинного обучения

Эмбеддинги хранятся в виде массивов BigQuery. Чтобы использовать их в библиотеках ML, необходимо преобразовать столбец в матрицу NumPy.

from google.cloud import bigquery
import numpy as np
import pandas as pd

client = bigquery.Client()

query = """
    SELECT
        geo_id,
        features -- Returns as a list of floats
    FROM
        `your-project.your_dataset.embeddings_table`
    LIMIT 1000
"""

# 1. Load data into DataFrame
df = client.query(query).to_dataframe()

# 2. Convert the 'features' column (Series of Lists) into a Matrix (2D Array)
X_matrix = np.stack(df['features'].values)

print(f"Data Loaded. Matrix Shape: {X_matrix.shape}")
# Output: Data Loaded. Matrix Shape: (1000, 330)