准备标准答案数据
如需使用 Population Dynamics 嵌入,您的标准答案数据必须汇总到受支持的地理边界。由于行政边界类型在全球范围内各不相同,因此您可以使用通用数学网格系统(例如 S2 单元格)或本地行政区域(例如县或区,具体取决于特定国家/地区的数据集)来对齐数据。
选项 1:将嵌入纳入现有模型
- 准备基于现有模型的标准答案:使用嵌入作为地理空间协变量来增强现有模型。
- 训练错误修正模型:通过将嵌入集成到模型中来改进现有模型,该模型会采用原始模型输出、预期值或标准答案以及嵌入来学习新的错误修正模型。
选项 2:针对特定应用场景进行调优
- 选择预测模型:任何模型(例如 GBDT、MLP 或线性模型)都可用于预测。
- 使用嵌入进行预测:将 Population Dynamics 嵌入与其他情境数据一起用作输入特征,以提高预测准确率。
自定义边界汇总
如果您的标准答案数据使用自定义多边形(例如邮政编码、驾车时间等时线或贸易区),则可以执行边界汇总。此过程会将多个 S2 单元格向量合并为目标多边形的单个表示形式。选择正确的加权方法可确保汇总的嵌入准确反映您的下游建模目标。
1. 人口加权平均值(PDI 的推荐默认值)
对于以人为本的应用场景(例如零售店业绩或消费者行为建模),请使用人口加权汇总。
对人口统计数据使用面积加权的空间汇总可能会扭曲机器学习特征。当公园、工业区或水体等无人居住的区域扭曲实际居民的个人资料时,就会发生这种情况。
如需解决此问题,您可以在 BigQuery 中执行人口加权平均值。此 方法使用高分辨率人口统计数据集(例如 Earth Engine 数据 目录 中的 WorldPop)来计算每个相交 S2 单元格段的精确密度。
如需查看人口加权工作流的完整实现示例,请运行互动式笔记本。
2. 面积加权平均值
对于环境或物理应用场景,请改用面积加权汇总。 这对于土地利用分析、建筑环境研究或基础设施规划非常有用,在这些应用场景中,您必须评估区域,而无论人口分布如何。
在这些应用场景中,实际土地面积比人口密度更相关。这样可确保多边形边界内的每个平方公里对汇总向量的贡献相同。
在此方法下,每个组成 S2 单元格的嵌入向量都按其在目标多边形内覆盖的地理表面积进行加权。
地理空间运算和 S2 单元格转换
Population Dynamics Insights 使用 S2 单元格级别 12 令牌(以 7 个字符的十六进制字符串形式存储在 geo_id 列中)作为其主要空间单位。您可以使用
BigQuery 中的内置地理函数
将点坐标或自定义空间边界转换为
匹配的 S2 单元格令牌。如需将 S2 单元格令牌转换为多边形几何图形以进行可视化,您可以使用客户端库。如需了解详情,请参阅获取
S2 单元格几何图形(从 S2 级别 12 十六进制
令牌)。
将点坐标转换为 S2 级别 12 十六进制令牌
如需将纬度/经度点坐标与 Population Dynamics Insights 中的 geo_id 列进行匹配,请将 BigQuery S2_CELLIDFROMPOINT 函数与 ST_GEOGPOINT 结合使用。
BigQuery 将 S2 单元格 ID 存储为带符号的 INT64 值,这会导致某些区域中的单元格 ID 评估为负整数。在以下示例中,我们定义了一个名为 TO_S2_HEX 的辅助函数,该函数会将整数转换为标准十六进制令牌,并根据 S2 几何图形规范去除尾随零。
以下查询将纽约市时代广场(纬度 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 格式),请使用 ST_GEOGFROM 将文本表示形式转换为 GEOGRAPHY,并使用 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 级别 12 十六进制令牌获取 S2 单元格几何图形
BigQuery GIS 函数是单向转换器(几何图形 → S2 单元格 ID),不包含将 S2 单元格令牌转换为多边形 GEOGRAPHY 的函数。
如需获取 S2 单元格令牌的多边形几何图形以进行可视化或空间
分析,请使用 Python 中的客户端库(例如
s2sphere
)将其 7 个字符的 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 单元格 ID 转换为或联接到其对应的多边形几何图形,因为此数据集使用 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 数组。如需在机器学习库中使用它们,您必须将列转换为 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)
在 Google Colab 中运行
在 GitHub 上查看源代码