使用人口動態洞察嵌入內容

準備真值資料

如要使用人口動態嵌入,基準真相資料必須匯總至支援的地理邊界。由於全球各地的行政邊界類型不盡相同,您可以選擇使用通用數學格線系統 (例如 S2 儲存格) 或當地行政區域 (例如縣市或區,視特定國家/地區的資料集而定),對齊資料。

方法 1:將嵌入內容併入現有模型

  • 準備現有的模型式基準真相:使用嵌入做為地理空間共變數,以強化現有模型。
  • 訓練錯誤修正模型:將嵌入內容整合至模型,並以原始模型輸出內容、預期值或實際資料,以及嵌入內容做為輸入內容,訓練新的錯誤修正模型,藉此提升現有模型的效能。

選項 2:針對特定用途調整

  • 選擇預測模型:任何模型 (例如 GBDT、MLP 或線性) 都可用於預測。
  • 使用嵌入進行預測:將人口動態嵌入做為輸入特徵,搭配其他情境資料,提高預測準確度。

自訂邊界匯總

如果實際資料使用自訂多邊形 (例如郵遞區號、開車時間等時線或商圈),您可以執行邊界彙整。這個程序會將多個 S2 儲存格向量合併為目標多邊形的單一表示法。選擇合適的加權方法,可確保匯總嵌入準確反映下游模型目標。

針對以人為本的使用情境 (例如零售商店成效或消費者行為模型),使用以人口加權的匯總資料。

對人口統計資料使用面積加權空間匯總,可能會扭曲機器學習特徵。如果公園、工業區或水域等無人居住的區域扭曲了實際居民的輪廓,就會發生這種情況。

如要解決這個問題,您可以在 BigQuery 中執行以母體加權的平均值。這種做法會使用高解析度的人口統計資料集,例如 Earth Engine 資料目錄中的 WorldPop,計算每個相交 S2 儲存格區段的精確密度。

如要查看加權工作流程的完整實作範例,請執行互動式筆記本。

2. 面積加權平均值

如果是環境或實體用途,請改用以面積加權的匯總。這項功能適用於土地使用分析、建築環境研究或基礎架構規劃,您必須評估區域,不論人口分布情況為何。

在這些情況下,實體土地面積比人口密度更重要。這可確保多邊形界線內的每個平方公里,對匯總向量的貢獻度都相同。

採用這種方法時,系統會根據每個組成 S2 網格在目標多邊形內涵蓋的地理表面積,為其嵌入向量加權。

地理空間作業和 S2 儲存格轉換

人口動態洞察會使用 S2 儲存格第 12 級權杖 (以 7 個字元的十六進位字串形式儲存在 geo_id 欄中) 做為主要空間單位。您可以使用 BigQuery 的內建地理位置函式,將點座標或自訂空間界線轉換為相符的 S2 儲存格權杖。如要將 S2 儲存格權杖轉換為多邊形幾何圖形以供顯示,可以使用用戶端程式庫。詳情請參閱「從 S2 第 12 級六邊形權杖取得 S2 儲存格幾何圖形」。

將點座標轉換為 S2 第 12 級十六進位符記

如要將經緯度點座標與「人口動態洞察」中的 geo_id 欄相符,請一併使用 BigQuery S2_CELLIDFROMPOINT 函式和 ST_GEOGPOINT

BigQuery 會將 S2 儲存格 ID 儲存為已簽署的 INT64 值,導致特定區域的儲存格 ID 評估為負整數。在下列範例中,我們定義了名為 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;

如要將現有包含 latitudelongitude 資料欄的點資料表轉換為可聯結的 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`;

為多邊形產生涵蓋的第 12 級 S2 網格權杖

如果您的資料使用自訂區域邊界 (例如以 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;

從第 12 級的 S2 六邊形權杖取得 S2 網格幾何圖形

BigQuery GIS 函式是單向轉換器 (幾何 → S2 Cell ID),不包含將 S2 Cell 權杖轉換為多邊形 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)