行列分解の CREATE MODEL
ステートメント
BigQuery で行列分解モデルを作成するには、BigQuery ML の CREATE MODEL
ステートメントを使用し、MODEL_TYPE
を 'MATRIX_FACTORIZATION'
に指定します。
CREATE MODEL
の構文
{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL} model_name OPTIONS(MODEL_TYPE = 'MATRIX_FACTORIZATION' [, FEEDBACK_TYPE = {'EXPLICIT' | 'IMPLICIT'} ] [, NUM_FACTORS = int64_value ] [, USER_COL = string_value ] [, ITEM_COL = string_value ] [, RATING_COL = string_value ] [, WALS_ALPHA = float64_value ] [, L2_REG = float64_value ] [, MAX_ITERATIONS = int64_value ] [, EARLY_STOP = { TRUE | FALSE } ] [, MIN_REL_PROGRESS = float64_value ] [, DATA_SPLIT_METHOD = { 'AUTO_SPLIT' | 'RANDOM' | 'CUSTOM' | 'SEQ' | 'NO_SPLIT' } ] [, DATA_SPLIT_EVAL_FRACTION = float64_value ] [, DATA_SPLIT_COL = string_value ]) AS query_statement
CREATE MODEL
指定したデータセットに新しい BigQuery ML モデルを作成します。モデル名が存在する場合、CREATE MODEL
はエラーを返します。
CREATE MODEL IF NOT EXISTS
指定されたデータセットにモデルが存在しない場合にのみ、新しい BigQuery ML モデルを作成します。
CREATE OR REPLACE MODEL
新しい BigQuery ML モデルを作成し、指定されたデータセット内で同じ名前の既存のモデルをすべて置き換えます。
model_name
model_name
は、作成または置き換える BigQuery ML モデルの名前です。モデル名は、データセットごとに一意である必要があります。他のモデルやテーブルに同じ名前を付けることはできません。モデル名は、BigQuery テーブルと同じ命名規則に従う必要があります。モデル名に使用できるものは次のとおりです。
- 1,024 文字まで
- 大文字、数字、アンダースコアのいずれかの文字
model_name
では、大文字と小文字は区別されません。
デフォルトのプロジェクトを構成していない場合は、バッククォートを含め、次の形式でプロジェクト ID をモデル名の前に追加します。
`[PROJECT_ID].[DATASET].[MODEL]`
次に例を示します。
`myproject.mydataset.mymodel`
CREATE MODEL
は、次のオプションをサポートします。
MODEL_TYPE
構文
MODEL_TYPE = 'MATRIX_FACTORIZATION'
説明
モデルタイプを指定します。行列分解モデルを作成するには、model_type
を 'MATRIX_FACTORIZATION'
に設定します。
model_option_list
model_option_list
において、model_type
オプションが必要です。他はすべて省略可能です。
行列分解モデルは、次のオプションをサポートしています。
FEEDBACK_TYPE
構文
FEEDBACK_TYPE = { 'EXPLICIT' | 'IMPLICIT' }
説明
行列分解モデルのフィードバック タイプを指定します。フィードバック タイプによって、トレーニング中に使用されるアルゴリズムが決まります。
評価(ユーザー フィードバック)には、'EXPLICIT'
と 'IMPLICIT'
の 2 種類があります。ユースケースに応じて、モデル作成オプションで必要なフィードバック タイプを使用します。
ユーザーが映画のおすすめなどのアイテムに評価(1~5 など)を明示している場合は、
FEEDBACK_TYPE='EXPLICIT'
を指定します。これにより、交互最小二乗アルゴリズムを使用してモデルがトレーニングされます。プロダクトのレコメンデーションの問題の大部分には、ユーザーからの明示的なフィードバックがありません。代わりに、評価値は、ユーザーによるアイテムの操作(クリック、ページビュー、購入など)に基づいて人為的に構築される必要があります。この場合、
FEEDBACK_TYPE='IMPLICIT'
を指定します。これにより、加重交互最小二乗アルゴリズムを使用してモデルがトレーニングされます。
2 つのフィードバック タイプの違いと、どのような場合にどのタイプを使用するかについては、フィードバック タイプに関する追加情報をご覧ください。
引数
デフォルト値は 'EXPLICIT'
です。
NUM_FACTORS
構文
NUM_FACTORS = int64_value
説明
行列分解モデルに使用する潜在的要素の数を指定します。
引数
int64_value
は 'INT64'
です。指定できる値は 2~200 です。デフォルト値は log2(n)
です。ここで、n
はトレーニング例の数です。
USER_COL
構文
USER_COL = string_value
説明
行列分解モデルのユーザー列名。
引数 string_value
は 'STRING'
です。デフォルト値は 'user'
です。
ITEM_COL
構文
ITEM_COL = string_value
説明
行列分解モデルの項目列名。
引数 string_value
は 'STRING'
です。デフォルト値は 'item'
です。
RATING_COL
構文
RATING_COL = string_value
説明
行列分解モデルの評価列名。
引数 string_value
は 'STRING'
です。デフォルト値は 'rating'
です。
WALS_ALPHA
構文
WALS_ALPHA = float64_value
説明
'IMPLICIT'
行列分解モデルのハイパーパラメータ。
詳細については、フィードバック タイプに関する追加情報をご覧ください。
引数 float64_value
は 'FLOAT64'
です。デフォルト値は 40 です。
L2_REG
構文
L2_REG = float64_value
説明
適用する L2 正規化の量。
引数
float64_value
は FLOAT64
です。デフォルト値は 1.0 です。
MAX_ITERATIONS
構文
MAX_ITERATIONS = int64_value
説明
トレーニングの最大繰り返し回数またはステップ数。
引数
int64_value
は INT64
です。デフォルト値は 20 です。
EARLY_STOP
構文
EARLY_STOP = { TRUE | FALSE }
説明
最初の繰り返しで、相対損失改善値が MIN_REL_PROGRESS に指定された値より小さい場合、トレーニングを停止するかどうか。
引数
値は BOOL
です。デフォルト値は TRUE
です。
MIN_REL_PROGRESS
構文
MIN_REL_PROGRESS = float64_value
説明
EARLY_STOP
が true に設定されている場合に、トレーニングの継続に最低限必要な相対損失改善値。たとえば、値を 0.01 に設定した場合、繰り返しごとに損失が 1% 減少すると、トレーニングが継続します。
引数
float64_value
は FLOAT64
です。デフォルト値は 0.01 です。
DATA_SPLIT_METHOD
構文
DATA_SPLIT_METHOD = { 'AUTO_SPLIT' | 'RANDOM' | 'CUSTOM' | 'SEQ' | 'NO_SPLIT' }
説明
入力データをトレーニング セットと評価セットに分割する方法。トレーニング データは、モデルのトレーニングに使用されます。評価データは、早期停止により過学習を避けるために使用されます。
引数
次の値を受け入れます。
'AUTO_SPLIT'
- 自動分割戦略は次のとおりです。
- 入力データが 500 行未満の場合、すべての行がトレーニング データとして使用されます。
- 入力データが 500~50,000 行の場合、データの 20% が
RANDOM
分割で処理され、評価データとして使用されます。 - 入力データが 50,000 行を超える場合、10,000 行が
RANDOM
分割で処理され、評価データとして使用されます。
'RANDOM'
- データをランダムに分割します。ランダムな分割は確定的です。基となるトレーニング データが同じであれば、別のトレーニングを行っても同じ分割結果が生成されます。
'CUSTOM'
- お客様提供の BOOL
型の列を使用してデータを分割します。値が TRUE
の行は、評価データとして使用されます。値が FALSE
の行は、トレーニング データとして使用されます。
'SEQ'
- お客様提供の列を使用してデータを順番に分割します。列には、順序付け可能なデータ型(NUMERIC
、STRING
、TIMESTAMP
)が使用できます。分割値がしきい値を下回る行は、トレーニング データとして使用されます。残りの行(NULLs
を含む)は、評価データとして使用されます。
'NO_SPLIT'
- すべてのデータをトレーニング データとして使用します。
DATA_SPLIT_EVAL_FRACTION
構文
DATA_SPLIT_EVAL_FRACTION = float64_value
説明
このオプションは、'RANDOM'
と 'SEQ'
分割で使用します。評価に使用するデータの割合を、小数点以下 2 桁までの精度で指定します。
引数
float64_value
は FLOAT64
です。デフォルト値は 0.2 です。
DATA_SPLIT_COL
構文
DATA_SPLIT_COL = string_value
説明
データの分割に使用する列を識別します。この列は特徴やラベルとして使用できません。特徴からは自動的に除外されます。
DATA_SPLIT_METHOD
の値が'CUSTOM'
の場合、対応する列はBOOL
型になります。値がTRUE
やNULL
の行は、評価データとして使用されます。値がFALSE
の行は、トレーニング データとして使用されます。DATA_SPLIT_METHOD
の値が'SEQ'
の場合、対応する列の最後の n 行(最小から最大)が評価データとして使用されます。ここで、n はDATA_SPLIT_EVAL_FRACTION
に指定された値です。最初の行はトレーニング データとして使用されます。
サポートされている入力タイプについては、DATA_SPLIT_COL
でサポートされている入力タイプをご覧ください。
引数
string_value
は STRING
です。
query_statement
AS query_statement
句は、トレーニング データの生成に使用する標準 SQL クエリを指定します。query_statement
句でサポートされる SQL 構文については、標準 SQL クエリ構文をご覧ください。
行列分解モデルの場合、DATA_SPLIT_COL
を使う必要がある DATA_SPLIT_METHOD
をユーザーが指定しない限り、query_statement には必ず 3 つの列(user
、item
、rating
)が含まれます。
サポートされている入力
CREATE MODEL
ステートメントは、ユーザー、アイテム、評価の各列について次のデータ型をサポートしています。
行列分解モデル入力でサポートされているデータ型
BigQuery ML は、行列分解の入力列にさまざまな標準 SQL データ型をサポートしています。各列でサポートされているデータ型は次のとおりです。
Matrix factorization input column |
Supported types |
---|---|
user |
任意の Groupable(グループ分け可能)データ型 |
item |
任意の Groupable(グループ分け可能)データ型 |
rating |
INT64 NUMERIC FLOAT64 |
フィードバック タイプに関する追加情報
レコメンデーション用の優れた行列分解モデルを作成するために重要な点は、最適なアルゴリズムでデータをトレーニングすることです。行列分解モデルの場合、ユーザー - アイテム ペアの評価を取得する方法は 2 つあります。
ユーザーによる入力と設定が必要な評価は、明示的なフィードバックと見なされます。明示的な評価が低い場合はユーザーがアイテムについて非常に否定的に感じたことを意味し、明示的な評価が高い場合はユーザーがアイテムを気に入ったことを意味します。ユーザーが評価を付ける映画ストリーミング サイトは、明示的にラベル付けされたデータセットの例です。明示的なフィードバックの問題では、交互最小二乗アルゴリズム(一般に ALS と呼ばれます)を使用します。ALS は、次の損失関数を最小限に抑えようとします。
ここで
\(x_u = \) ユーザー \(u\) の潜在因子重みベクトル。長さは
NUM_FACTORS
です。\(y_i = \) アイテム \(i\) の潜在因子重みベクトル。長さは
NUM_FACTORS
です。\(\lambda = \)
L2_REG
ただし、ほとんどの時間データはユーザーによってラベル付けされることはほとんどありません。多くの場合、ユーザーがアイテムや映画を高く評価したかどうかを企業側が判断する指標は、クリック率やエンゲージメント時間に限られます。多くの場合、これは代替評価として使用できますが、必ずしもユーザーが何かを好きかどうかを明確に示すものではありません。これらのデータセット内のデータは、暗黙的なフィードバックと見なされます。暗黙的なフィードバックの問題では、このアルゴリズムの別のパターンの加重交互最小二乗(WALS)を使用します。詳細については、http://yifanhu.net/PUB/cf.pdf をご覧ください。このアプローチでは、これらの代替評価を使用して、ユーザーのアイテムに対する信頼度の観測値として扱います。WALS は、次の損失関数を最小限に抑えようとします。
ここで、上記で定義した変数に加えて、この関数は次の変数も導入します。
\(c_{ui} = 1 + \alpha r_{ui}\)
\(\alpha = \)
WALS_ALPHA
明示的な行列分解の場合、入力は通常、既知の固定範囲内の整数です。暗黙的な行列分解の場合、入力評価は倍数またはより広い範囲の整数になる可能性があります。モデルのパフォーマンスが低い場合は、入力評価に外れ値がないことを確認し、入力評価をスケーリングすることをおすすめします。
既知の制限事項
行列分解モデルの CREATE MODEL
ステートメントは、以下の規則に従う必要があります。
「モデルが大きすぎます(100 MB 超)」というエラーが発生した場合は、入力データを確認します。これは、1 人のユーザーまたは 1 つのアイテムに対する評価が多すぎることが原因です。ユーザー列またはアイテム列を
INT64
値にハッシュ化するか、データサイズを小さくすることで解決できます。この問題が発生するかどうかを判断する一般的な数式は次のとおりです。max(num_rated_user, num_rated_item) < 100 million
ここで、num_rated_user は 1 人のユーザーが入力した項目の最大評価で、num_rated_items は特定のアイテムの最大ユーザー評価です。
CREATE MODEL
の例
次の例では、デフォルト プロジェクトにある mydataset
内に mymodel
という名前のモデルを作成します。
明示的なフィードバックを使用して行列分解モデルをトレーニングする
この例では、明示的なフィードバック行列分解モデルを作成します。
CREATE MODEL `project_id.mydataset.mymodel`
OPTIONS(MODEL_TYPE='MATRIX_FACTORIZATION') AS
SELECT
user,
item,
rating
FROM
`mydataset.mytable`
暗黙的なフィードバックを使用して行列分解モデルをトレーニングする
この例では、暗黙的なフィードバック行列分解モデルを作成します。
CREATE MODEL `project_id.mydataset.mymodel`
OPTIONS(MODEL_TYPE='MATRIX_FACTORIZATION',
FEEDBACK_TYPE='IMPLICIT') AS
SELECT
user,
item,
rating
FROM
`mydataset.mytable`
次のステップ
- BigQuery ML での行列分解モデルの使用に関するチュートリアルを確認する。
- BigQuery ML を使用して Google アナリティクス データからレコメンデーションを行う(暗黙的なフィードバック)
- BigQuery ML を使用して映画の評価からレコメンデーションを行う(明示的なフィードバック)