BigQuery ハンズオン教科書|2026-08 版
第 13 章

BigQuery ML — SQL だけで機械学習

CREATE MODEL 一文で学習し、ML.PREDICT で予測する。データを動かさない ML

この章で学ぶこと

前提: 課金プロジェクト必須(ハンズオン 2 本の合計で概算数円〜十数円)。BigQuery ML は BigQuery エディションの Standard では利用できません。

BigQuery ML の思想 — データを持ち出さない ML

機械学習を試すには、通常「データをウェアハウスから抜き出し、Python の ML フレームワークが動く環境へ運び、学習し、デプロイし、推論結果をまたウェアハウスへ書き戻す」という往復が発生します。BigQuery ML はこの往復そのものを消します。CREATE MODEL 文で学習し、ML.PREDICT で推論する、すべてが SQL の一部です。公式ドキュメントは BigQuery ML を「SQL に習熟した実務者が、既存の SQL ツールとスキルだけでモデルの構築・評価ができる」仕組みと位置づけています。

従来の ML パイプライン BigQuery エクスポート 外部 ML 環境 (学習・デプロイ) 結果を書き戻す BigQuery BigQuery ML BigQuery CREATE MODEL モデル(BigQuery 内) ML.PREDICT 予測結果
図 13-1 従来の ML パイプラインはデータをエクスポートして外部環境で学習・デプロイしますが、BigQuery ML は学習も推論も BigQuery の中だけで完結します。

BigQuery ML が扱うモデルは、学習が実際にどこで行われるかで 4 つに分かれます。この区別は後述する課金の理解にも直結します。

内部学習モデル 線形/ロジスティック回帰 k-means・PCA・ARIMA_PLUS 学習場所: BigQuery 内 CREATE MODEL で課金 外部学習モデル DNN・ブースト木 ランダムフォレスト・AutoML 学習場所: Agent Platform CREATE MODEL で課金 リモートモデル Agent Platform の 既存エンドポイント参照 学習: 行わない CREATE MODEL は無課金 インポートモデル ONNX・TensorFlow TFLite・XGBoost 学習: 外部で完了済み CREATE MODEL は無課金
図 13-2 内部学習モデルと外部学習モデルは CREATE MODEL 自体が学習ジョブなので課金が発生しますが、リモートモデル(既存の Vertex AI エンドポイントを参照するだけ)とインポートモデル(外部で学習済み)は CREATE MODEL がバイトを処理しないため無課金です。
実務の視点: BigQuery ML が向くのは「分析チームが SQL の延長で予測・分類・セグメンテーションまで済ませたい」場面です。特徴量エンジニアリングを高度にカスタマイズしたい、独自のニューラルネットワーク構造を組みたい、といった要件が出てきたら、Vertex AI のカスタム学習に移行するサインです。BigQuery ML は「Standard エディションでは利用できない」という制約があるため、Enterprise 以上のエディションか、従来のオンデマンド課金のプロジェクトが前提になります。

サポートするモデルの全体像

「何を予測したいか」から逆引きすると、モデルタイプの選び方は驚くほどシンプルです。

教師なし学習 グルーピング → K-means 次元圧縮 → PCA 推薦 → 行列分解 ラベル列は不要 教師あり学習(回帰・分類) 数値予測 → 線形回帰 カテゴリ分類 → ロジスティック回帰 高精度が要る → DNN/ブースト木/AutoML ラベル列が必須 時系列予測 季節性・休日を自動処理 → ARIMA_PLUS 外部要因も使う → ARIMA_PLUS_XREG
図 13-3 まず「ラベル付きデータの有無」で教師なし / 教師ありを分け、教師ありはさらに数値予測かカテゴリ分類かで分ける。時間軸に沿った将来値の予測だけは、季節性・休日効果を自動処理する ARIMA_PLUS 系が別枠になる。
MODEL_TYPE用途学習の分類
LINEAR_REG数値の予測(回帰)内部学習
LOGISTIC_REG2 値〜最大 50 ラベルの分類内部学習
KMEANSデータセグメンテーション(教師なし)内部学習
MATRIX_FACTORIZATION商品レコメンド内部学習(オンデマンド非対応、Editions/予約が必須)
PCA次元削減内部学習
ARIMA_PLUS / ARIMA_PLUS_XREG時系列予測・異常検知内部学習
CONTRIBUTION_ANALYSIS指標変化の要因分析内部学習
BOOSTED_TREE_* / RANDOM_FOREST_*分類・回帰(決定木ベース)外部学習(Agent Platform)
DNN_* / AUTOML_*分類・回帰(深層学習・AutoML)外部学習(Agent Platform)
ONNX / TENSORFLOW / XGBOOST 等外部で学習済みモデルの推論インポート(無課金)

CREATE MODEL → ML.EVALUATE → ML.PREDICT の 3 段の流れ

BigQuery ML のワークフローはどのモデルタイプでも同じ 3 段です。

学習データ CREATE MODEL モデル 評価データ ML.EVALUATE 予測対象データ ML.PREDICT ML.FORECAST
図 13-4 入力データを評価用に回せば ML.EVALUATE が精度指標を返し、予測対象データを回せば ML.PREDICT(または時系列なら ML.FORECAST)が予測値を返す。どちらも学習済みのモデルを再利用するだけで、再学習は不要。

CREATE MODEL の基本構文は次の形です。TRANSFORM 句を使うと、学習時に指定した前処理が評価・推論の際にも自動的に復元されます。

CREATE OR REPLACE MODEL `PROJECT_ID.handson_ch13.penguins_model`
TRANSFORM(
  ML.STANDARD_SCALER(culmen_length_mm) OVER() AS culmen_length_scaled,
  species, island, sex,
  body_mass_g
)
OPTIONS(
  model_type = 'linear_reg',
  input_label_cols = ['body_mass_g']
) AS
SELECT species, island, culmen_length_mm, sex, body_mass_g
FROM `bigquery-public-data.ml_datasets.penguins`
WHERE body_mass_g IS NOT NULL;
学習時 生データ TRANSFORM 変換後の特徴量 学習 モデル TRANSFORM を保持 保存済み TRANSFORM を再適用 予測時 新しい生データ (未加工のまま) ML.PREDICT 予測結果
図 13-5 TRANSFORM 句で指定した前処理はモデル本体に保存される。予測時は未加工の新しいデータを渡すだけでよく、前処理を人間が再現する必要はない。

学習後は ML.EVALUATE で精度を確認します。返るカラムはモデルタイプで異なり、分類モデルは precision / recall / accuracy / f1_score / log_loss / roc_auc、回帰モデルは mean_absolute_error / mean_squared_error / r2_score / explained_variance 等、k-means モデルは davies_bouldin_index / mean_squared_distance を返します。

SELECT * FROM ML.EVALUATE(MODEL `PROJECT_ID.handson_ch13.penguins_model`);

推論は ML.PREDICT(回帰・分類・クラスタリング等)と、時系列専用の ML.FORECAST に分かれます。ML.FORECAST は HORIZON(予測する時点数、既定値 3)と CONFIDENCE_LEVEL(予測区間の信頼度、既定値 0.95)を指定し、forecast_value と予測区間の上下限を返します。

SELECT *
FROM ML.FORECAST(
  MODEL `PROJECT_ID.handson_ch13.ga_arima_model`,
  STRUCT(30 AS horizon, 0.9 AS confidence_level)
);

各特徴量が予測にどう寄与したかを見たい場合は ML.EXPLAIN_PREDICT(説明可能性)、モデルの当てはまりをハイパーパラメータ単位で追い込みたい場合は CREATE MODEL の NUM_TRIALS / HPARAM_TUNING_OBJECTIVES オプションによるチューニングが使えます。学習済みモデルは Vertex AI の Model Registry に登録して、オンライン予測エンドポイントへデプロイすることもできます。

課金の考え方 — CREATE MODEL は「別建て」

この章で最も誤解されやすいのが料金です。ML.EVALUATE / ML.PREDICT / ML.FORECAST は通常のクエリと同じオンデマンド $6.25 / TiB(2026-08 時点、us-central1)で課金され、月 1 TiB の無料枠にそのまま含まれます。ところが CREATE MODEL はモデルタイプによって単価が変わり、線形回帰・ロジスティック回帰・k-means・PCA・時系列(ARIMA_PLUS / ARIMA_PLUS_XREG)・貢献度分析のモデル作成は $312.50 / TiB、つまり通常のクエリの50 倍です。公式ドキュメントは「CREATE MODEL ジョブのコストは監査ログのバイト数から独自に計算する必要がある」と明記しており、評価・推論のように無料枠へ含まれるとは書かれていません。

操作単価(2026-08 時点、us-central1)備考
通常のクエリ$6.25 / TiB月 1 TiB まで無料
内部学習モデルの CREATE MODEL(線形/ロジスティック回帰・k-means・PCA・ARIMA_PLUS 系・貢献度分析)$312.50 / TiB通常の 50 倍。無料枠への算入は明記されていない
外部学習モデルの CREATE MODEL(DNN・ブースト木・ランダムフォレスト・AutoML 等)$6.25 / TiBBigQuery 側の前処理コスト。別途 Agent Platform 側のコストも発生
行列分解(MATRIX_FACTORIZATION)の CREATE MODELオンデマンド非対応Editions(Enterprise 以上)または予約(reservations)が必須
評価・検査・推論(ML.EVALUATE / ML.PREDICT / ML.FORECAST 等)$6.25 / TiB月 1 TiB の無料枠に含まれる

本章のハンズオンは、線形回帰は 344 行の小さな公開データセット、時系列予測は 1 年分の日次集計という、どちらも学習データのスキャン量を数十〜数百 KB 〜 MB オーダーに絞っています。$312.50 / TiB のレートでも、実際の請求額は数円〜十数円程度に収まる計算です。内部学習モデルは CREATE MODEL の dry run で事前にバイト量を見積もれるので、本番規模のテーブルで学習する前に必ず確認してください(外部学習モデルは dry run 非対応です)。

実務の視点: 「無料枠内だから」という理由でうっかり大きなテーブルに CREATE MODEL(内部学習モデル)を実行すると、通常のクエリ感覚の 50 倍の請求が飛んできます。学習データは事前に集計・サンプリングして小さくしてから CREATE MODEL に渡す設計を徹底し、迷ったら dry run で処理バイト量を確認する癖をつけてください。
ハンズオン 13-1|ペンギンの体重を線形回帰で予測する

公開データセットの 344 行の小さなテーブルで線形回帰モデルを作り、評価・予測まで一通り体験します。課金プロジェクト必須(CREATE MODEL は $312.50/TiB ですが、対象データが数十 KB 程度なので概算数円未満)。

  1. 演習用データセットを作成します(ロケーションは US)。
bq mk --location=US --dataset PROJECT_ID:handson_ch13
  1. 線形回帰モデルを作成します。ラベル列は body_mass_g(体重)です。
-- 処理: 数十 KB 程度(実測は dry run で確認)
CREATE OR REPLACE MODEL `PROJECT_ID.handson_ch13.penguins_model`
OPTIONS(
  model_type = 'linear_reg',
  input_label_cols = ['body_mass_g']
) AS
SELECT
  species, island, culmen_length_mm, culmen_depth_mm, flipper_length_mm, sex,
  body_mass_g
FROM `bigquery-public-data.ml_datasets.penguins`
WHERE body_mass_g IS NOT NULL;
  1. モデルを評価します。
SELECT * FROM ML.EVALUATE(MODEL `PROJECT_ID.handson_ch13.penguins_model`);

期待される出力: mean_absolute_error / mean_squared_error / r2_score 等の 1 行。r2_score が 1 に近いほど当てはまりが良いことを示します。

  1. 新しいペンギンのデータで体重を予測します。
SELECT
  species, island, predicted_body_mass_g
FROM ML.PREDICT(
  MODEL `PROJECT_ID.handson_ch13.penguins_model`,
  (
    SELECT species, island, culmen_length_mm, culmen_depth_mm, flipper_length_mm, sex
    FROM `bigquery-public-data.ml_datasets.penguins`
    WHERE body_mass_g IS NULL
    LIMIT 5
  )
);

期待される出力: predicted_body_mass_g 列に予測体重(グラム)が入った 5 行。出力列名は predicted_<ラベル列名> の形式になります。

後片付け:

bq rm -f --model PROJECT_ID:handson_ch13.penguins_model
bq rm -r -f -d PROJECT_ID:handson_ch13
ハンズオン 13-2|ARIMA_PLUS でサイト訪問数を時系列予測する

ECサイトの日次訪問数を ARIMA_PLUS で予測します。課金プロジェクト必須(日次集計後のデータで学習するため概算数円〜十数円。事前に dry run で確認してください)。ハンズオン 13-1 のデータセットを再作成済みであれば使い回してください。

  1. 日次訪問数を ARIMA_PLUS モデルとして学習します。
CREATE OR REPLACE MODEL `PROJECT_ID.handson_ch13.ga_arima_model`
OPTIONS(
  model_type = 'ARIMA_PLUS',
  time_series_timestamp_col = 'parsed_date',
  time_series_data_col = 'total_visits',
  auto_arima = TRUE,
  data_frequency = 'AUTO_FREQUENCY',
  decompose_time_series = TRUE
) AS
SELECT
  PARSE_TIMESTAMP('%Y%m%d', date) AS parsed_date,
  SUM(totals.visits) AS total_visits
FROM `bigquery-public-data.google_analytics_sample.ga_sessions_*`
GROUP BY date;
  1. 自動チューニングで選ばれた候補モデルの評価指標を確認します。
SELECT non_seasonal_p, non_seasonal_d, non_seasonal_q, has_drift, aic
FROM ML.ARIMA_EVALUATE(MODEL `PROJECT_ID.handson_ch13.ga_arima_model`);

期待される出力: 候補モデルごとの ARIMA 次数と AIC(小さいほど当てはまりが良い)が並びます。

  1. 30 日先までの訪問数を、信頼度 90% の予測区間つきで取得します。
SELECT forecast_timestamp, forecast_value, prediction_interval_lower_bound, prediction_interval_upper_bound
FROM ML.FORECAST(
  MODEL `PROJECT_ID.handson_ch13.ga_arima_model`,
  STRUCT(30 AS horizon, 0.9 AS confidence_level)
)
ORDER BY forecast_timestamp;

期待される出力: 30 行の予測値。forecast_value は予測区間の上下限の平均値です。

後片付け:

bq rm -f --model PROJECT_ID:handson_ch13.ga_arima_model
bq rm -r -f -d PROJECT_ID:handson_ch13

つまずきポイント

CREATE MODEL の請求額に驚く: 内部学習モデルの CREATE MODEL は通常のクエリの 50 倍($312.50/TiB)です。無料枠 1 TiB を通常のクエリ感覚で使い切っていると、同じ量のデータで CREATE MODEL を回しただけで数十ドル規模の請求になり得ます。学習前に必ず dry run で処理バイト量を見積もってください。
ML.EVALUATE がラベル列を見つけられない: input_label_cols を省略した場合、学習データに label という名前の列がないとエラーになります。列名を明示したい場合は必ず input_label_cols を指定してください。
行列分解モデルがオンデマンドで作れない: MATRIX_FACTORIZATION はオンデマンド課金では非対応で、Editions(Enterprise 以上)または予約(reservations)を持つプロジェクトでのみ作成できます。レコメンドモデルを試すには課金モデルの見直しが必要です。
ARIMA_PLUS のタイムスタンプ列の型不一致: time_series_timestamp_col に指定する列は TIMESTAMP / DATE / DATETIME のいずれかである必要があります。文字列型の日付をそのまま渡すとエラーになるため、PARSE_TIMESTAMP 等で明示的に変換してください。

理解度チェック

Q1. BigQuery ML が「データを持ち出さない ML」と言われる理由は?

学習(CREATE MODEL)も推論(ML.PREDICT 等)もすべて BigQuery 上の SQL 文として実行され、データを外部の ML 環境へエクスポートする必要がないためです。内部学習モデルであれば学習自体も BigQuery 内で完結します。

Q2. 内部学習モデル(線形回帰・k-means・ARIMA_PLUS 等)の CREATE MODEL の課金レートは、通常のクエリと比べてどうなっていますか?

通常のオンデマンドクエリが $6.25/TiB であるのに対し、これらの内部学習モデルの CREATE MODEL は $312.50/TiB、つまり 50 倍の単価で課金されます。評価・推論(ML.EVALUATE / ML.PREDICT 等)は通常のクエリと同額で、無料枠にも含まれます。

Q3. TRANSFORM 句を使う利点は何ですか?

学習時に指定した前処理(特徴量変換)がモデルに保存され、ML.PREDICT や ML.EVALUATE の際に未加工の元データを渡すだけで自動的に同じ変換が適用される点です。推論のたびに前処理コードを人間が再現する必要がありません。

Q4.(シナリオ)会員の購買履歴から、まだ定義されていない自然な顧客グループを見つけたい。正解ラベルは存在しません。最も適したモデルタイプは?
A. LOGISTIC_REG B. KMEANS C. ARIMA_PLUS D. LINEAR_REG

B。 ラベルが存在しない教師なしのデータセグメンテーションには K-means が適しています。A と D はラベル付きデータが前提の教師あり学習で、正解の分類やスコアがない今回の要件には使えません。C は時間軸に沿った将来値の予測が目的のモデルで、グルーピングには使いません。

Q5.(シナリオ)日次の売上データに週次の季節性と祝日の影響があり、来月の売上を自動で予測したい。休日の影響やスパイクの自動処理も期待している。最も適したモデルタイプは?
A. LINEAR_REG B. KMEANS C. ARIMA_PLUS D. BOOSTED_TREE_REGRESSOR

C。 ARIMA_PLUS は季節性・休日効果・スパイクやディップを自動的に検出し調整する時系列専用モデルです。A や D は時間軸を前提としない通常の回帰モデルで季節性を自動処理せず、B はそもそも予測モデルではありません。

まとめと次章へ