- BigQuery ML が「データを動かさずに SQL だけで学習・推論まで完結させる」仕組み
CREATE MODEL→ML.EVALUATE→ML.PREDICT/ML.FORECASTという 3 段の基本フロー- 解きたい問題の種類(回帰・分類・クラスタリング・時系列)とモデルタイプの対応
- モデルタイプによって最大 50 倍もの開きがある
CREATE MODELの課金構造 TRANSFORM句による前処理の自動化と、Vertex AI との連携の位置づけ
前提: 課金プロジェクト必須(ハンズオン 2 本の合計で概算数円〜十数円)。BigQuery ML は BigQuery エディションの Standard では利用できません。
BigQuery ML の思想 — データを持ち出さない ML
機械学習を試すには、通常「データをウェアハウスから抜き出し、Python の ML フレームワークが動く環境へ運び、学習し、デプロイし、推論結果をまたウェアハウスへ書き戻す」という往復が発生します。BigQuery ML はこの往復そのものを消します。CREATE MODEL 文で学習し、ML.PREDICT で推論する、すべてが SQL の一部です。公式ドキュメントは BigQuery ML を「SQL に習熟した実務者が、既存の SQL ツールとスキルだけでモデルの構築・評価ができる」仕組みと位置づけています。
BigQuery ML が扱うモデルは、学習が実際にどこで行われるかで 4 つに分かれます。この区別は後述する課金の理解にも直結します。
CREATE MODEL 自体が学習ジョブなので課金が発生しますが、リモートモデル(既存の Vertex AI エンドポイントを参照するだけ)とインポートモデル(外部で学習済み)は CREATE MODEL がバイトを処理しないため無課金です。サポートするモデルの全体像
「何を予測したいか」から逆引きすると、モデルタイプの選び方は驚くほどシンプルです。
| MODEL_TYPE | 用途 | 学習の分類 |
|---|---|---|
LINEAR_REG | 数値の予測(回帰) | 内部学習 |
LOGISTIC_REG | 2 値〜最大 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 段です。
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 句で指定した前処理はモデル本体に保存される。予測時は未加工の新しいデータを渡すだけでよく、前処理を人間が再現する必要はない。学習後は 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 / TiB | BigQuery 側の前処理コスト。別途 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 で処理バイト量を確認する癖をつけてください。公開データセットの 344 行の小さなテーブルで線形回帰モデルを作り、評価・予測まで一通り体験します。課金プロジェクト必須(CREATE MODEL は $312.50/TiB ですが、対象データが数十 KB 程度なので概算数円未満)。
- 演習用データセットを作成します(ロケーションは US)。
bq mk --location=US --dataset PROJECT_ID:handson_ch13
- 線形回帰モデルを作成します。ラベル列は
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;
- モデルを評価します。
SELECT * FROM ML.EVALUATE(MODEL `PROJECT_ID.handson_ch13.penguins_model`);
期待される出力: mean_absolute_error / mean_squared_error / r2_score 等の 1 行。r2_score が 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
ECサイトの日次訪問数を ARIMA_PLUS で予測します。課金プロジェクト必須(日次集計後のデータで学習するため概算数円〜十数円。事前に dry run で確認してください)。ハンズオン 13-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;
- 自動チューニングで選ばれた候補モデルの評価指標を確認します。
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(小さいほど当てはまりが良い)が並びます。
- 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 は通常のクエリの 50 倍($312.50/TiB)です。無料枠 1 TiB を通常のクエリ感覚で使い切っていると、同じ量のデータで CREATE MODEL を回しただけで数十ドル規模の請求になり得ます。学習前に必ず dry run で処理バイト量を見積もってください。input_label_cols を省略した場合、学習データに label という名前の列がないとエラーになります。列名を明示したい場合は必ず input_label_cols を指定してください。MATRIX_FACTORIZATION はオンデマンド課金では非対応で、Editions(Enterprise 以上)または予約(reservations)を持つプロジェクトでのみ作成できます。レコメンドモデルを試すには課金モデルの見直しが必要です。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 はそもそも予測モデルではありません。
まとめと次章へ
- BigQuery ML は
CREATE MODEL→ML.EVALUATE→ML.PREDICT/ML.FORECASTという 3 段の SQL だけで、学習から推論までを BigQuery 内で完結させる - モデルは学習場所で 4 分類(内部学習・外部学習・リモート・インポート)され、リモートモデルとインポートモデルは
CREATE MODEL自体が無課金 - 内部学習モデル(線形/ロジスティック回帰・k-means・PCA・ARIMA_PLUS 系)の
CREATE MODELは通常のクエリの 50 倍($312.50/TiB)で課金され、無料枠への算入は明記されていない。学習前の dry run が必須 TRANSFORM句を使えば、前処理を人間が再現せずに推論時へ自動復元できる- 行列分解モデルはオンデマンド非対応、BigQuery ML 自体も Standard エディションでは使えない