このチュートリアルでは、行列分解モデルを作成し、movielens1m
データセット内の顧客の映画レーティングでトレーニングする方法について説明します。次に、行列分解モデルを使用して、ユーザーにおすすめの映画を生成します。
ユーザー提供の評価を使用してモデルをトレーニングすることを、明示的なフィードバックによるトレーニングと呼びます。明示的なフィードバックをトレーニング データとして使用する場合、行列分解モデルは交互最小二乗アルゴリズムを使用してトレーニングされます。
目標
このチュートリアルでは、次のタスクについて説明します。
CREATE MODEL
ステートメントを使用して行列分解モデルを作成する。ML.EVALUATE
関数を使用してモデルを評価する。ML.RECOMMEND
関数でモデルを使用して、ユーザー向けの映画レコメンデーションを生成します。
料金
このチュートリアルでは、Google Cloud の課金対象となる次のコンポーネントを使用します。
- BigQuery
- BigQuery ML
BigQuery の費用の詳細については、BigQuery の料金ページをご覧ください。
BigQuery ML の費用の詳細については、BigQuery ML の料金をご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトで BigQuery を有効にするには、
Enable the BigQuery API.
に移動します。
必要な権限
- データセットを作成するには、
bigquery.datasets.create
IAM 権限が必要です。 接続リソースを作成するには、次の権限が必要です。
bigquery.connections.create
bigquery.connections.get
モデルを作成するには、次の権限が必要です。
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
bigquery.connections.delegate
推論を実行するには、次の権限が必要です。
bigquery.models.getData
bigquery.jobs.create
BigQuery における IAM ロールと権限の詳細については、IAM の概要をご覧ください。
データセットの作成
ML モデルを格納する BigQuery データセットを作成します。
Google Cloud コンソールで [BigQuery] ページに移動します。
[エクスプローラ] ペインで、プロジェクト名をクリックします。
「アクションを表示」> [データセットを作成] をクリックします。
[データセットを作成する] ページで、次の操作を行います。
[データセット ID] に「
bqml_tutorial
」と入力します。[ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。
一般公開データセットは
US
マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。
Movielens データをアップロードする
bq コマンドライン ツールを使用して、movielens1m
データを BigQuery にアップロードします。
movielens1m
データをアップロードする手順は次のとおりです。
Cloud Shell を開きます。
評価データを
ratings
テーブルにアップロードします。コマンドラインで、次のクエリを貼り付けてEnter
キーを押します。curl -O 'http://files.grouplens.org/datasets/movielens/ml-1m.zip' unzip ml-1m.zip sed 's/::/,/g' ml-1m/ratings.dat > ratings.csv bq load --source_format=CSV bqml_tutorial.ratings ratings.csv \ user_id:INT64,item_id:INT64,rating:FLOAT64,timestamp:TIMESTAMP
映画データを
movies
テーブルにアップロードします。コマンドラインで次のクエリを貼り付け、Enter
キーを押します。sed 's/::/@/g' ml-1m/movies.dat > movie_titles.csv bq load --source_format=CSV --field_delimiter=@ \ bqml_tutorial.movies movie_titles.csv \ movie_id:INT64,movie_title:STRING,genre:STRING
モデルを作成する
行列分解モデルを作成し、ratings
テーブルのデータをトレーニングします。このモデルは、ユーザーが提供した映画の評価に基づいて、すべてのユーザー - アイテム ペアの評価を予測するようにトレーニングされています。
次の CREATE MODEL
ステートメントは、これらの列を使用して推奨事項を生成します。
user_id
- ユーザー ID。item_id
- 映画 ID。rating
- ユーザーがアイテムに与えた 1 ~ 5 の明示的な評価。
モデルを作成する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
CREATE OR REPLACE MODEL `bqml_tutorial.mf_explicit` OPTIONS ( MODEL_TYPE = 'matrix_factorization', FEEDBACK_TYPE = 'explicit', USER_COL = 'user_id', ITEM_COL = 'item_id', L2_REG = 9.83, NUM_FACTORS = 34) AS SELECT user_id, item_id, rating FROM `bqml_tutorial.ratings`;
クエリが完了するまでに約 10 分かかります。完了すると、
mf_explicit
モデルが [エクスプローラ] ペインに表示されます。クエリはCREATE MODEL
ステートメントを使用してモデルを作成するため、クエリの結果は表示されません。
トレーニングの統計情報を取得する
必要に応じて、Google Cloud コンソールでモデルのトレーニング統計情報を表示できます。
機械学習アルゴリズムは、さまざまなパラメータを使用してモデルを反復処理し、損失を最小限に抑えるモデルのバージョンを選択することでモデルを構築します。このプロセスを経験損失最小化と呼びます。モデルのトレーニング統計情報では、モデルの各反復処理に関連付けられた損失を確認できます。
モデルのトレーニング統計情報を表示する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
[エクスプローラ] ペインでプロジェクトを開き、
bqml_tutorial
データセットを開き、[モデル] フォルダを開きます。mf_explicit
モデルをクリックし、[トレーニング] タブをクリックします。[表示形式] セクションで、[テーブル] をクリックします。結果は次のようになります。
+-----------+--------------------+--------------------+ | Iteration | Training Data Loss | Duration (seconds) | +-----------+--------------------+--------------------+ | 11 | 0.3943 | 42.59 | +-----------+--------------------+--------------------+ | 10 | 0.3979 | 27.37 | +-----------+--------------------+--------------------+ | 9 | 0.4038 | 40.79 | +-----------+--------------------+--------------------+ | ... | ... | ... | +-----------+--------------------+--------------------+
[トレーニング データの損失] 列は、モデルのトレーニング後に計算された損失指標を表します。これは行列分解モデルであるため、この列には平均二乗誤差が表示されます。
ML.TRAINING_INFO
関数を使用して、モデルのトレーニング統計情報を確認することもできます。
モデルを評価する
ML.EVALUATE
関数を使用してモデルのパフォーマンスを評価します。ML.EVALUATE
関数は、モデルから返された予測映画評価を、トレーニング データの実際のユーザー映画評価と比較して評価します。
モデルを評価する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
SELECT * FROM ML.EVALUATE( MODEL `bqml_tutorial.mf_explicit`, ( SELECT user_id, item_id, rating FROM `bqml_tutorial.ratings` ));
結果は次のようになります。
+---------------------+---------------------+------------------------+-----------------------+--------------------+--------------------+ | mean_absolute_error | mean_squared_error | mean_squared_log_error | median_absolute_error | r2_score | explained_variance | +---------------------+---------------------+------------------------+-----------------------+--------------------+--------------------+ | 0.48494444327829156 | 0.39433706592870565 | 0.025437895793637522 | 0.39017059802629905 | 0.6840033369412044 | 0.6840033369412264 | +---------------------+---------------------+------------------------+-----------------------+--------------------+--------------------+
評価結果における重要な測定指標は、R2 スコアです。R2 スコアは、線形回帰予測が実際のデータに近似するかどうかを決定する統計的尺度です。
0
の値は、平均値周辺のレスポンス データにばらつきがないことを示しています。1
の値は、平均値周辺のレスポンス データにばらつきがあることを示しています。ML.EVALUATE
関数の出力の詳細については、行列分解モデルをご覧ください。
また、入力データを指定せずに ML.EVALUATE
を呼び出すこともできます。これはトレーニングで計算された評価指標を使用します。
ユーザー / アイテムペアのサブセットの予測評価を取得する
ML.RECOMMEND
を使用して、5 人のユーザーが各映画に付けた評価の予測値を取得します。
予測レーティングを取得する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
SELECT * FROM ML.RECOMMEND( MODEL `bqml_tutorial.mf_explicit`, ( SELECT user_id FROM `bqml_tutorial.ratings` LIMIT 5 ));
結果は次のようになります。
+--------------------+---------+---------+ | predicted_rating | user_id | item_id | +--------------------+---------+---------+ | 4.2125303962491873 | 4 | 3169 | +--------------------+---------+---------+ | 4.8068920531981263 | 4 | 3739 | +--------------------+---------+---------+ | 3.8742203494732403 | 4 | 3574 | +--------------------+---------+---------+ | ... | ... | ... | +--------------------+---------+---------+
レコメンデーションの生成
予測された評価を使用して、各ユーザーの上位 5 つのおすすめ映画を生成します。
推奨事項を生成する手順は次のとおりです。
Google Cloud コンソールで [BigQuery] ページに移動します。
予測された評価をテーブルに書き込みます。クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
CREATE OR REPLACE TABLE `bqml_tutorial.recommend` AS SELECT * FROM ML.RECOMMEND(MODEL `bqml_tutorial.mf_explicit`);
予測された評価を映画情報と結合し、ユーザーごとに上位 5 件の結果を選択します。クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
SELECT user_id, ARRAY_AGG(STRUCT(movie_title, genre, predicted_rating) ORDER BY predicted_rating DESC LIMIT 5) FROM ( SELECT user_id, item_id, predicted_rating, movie_title, genre FROM `bqml_tutorial.recommend` JOIN `bqml_tutorial.movies` ON item_id = movie_id ) GROUP BY user_id;
結果は次のようになります。
+---------+-------------------------------------+------------------------+--------------------+ | user_id | f0_movie_title | f0_genre | predicted_rating | +---------+-------------------------------------+------------------------+--------------------+ | 4597 | Song of Freedom (1936) | Drama | 6.8495752907364009 | | | I Went Down (1997) | Action/Comedy/Crime | 6.7203235758772877 | | | Men With Guns (1997) | Action/Drama | 6.399407352232001 | | | Kid, The (1921) | Action | 6.1952890198126731 | | | Hype! (1996) | Documentary | 6.1895766097451475 | +---------+-------------------------------------+------------------------+--------------------+ | 5349 | Fandango (1985) | Comedy | 9.944574012151549 | | | Breakfast of Champions (1999) | Comedy | 9.55661860430112 | | | Funny Bones (1995) | Comedy | 9.52778917835076 | | | Paradise Road (1997) | Drama/War | 9.1643621767929133 | | | Surviving Picasso (1996) | Drama | 8.807353289233772 | +---------+-------------------------------------+------------------------+--------------------+ | ... | ... | ... | ... | +---------+-------------------------------------+------------------------+--------------------+
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
- 作成したプロジェクトを削除する。
- または、プロジェクトを保存して、データセットを削除する。
データセットを削除する
プロジェクトを削除すると、プロジェクト内のデータセットとテーブルがすべて削除されます。プロジェクトを再利用する場合は、このチュートリアルで作成したデータセットを削除できます。
必要に応じて、Google Cloud コンソールで BigQuery ページを開きます。
ナビゲーションで、作成した bqml_tutorial データセットをクリックします。
ウィンドウの右側にある [データセットを削除] をクリックします。この操作を行うと、データセット、テーブル、すべてのデータが削除されます。
[データセットの削除] ダイアログ ボックスでデータセットの名前(
bqml_tutorial
)を入力し、[削除] をクリックして確定します。
プロジェクトの削除
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
次のステップ
- 暗黙的なフィードバックに基づいて行列分解モデルを作成することを試してください。
- BigQuery ML の概要で BigQuery ML の概要を確認する。
- 機械学習集中講座で機械学習について学習する。