CREATE MODEL ステートメント

dynamic setvar launch_stage beta dynamic endsetvar dynamic setvar launch_type product dynamic endsetvar dynamic setvar launch_name BigQuery ML dynamic endsetvar dynamic include /docs/includes/___info_launch_stage_disclaimer

BigQuery ML のモデル

BigQuery ML のモデルは、ML システムがトレーニング データから学習したモデルです。

BigQuery ML では、次の 2 種類のモデルがサポートされています。

  • 線形回帰(予測) - たとえば、特定の日の商品アイテムの売上。ラベルは実数です(+/- 無限または NaN にできません)。
  • 2 項ロジスティック回帰(分類) - たとえば、ユーザーが購入をするかどうかの判断。ラベルの値は 2 つだけです。

BigQuery ML では、トレーニングや予測を行う際に 1 つのモデルで複数の BigQuery データセットのデータを使用できます。

モデルのトレーニングや予測を行う際に、デフォルトでカテゴリ変数BOOLSTRINGBYTESDATEDATETIME または TIME 型)がワンホット エンコーディングされます。

現在、TIMESTAMP はデフォルトではワンホット エンコーディングされません。BigQuery ML で TIMESTAMP 列をカテゴリとして扱うには、CAST 関数を使用して、この列を STRING にキャストします。

ワンホット エンコーディングされた特徴の場合、各列の値は [<String_Value, Weight>] という形式の構造体配列になります。配列の長さは、その特徴のカーディナリティ(値の数)になります。特徴は予測で使用する入力変数です。

数値変数(NUMERICFLOAT64 または INT64 型)は、デフォルトで標準化されます。また、標準化の結果は予測中に自動的に適用されます。

CREATE MODEL ステートメント

BigQuery でモデルを作成するには、BigQuery ML の CREATE MODEL ステートメントを使用します。このステートメントは、CREATE TABLE DDL ステートメントに似ています。CREATE MODEL ステートメントを含む標準 SQL クエリを実行すると、クエリを処理するクエリジョブが生成されます。

CREATE MODEL の制限事項

BigQuery ML の CREATE MODEL ステートメントには次の制限があります。

  • CREATE MODEL ステートメントを使用する場合、モデルのサイズは 90 MB 以下にする必要があります。このサイズを超えると、クエリが失敗します。一般に、すべてのカテゴリ変数が短い文字列であれば、合計で 5 〜 10 MB の特徴カーディナリティ(モデルの次元)がサポートされます。次元数は、文字列変数のカーディナリティと長さによって変わります。
  • CREATE MODEL ステートメントを使用した場合、ラベル列を NULL 値にできません。ラベル列に NULL 値が含まれていると、クエリが失敗します。
  • 現在、CREATE MODEL IF NOT EXISTS 句を使用すると、モデルの最終変更タイムスタンプが常に更新されます。
  • 現在、東京リージョンでは CREATE OR REPLACE MODEL 句を使用できません。
  • 東京リージョンでは、CREATE MODEL ステートメントに warm_start オプションを使用できません。

CREATE MODEL の構文

{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL}
model_name
[OPTIONS(model_option_list)]
[AS query_statement]

ここで:

{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL} は、次のステートメントのいずれかです。

  • CREATE MODEL - 指定されたデータセットに新しいモデルを作成し、トレーニングします。モデル名が存在する場合、CREATE MODEL はエラーを返します。分割オプションを指定しない限り、トレーニング データセットがトレーニング データと評価データに自動的に分割されます。
  • CREATE MODEL IF NOT EXISTS - 指定したデータセットにモデルが存在しない場合にのみ、新しいモデルを作成してトレーニングします。
  • CREATE OR REPLACE MODEL - モデルを作成してトレーニングし、指定したデータセット内に存在する同じ名前のモデルと置き換えます。

CREATE MODEL ステートメントは、以下の規則に従う必要があります。

  • 使用できる CREATE ステートメントは 1 つのみ。
  • 線形回帰モデルの場合、label 列を実数にする(+/- 無限または NaN にできません)。
  • ロジスティック回帰モデルの場合、ラベル列の値は 2 つの固有値にする。
  • model_option_list では、model_type オプションが必須です。他はすべて省略可能です。

model_name

model_name は、作成または置換するモデルの名前です。モデル名はデータセット内で一意である必要があります。モデル名は、BigQuery テーブルと同じ命名規則に従う必要があります。モデル名の条件は次のとおりです。

  • 1,024 文字以内
  • 英字(大文字または小文字)、数字、アンダースコアだけが含まれている

model_name では、大文字と小文字は区別されません。

デフォルト プロジェクトを構成していない場合は、`[PROJECT_ID].[DATASET].[MODEL]`(バッククォートを含む)の形式で指定する必要があります(例: `myproject.mydataset.mymodel`)。

model_option_list

model_option_list を使用すると、追加のモデル オプションを指定できます。カンマ区切りリストを使用して、複数のオプションを含めることができます。

モデル オプション リストは次の形式で指定します。

NAME=VALUE, ...

NAMEVALUE は、次のいずれかの組み合わせである必要があります。

NAME VALUE 詳細
model_type

linear_reg

logistic_reg

linear_reg線形回帰モデルを作成します。

logistic_regロジスティック回帰モデルを作成します。

model_type オプションは必須です。他はすべて省略可能です。

input_label_cols STRING

トレーニング データのラベル列名。input_label_cols は文字列配列を受け入れますが、linear_reg モデルと logistic_reg モデルでサポートされるのは 1 つの配列要素のみです。

labels が未指定の場合は、トレーニング データで「label」という名前の列が使用されます。どちらも存在しない場合、クエリは失敗します。

線形回帰モデルの場合、ラベル列は実数にする必要があります(列の値が実数でなければなりません)。ロジスティック回帰モデルの場合、ラベル列の値は 2 つの固有値にする必要があります。

l1_reg FLOAT64

適用する L1 正規化の量。デフォルト値は 0 です。

l2_reg FLOAT64

適用する L2 正規化の量。デフォルト値は 0 です。

max_iterations INT64

トレーニングの最大繰り返し回数(ステップ数)。デフォルト値は 20 です。

learn_rate_strategy line_search
constant

トレーニング中に学習率を指定する方法を選択します。デフォルト値は line_search です。

直線探索を選択すると、トレーニングの速度が遅くなり、処理されるバイト数が増加します。初期学習率に高い値を指定しても収束するかどうかが問題となります。

繰り返しごとにモデル learn_rate が倍増しているように見える場合は、最後に 2 倍になった学習率を ls_init_learn_rate に設定してみてください(モデルの状態は ml.training_info で確認できます)。最適な初期学習率はモデルごとに異なります。あるモデルに最適な初期学習率が別のモデルでも最適とは限りません。

learn_rate FLOAT64

learn_rate_strategyconstant に設定されたときの勾配降下の学習率。learn_rate_strategyline_search に設定されている場合、エラーが返されます。デフォルト値は 0.1 です。

early_stop BOOL

最初の繰り返しで、相対損失改善値が min_rel_progress を上回らない場合、トレーニングを停止します。デフォルト値は true です。

min_rel_progress FLOAT64

early_stop が true に設定されている場合に、トレーニングの継続に最低限必要な相対損失改善値。たとえば、値を 0.01 に設定した場合、繰り返しごとに損失が 1% 減少すると、トレーニングが継続します。デフォルト値は 0.01 です。

data_split_method

auto_split

random

custom

seq

no_split

入力データをトレーニング セットと評価セットに分割する方法。トレーニング データは、モデルのトレーニングに使用されます。評価データは、早期停止により過学習を避けるために使用されます。デフォルト値は auto_split です。

random は、データをランダムに分割します。ランダムな分割は非確定的です。別のトレーニングを実行すると、分割結果が異なります。

custom は、ユーザー提供の BOOL(ブール値)列を使用してデータを分割します。ブール値が true になっている行が評価データとして使用されます。値が false の行はトレーニング データとして使用されます。

seq は、ユーザー提供の列を使用してデータを順番に分割します。列には、順序付け可能なデータ型(NUMERIC、STRING、TIMESTAMP)を使用できます。分割値がしきい値を下回る行がトレーニング データとして使用されます。残りの行(NULL を含む)は評価データとして使用されます。

no_split は、すべてのデータをトレーニング データとして使用します。

data_split_method が未指定の場合、または auto_split に明示的に設定されている場合、次のように自動分割が行われます。

  1. 入力データが 500 行未満の場合、すべての行がトレーニング データとして使用されます。
  2. 入力データが 500 〜 50,000 行の場合、データの 20% が random 分割で処理され、評価データとして使用されます。
  3. 入力データが 50,000 行を超える場合、10,000 行が random 分割で処理され、評価データとして使用されます。
data_split_eval_fraction FLOAT64

このオプションは、randomseq 分割で使用します。data_split_eval_fraction には、評価に使用するデータの割合を小数点以下 2 桁までの精度で指定します。デフォルト値は 0.2 です。

data_split_col STRING

このオプションには、データの分割に使用する列を指定します。この列は特徴やラベルとして使用できません。特徴から自動的に除外されます。

data_split_methodcustom の場合、対応する列は BOOL 型でなければなりません。値が true または NULL の行は評価データとして使用されます。false 値の行は、トレーニング データとして使用されます。

data_split_methodseq の場合、対応する列の最後の data_split_fraction 行(最小から最大)が評価データとして使用されます。最初の行はトレーニング データとして使用されます。

ls_init_learn_rate DOUBLE

learn_rate_strategy='line_search' が使用する初期学習率を設定します。このオプションは、line_search が指定されている場合にのみ使用できます。

warm_start BOOL

このオプションは、新しいトレーニング データや新しいモデル オプションを使用するモデルを再トレーニングする場合に使用します。明示的にオーバーライドされない限り、モデル トレーニングの初期オプションはウォーム スタートの実行時に使用されます。デフォルト値は false です。

ウォーム スタートでは、繰り返し番号が 0 にリセットされます。training_run 番号または TIMESTAMP 列は、元の実行とウォーム スタートの区別に使用できます。

ウォーム スタートでは model_typelabels オプションは変更できません。トレーニング データスキーマも変更できません。

query_statement

AS query_statement 句は、トレーニング データの生成に使用する標準 SQL クエリを指定します。query_statement 句でサポートされる SQL 構文については、標準 SQL クエリ構文ページをご覧ください。

input_label_colsdata_split_col に含まれる列を除き、query_statement で参照されているすべての列がモデルへの入力として使用されます。

CREATE MODEL の例

CREATE MODEL ステートメントは、指定されたオプションでモデルを作成します。モデル名がデータセット内に存在する場合、次のエラーが返されます。

Already Exists: [PROJECT_ID]:[DATASET].[MODEL]

既存のモデルを置き換える場合は、CREATE OR REPLACE MODEL ステートメントを使用します。

次の例では、デフォルト プロジェクトの mydatasetmymodel という名前のモデルを作成します。

線形回帰モデルのトレーニング

次の例では、線形回帰モデルを作成してトレーニングします。学習率は .15 に設定し、L1 正規化は 1 に設定しています。また、トレーニングの最大繰り返し回数は 5 に設定しています。

CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  ( model_type='linear_reg',
    ls_init_learn_rate=.15,
    l1_reg=1,
    max_iterations=5 ) AS
SELECT
  column1,
  column2,
  column3,
  label
FROM
  `mydataset.mytable`
WHERE
  column4 < 10

順次データ分割で線形回帰モデルをトレーニングする

次の例では、順次データ分割で線形回帰モデルを作成します。分割精度は .3 で、timestamp 列で分割を行います。

CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  ( model_type='linear_reg',
    ls_init_learn_rate=.15,
    l1_reg=1,
    max_iterations=5,
    data_split_method='seq',
    data_split_eval_fraction=0.3,
    data_split_col='timestamp' ) AS
SELECT
  column1,
  column2,
  column3,
  timestamp,
  label
FROM
  `mydataset.mytable`
WHERE
  column4 < 10

カスタムデータ分割で線形回帰モデルをトレーニングする

次の例では、手動でデータをトレーニング テーブルと評価テーブルに分割します。トレーニング テーブルの名前は training_table です。評価テーブルの名前は evaluation_table です。

次のコマンドは、カスタム分割方法で線形回帰モデルを作成し、評価テーブルのデータとトレーニング テーブルのデータを使用してモデルをトレーニングします。

CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  ( model_type='linear_reg',
    data_split_method='custom',
    data_split_col='split_col' ) AS
SELECT
  *,
  false AS split_col
FROM
  `mydataset.training_table`
UNION ALL
SELECT
  *,
  true AS split_col
FROM
  `mydataset.evaluation_table`

この例では、トレーニング テーブルと評価テーブルのすべての列が特徴またはラベルになります。このクエリでは、SELECT *UNION ALL を使用して、split_col 列のすべてのデータを既存のデータに追加しています。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。