このチュートリアルでは、行列分解モデルを作成し、一般公開されている GA360_test.ga_sessions_sample
テーブルの Google アナリティクス 360 ユーザー セッション データでトレーニングする方法について説明します。次に、行列分解モデルを使用して、サイト ユーザー向けのコンテンツ レコメンデーションを生成します。
ユーザー セッションの長さなどの間接的なユーザー設定情報を使用してモデルをトレーニングすることを、暗黙的なフィードバックによるトレーニングと呼びます。トレーニング データとして暗黙的フィードバックを使用する場合、行列分解モデルは加重交互最小二乗アルゴリズムを使用してトレーニングされます。
目標
このチュートリアルでは、次のタスクの手順について説明します。
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.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
推論を実行するには、次の権限が必要です。
bigquery.models.getData
bigquery.jobs.create
BigQuery における IAM ロールと権限の詳細については、IAM の概要をご覧ください。
データセットの作成
ML モデルを保存する BigQuery データセットを作成します。
Google Cloud コンソールで、[BigQuery] ページに移動します。
[エクスプローラ] ペインで、プロジェクト名をクリックします。
「アクションを表示」> [データセットを作成] をクリックします。
[データセットを作成する] ページで、次の操作を行います。
[データセット ID] に「
bqml_tutorial
」と入力します。[ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。
一般公開データセットは
US
マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。
サンプルデータを準備する
GA360_test.ga_sessions_sample
テーブルのデータをモデル トレーニングに適した構造に変換し、このデータを BigQuery テーブルに書き込みます。次のクエリは、コンテンツごとに各ユーザーのセッション時間を計算します。この値は、暗黙的なフィードバックとして使用し、そのコンテンツに対するユーザーの好みを推測できます。
トレーニング データテーブルを作成するには、次の操作を行います。
Google Cloud コンソールで、[BigQuery] ページに移動します。
トレーニング データテーブルを作成します。クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
CREATE OR REPLACE TABLE `bqml_tutorial.analytics_session_data` AS WITH visitor_page_content AS ( SELECT fullVisitorID, ( SELECT MAX( IF( index = 10, value, NULL)) FROM UNNEST(hits.customDimensions) ) AS latestContentId, (LEAD(hits.time, 1) OVER (PARTITION BY fullVisitorId ORDER BY hits.time ASC) - hits.time) AS session_duration FROM `cloud-training-demos.GA360_test.ga_sessions_sample`, UNNEST(hits) AS hits WHERE # only include hits on pages hits.type = 'PAGE' GROUP BY fullVisitorId, latestContentId, hits.time ) # aggregate web stats SELECT fullVisitorID AS visitorId, latestContentId AS contentId, SUM(session_duration) AS session_duration FROM visitor_page_content WHERE latestContentId IS NOT NULL GROUP BY fullVisitorID, latestContentId HAVING session_duration > 0 ORDER BY latestContentId;
トレーニング データのサブセットを表示します。クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
SELECT * FROM `bqml_tutorial.analytics_session_data` LIMIT 5;
結果は次のようになります。
+---------------------+-----------+------------------+ | visitorId | contentId | session_duration | +---------------------+-----------+------------------+ | 7337153711992174438 | 100074831 | 44652 | +---------------------+-----------+------------------+ | 5190801220865459604 | 100170790 | 121420 | +---------------------+-----------+------------------+ | 2293633612703952721 | 100510126 | 47744 | +---------------------+-----------+------------------+ | 5874973374932455844 | 100510126 | 32109 | +---------------------+-----------+------------------+ | 1173698801255170595 | 100676857 | 10512 | +---------------------+-----------+------------------+
モデルを作成する
行列分解モデルを作成し、analytics_session_data
テーブルのデータをトレーニングします。モデルは、すべての visitorId
-contentId
ペアの信頼度評価を予測するようにトレーニングされます。信頼度の評価は、セッション継続時間の中央値を基準にセンタリングとスケーリングを行って作成されます。セッション継続時間が中央値の 3.33 倍を超えるレコードは、外れ値として除外されます。
次の CREATE MODEL
ステートメントは、これらの列を使用してレコメンデーションを生成します。
visitorId
- 訪問者 ID。contentId
- コンテンツ ID。rating
- 各訪問者 / コンテンツ ペアについて計算された、0 ~ 1 の暗黙的な評価(センタリングおよびスケーリング済み)。
Google Cloud コンソールで、[BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
CREATE OR REPLACE MODEL `bqml_tutorial.mf_implicit` OPTIONS ( MODEL_TYPE = 'matrix_factorization', FEEDBACK_TYPE = 'implicit', USER_COL = 'visitorId', ITEM_COL = 'contentId', RATING_COL = 'rating', L2_REG = 30, NUM_FACTORS = 15) AS SELECT visitorId, contentId, 0.3 * (1 + (session_duration - 57937) / 57937) AS rating FROM `bqml_tutorial.analytics_session_data` WHERE 0.3 * (1 + (session_duration - 57937) / 57937) < 1;
クエリが完了するまでに約 10 分かかります。完了後、
mf_implicit
モデルが [エクスプローラ] ペインに表示されます。クエリはCREATE MODEL
ステートメントを使用してモデルを作成するため、クエリの結果は表示されません。
トレーニングの統計情報を取得する
必要に応じて、Google Cloud コンソールでモデルのトレーニング統計情報を確認できます。
機械学習アルゴリズムは、さまざまなパラメータを使用してモデルを反復処理し、損失を最小限に抑えるモデルのバージョンを選択することでモデルを構築します。このプロセスを経験損失最小化と呼びます。モデルのトレーニング統計情報では、モデルの各イテレーションに関連付けられた損失を確認できます。
モデルのトレーニング統計情報を表示する手順は次のとおりです。
Google Cloud コンソールで、[BigQuery] ページに移動します。
[エクスプローラ] ペインでプロジェクトを開き、
bqml_tutorial
データセットを開き、[モデル] フォルダを開きます。mf_implicit
モデルをクリックし、[トレーニング] タブをクリックします。[表示形式] セクションで、[テーブル] をクリックします。結果は次のようになります。
+-----------+--------------------+--------------------+ | Iteration | Training Data Loss | Duration (seconds) | +-----------+--------------------+--------------------+ | 5 | 0.0027 | 47.27 | +-----------+--------------------+--------------------+ | 4 | 0.0028 | 39.60 | +-----------+--------------------+--------------------+ | 3 | 0.0032 | 55.57 | +-----------+--------------------+--------------------+ | ... | ... | ... | +-----------+--------------------+--------------------+
[トレーニング データの損失] 列は、モデルのトレーニング後に計算された損失指標を表します。これは行列分解モデルであるため、この列には平均二乗誤差が表示されます。
モデルを評価する
ML.EVALUATE
関数を使用してモデルのパフォーマンスを評価します。ML.EVALUATE
関数は、モデルから返された予測コンテンツ評価を、トレーニング中に計算された評価指標と照らし合わせて評価します。
次の手順でモデルを評価します。
Google Cloud コンソールで、[BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
SELECT * FROM ML.EVALUATE(MODEL `bqml_tutorial.mf_implicit`);
結果は次のようになります。
+------------------------+-----------------------+---------------------------------------+---------------------+ | mean_average_precision | mean_squared_error | normalized_discounted_cumulative_gain | average_rank | +------------------------+-----------------------+---------------------------------------+---------------------+ | 0.4434341257478137 | 0.0013381759837648962 | 0.9433280547112802 | 0.24031636088594222 | +------------------------+-----------------------+---------------------------------------+---------------------+
ML.EVALUATE
関数の出力の詳細については、行列分解モデルをご覧ください。
訪問者とコンテンツのペアのサブセットの予測評価を取得する
ML.RECOMMEND
を使用して、5 人のサイト訪問者に対して各コンテンツの予測評価を取得します。
予測レーティングを取得する手順は次のとおりです。
Google Cloud コンソールで、[BigQuery] ページに移動します。
クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
SELECT * FROM ML.RECOMMEND( MODEL `bqml_tutorial.mf_implicit`, ( SELECT visitorId FROM `bqml_tutorial.analytics_session_data` LIMIT 5 ));
結果は次のようになります。
+-------------------------------+---------------------+-----------+ | predicted_rating_confidence | visitorId | contentId | +-------------------------------+---------------------+-----------+ | 0.0033608418060270262 | 7337153711992174438 | 277237933 | +-------------------------------+---------------------+-----------+ | 0.003602395397293956 | 7337153711992174438 | 158246147 | +-------------------------------+---------------------+-- -------+ | 0.0053197670652785356 | 7337153711992174438 | 299389988 | +-------------------------------+---------------------+-----------+ | ... | ... | ... | +-------------------------------+---------------------+-----------+
レコメンデーションの生成
予測された評価を使用して、訪問者 ID ごとに上位 5 つのおすすめコンテンツ ID を生成します。
推奨事項を生成する手順は次のとおりです。
Google Cloud コンソールで、[BigQuery] ページに移動します。
予測されたレーティングをテーブルに書き込みます。クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
CREATE OR REPLACE TABLE `bqml_tutorial.recommend_content` AS SELECT * FROM ML.RECOMMEND(MODEL `bqml_tutorial.mf_implicit`);
訪問者ごとに上位 5 件の結果を選択します。クエリエディタに次のクエリを貼り付け、[実行] をクリックします。
SELECT visitorId, ARRAY_AGG( STRUCT(contentId, predicted_rating_confidence) ORDER BY predicted_rating_confidence DESC LIMIT 5) AS rec FROM `bqml_tutorial.recommend_content` GROUP BY visitorId;
結果は次のようになります。
+---------------------+-----------------+---------------------------------+ | visitorId | rec:contentId | rec:predicted_rating_confidence | +---------------------+-----------------+------------------------- ------+ | 867526255058981688 | 299804319 | 0.88170525357178664 | | | 299935287 | 0.54699439944935124 | | | 299410466 | 0.53424780863188659 | | | 299826767 | 0.46949603950374219 | | | 299809748 | 0.3379991197434149 | +---------------------+-----------------+---------------------------------+ | 2434264018925667659 | 299824032 | 1.3903516407308065 | | | 299410466 | 0.9921995618196483 | | | 299903877 | 0.92333625294129218 | | | 299816215 | 0.91856701667757279 | | | 299852437 | 0.86973661454890561 | +---------------------+-----------------+---------------------------------+ | ... | ... | ... | +---------------------+-----------------+---------------------------------+
クリーンアップ
このチュートリアルで使用したリソースについて、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 の概要を確認する。
- 機械学習集中講座で機械学習について学習する。