概要
BigQuery に含まれる BigQuery ML 機能を使用すれば、データ アナリストは最小限のコーディングで ML モデルを作成、トレーニング、評価、予測できるようになります。
Google Merchandise Store に関する数百万件の Google アナリティクス セッション レコードで構成された Google アナリティクスの e コマース サンプル データセットが、すでに BigQuery に読み込まれています。このラボでは、このデータを使用して一般的なクエリを実行し、企業が必要とする顧客の購買習慣に関する情報を取得します。
目標
このラボでは、次のタスクの実行方法について学びます。
- BigQuery を使用して一般公開データセットを見つける
- ecommerce データセットでクエリを実行して探索する
- バッチ予測に使用するトレーニングと評価のデータセットを作成する
- BigQuery ML に分類(ロジスティック回帰)モデルを作成する
- ML モデルの性能を評価する
- 訪問者が購入を行う見込みを予測してランクを付ける
環境を設定する
ラボの設定
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
-
Qwiklabs にシークレット ウィンドウでログインします。
-
ラボのアクセス時間(例: 1:15:00
)に注意し、時間内に完了できるようにしてください。
一時停止機能はありません。必要な場合はやり直せますが、最初からになります。
-
準備ができたら、[ラボを開始] をクリックします。
-
ラボの認証情報(ユーザー名とパスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。
-
[Google Console を開く] をクリックします。
-
[別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。
-
利用規約に同意し、再設定用のリソースページをスキップします。
BigQuery コンソールを開く
- Google Cloud Console で、ナビゲーション メニュー > [BigQuery] を選択します。
[Cloud Console の BigQuery へようこそ] メッセージ ボックスが開きます。このメッセージ ボックスにはクイックスタート ガイドへのリンクと、UI の更新情報が表示されます。
- [完了] をクリックします。
コース用データセットにアクセスする
BigQuery を開いたら、新しいブラウザタブで data-to-insights プロジェクトを開いて、このプロジェクトを BigQuery プロジェクト パネルに取り込みます。
data-to-insights e コマース データセットのフィールド定義については、[UA] BigQuery Export スキーマのページをご覧ください。このリンク先のページは、参照用に新しいタブで開いたままにしておきます。
タスク 1. e コマースデータを調べる
シナリオ: データ アナリスト チームが、e コマース ウェブサイトに関する Google アナリティクスのログを BigQuery にエクスポートし、e コマース訪問者のセッションの生データをすべて含むテーブルを作成して、データを調べられるようにしました。このデータを使用して、いくつかの質問に対する答えを見つけていきましょう。
質問: ウェブサイト訪問者の何パーセントが実際に購入に至りましたか。
- クエリエディタをクリックします。
- 新規クエリのフィールドに以下を追加します。
#standardSQL
WITH visitors AS(
SELECT
COUNT(DISTINCT fullVisitorId) AS total_visitors
FROM `data-to-insights.ecommerce.web_analytics`
),
purchasers AS(
SELECT
COUNT(DISTINCT fullVisitorId) AS total_purchasers
FROM `data-to-insights.ecommerce.web_analytics`
WHERE totals.transactions IS NOT NULL
)
SELECT
total_visitors,
total_purchasers,
total_purchasers / total_visitors AS conversion_rate
FROM visitors, purchasers
- [実行] をクリックします。
結果: 2.69%
質問: 売り上げで上位 5 つの商品は何ですか。
- クエリエディタに以下のクエリを追加して、[実行] をクリックします。
SELECT
p.v2ProductName,
p.v2ProductCategory,
SUM(p.productQuantity) AS units_sold,
ROUND(SUM(p.localProductRevenue/1000000),2) AS revenue
FROM `data-to-insights.ecommerce.web_analytics`,
UNNEST(hits) AS h,
UNNEST(h.product) AS p
GROUP BY 1, 2
ORDER BY revenue DESC
LIMIT 5;
結果:
Row |
v2ProductName |
v2ProductCategory |
units_sold |
revenue |
1 |
Nest® Learning Thermostat 3rd Gen-USA - Stainless Steel |
Nest-USA |
17651 |
870976.95 |
2 |
Nest® Cam Outdoor Security Camera - USA |
Nest-USA |
16930 |
684034.55 |
3 |
Nest® Cam Indoor Security Camera - USA |
Nest-USA |
14155 |
548104.47 |
4 |
Nest® Protect Smoke + CO White Wired Alarm-USA |
Nest-USA |
6394 |
178937.6 |
5 |
Nest® Protect Smoke + CO White Battery Alarm-USA |
Nest-USA |
6340 |
178572.4 |
質問: ウェブサイトを再訪問して購入を行った人は何人ですか。
- 次のクエリを実行して調べます。
# 再訪問時に購入した人(最初の訪問時に購入した人も含む)
WITH all_visitor_stats AS (
SELECT
fullvisitorid, # 一意の訪問者数 741,721
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM `data-to-insights.ecommerce.web_analytics`
GROUP BY fullvisitorid
)
SELECT
COUNT(DISTINCT fullvisitorid) AS total_visitors,
will_buy_on_return_visit
FROM all_visitor_stats
GROUP BY will_buy_on_return_visit
結果:
Row |
total_visitors |
will_buy_on_return_visit |
1 |
729848 |
0 |
2 |
11873 |
1 |
結果を分析すると、総訪問者の 1.6%(11,873 ÷ 729,848)がウェブサイトに戻ってきて、購入を行ったことがわかります。この人数には、最初の訪問で購入し、再度訪問してもう一度購入した人も含まれます。
このような行動は、訪問者が購入を決定する前に入念な事前調査と比較が必要になる高額な商品(自動車など)の場合に顕著に見られますが、このサイトにあるようなそれほど高額ではない商品(T シャツやアクセサリーなど)にも当てはまります。
オンライン マーケティング業界では今後、初回訪問で観察された特徴に基づいて将来購入に至るユーザーを識別し、マーケティング活動を行うことが、コンバージョン率を上げ、競合他社のサイトへのユーザー流出を抑える鍵となるでしょう。
タスク 2. 特徴量を選択し、トレーニング データセットを作成する
ここからは、BigQuery で ML モデルを作成し、新しいユーザーが将来的に購入を行うかどうかを予測します。こうした高い価値を持つユーザーを識別することで、マーケティング チームがそれらのユーザーにターゲットを絞って特別プロモーションや広告キャンペーンを実施できます。
Google アナリティクスでは、さまざまなディメンションを捉えてこの e コマース ウェブサイトのユーザー訪問が計測されます。フィールドの一覧を [UA] BigQuery Export スキーマのガイドで確認してからデモ データセットをプレビューし、ユーザーによるウェブサイト初回訪問のデータと、そのユーザーが戻ってきて購入を行うかどうかの関係を、ML モデルが理解するために役立つ特徴を見つけます。
次の 2 つのフィールドが分類モデルに適した入力であるかどうかをテストしましょう。
-
totals.bounces
(訪問者がウェブサイトをすぐに離れたかどうか)
-
totals.timeOnSite
(訪問者がウェブサイトに留まった時間)
ML の精度は、提供されるトレーニング データで決まります。入力した特徴量とラベル(ここでは、訪問者が今後購入を行うかどうか)の関係をモデルに判断、学習させるための十分な情報が揃って初めて、精度の高いモデルを確立できます。これら 2 つのフィールドでモデルをトレーニングすることは出発点にはなりますが、精度の高いモデルを生成するために 2 つのフィールドだけで十分かどうかを見極める必要があります。
- クエリエディタに以下のクエリを追加して、[実行] をクリックします。
SELECT
* EXCEPT(fullVisitorId)
FROM
# 特徴
(SELECT
fullVisitorId,
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site
FROM
`data-to-insights.ecommerce.web_analytics`
WHERE
totals.newVisits = 1)
JOIN
(SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM
`data-to-insights.ecommerce.web_analytics`
GROUP BY fullvisitorid)
USING (fullVisitorId)
ORDER BY time_on_site DESC
LIMIT 10;
結果:
Row |
bounces |
time_on_site |
will_buy_on_return_visit |
1 |
0 |
15047 |
0 |
2 |
0 |
12136 |
0 |
3 |
0 |
11201 |
0 |
4 |
0 |
10046 |
0 |
5 |
0 |
9974 |
0 |
6 |
0 |
9564 |
0 |
7 |
0 |
9520 |
0 |
8 |
0 |
9275 |
1 |
9 |
0 |
9138 |
0 |
10 |
0 |
8872 |
0 |
ディスカッション: will_buy_on_return_visit は最初の訪問後にはわかりません。繰り返しになりますが、ここでは、ウェブサイトに戻ってきて購入を行うユーザーのサブセットを予測します。予測時に将来のことはわからないため、新しい訪問者が後から戻ってきて購入を行うかどうかについて確かなことはいえません。ML モデルを構築する価値は、最初のセッションについて収集されたデータに基づいて、将来の購入の確率を予測できる点にあります。
質問: 最初のデータ結果から見て、time_on_site と bounces は、ユーザーが戻ってきて購入を行うかどうかを示す適切な指標だといえますか。
解答: モデルのトレーニングと評価を行う前に結論を出すのは早すぎるかもしれませんが、time_on_site
の上位 10 項目を見ると、戻ってきて購入を行ったユーザーは 1 人だけでした。あまり確率は高くなさそうです。モデルの機能を検証してみましょう。
タスク 3. モデルを格納する BigQuery データセットを作成する
次に、新しい BigQuery データセットを作成し、ML モデルを格納します。
- 左ペインでプロジェクト名をクリックし、次に [
アクションを表示
](その他)アイコンをクリックして [データセットを作成] を選択します。
![[データセットを作成] オプション](https://cdn.qwiklabs.com/REH1MFCFyVrzZb54TvWijJ46wBhb9%2B7c%2FBox5JR8MMo%3D)
- [データセットを作成する] ダイアログで、次の操作を行います。
- [データセット ID] に「ecommerce」と入力します。
- その他の値はデフォルトのままにします。
- [データセットを作成] をクリックします。
タスク 4. BigQuery ML モデルタイプを選択し、オプションを指定する
最初に使用する特徴を選択したので、ML モデルを BigQuery で作成する準備ができました。
モデルタイプは次の 2 つから選択します。
モデル |
モデルタイプ |
ラベルのデータ型 |
例 |
予測 |
linear_reg |
数値(通常は整数または浮動小数点数) |
過去の売り上げデータから翌年の売り上げを予測。 |
分類 |
logistic_reg |
0 または 1 のバイナリ分類 |
コンテキストに応じて、メールを迷惑メールまたは迷惑メール以外に分類。 |
注: ML で使用されるモデルタイプは他にも多数あります(ニューラル ネットワークやディシジョン ツリーなど)。これらは TensorFlow などのライブラリで利用可能です。現時点では、BigQuery ML は上記の 2 つをサポートしています。
- 次のクエリを入力してモデルを作成し、モデル オプションを指定します。
CREATE OR REPLACE MODEL `ecommerce.classification_model`
OPTIONS
(
model_type='logistic_reg',
labels = ['will_buy_on_return_visit']
)
AS
#standardSQL
SELECT
* EXCEPT(fullVisitorId)
FROM
# 特徴
(SELECT
fullVisitorId,
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site
FROM
`data-to-insights.ecommerce.web_analytics`
WHERE
totals.newVisits = 1
AND date BETWEEN '20160801' AND '20170430') # 最初の 9 か月分でトレーニング
JOIN
(SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM
`data-to-insights.ecommerce.web_analytics`
GROUP BY fullvisitorid)
USING (fullVisitorId)
;
- 次に、[実行] をクリックしてモデルのトレーニングを行います。
モデルのトレーニングが終わるのを待ちます(5~10 分)。
注: 利用可能なデータすべてをモデルのトレーニングに使用することはできません。これは、モデルの評価およびテスト用に、モデルにとって未知のデータポイントを残しておく必要があるからです。WHERE 句が追加されているのはこのためで、条件は、12 か月分のデータセットのうち最初の 9 か月分のセッション データのみをトレーニングに使用することです。
モデルのトレーニングが終わると、「このステートメントで新しいモデル qwiklabs-gcp-xxxxxxxxx:ecommerce.classification_model が作成されました。」というメッセージが表示されます。
- [モデルに移動] をクリックします。
ecommerce データセットの内容を確認し、classification_model が表示されていることを確かめます。
次に、未知の評価データに対するモデルの性能を評価します。
タスク 5. 分類モデルの性能を評価する
性能の基準を選択する
ML での分類では、偽陽性率(ユーザーが戻ってきて購入を行うと予測したものの、実際には購入しなかった)を最小限に抑え、真陽性率(ユーザーが戻ってきて購入を行うと予測し、実際に購入した)を最大限にすることを目指します。
この関係は次に示すような受信者操作特性(ROC)曲線で可視化できます。ここでは、曲線の下の面積(AUC)を最大限にすることが目標です。

BigQuery ML の roc_auc は、トレーニング済みの ML モデルを評価する際にクエリ可能なフィールドです。
- トレーニングが完了したので、
ML.EVALUATE
を使用する以下のクエリを実行して、モデルの性能を評価します。
SELECT
roc_auc,
CASE
WHEN roc_auc > .9 THEN 'good'
WHEN roc_auc > .8 THEN 'fair'
WHEN roc_auc > .7 THEN 'not great'
ELSE 'poor' END AS model_quality
FROM
ML.EVALUATE(MODEL ecommerce.classification_model, (
SELECT
* EXCEPT(fullVisitorId)
FROM
# 特徴
(SELECT
fullVisitorId,
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site
FROM
`data-to-insights.ecommerce.web_analytics`
WHERE
totals.newVisits = 1
AND date BETWEEN '20170501' AND '20170630') # 2 か月分で評価
JOIN
(SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM
`data-to-insights.ecommerce.web_analytics`
GROUP BY fullvisitorid)
USING (fullVisitorId)
));
次のような結果が表示されます。
Row |
roc_auc |
model_quality |
1 |
0.724588 |
not great |
モデルを評価すると、roc_auc は 0.72 になります。これは、モデルの予測能力が良くないことを示しています。目標は、曲線の下の領域を可能な限り 1.0 に近づけることであるため、まだ改善の余地があります。
タスク 6. 特徴量エンジニアリングでモデル性能を強化する
先にも少し触れましたが、訪問者の最初のセッションと再訪問時に購入を行う可能性の関係をモデルに理解させるうえで役立つデータセットの特徴は、他にもたくさんあります。
新しい特徴をいくつか追加し、classification_model_2
という名前の 2 番目の ML モデルを作成します。
- 訪問者は初回訪問時に購入手続きをどこまで進めていたか
- 訪問者はどこからアクセスしたか(トラフィック ソースがオーガニック検索か参照元サイトかなど)
- デバイスのカテゴリ(モバイル、タブレット、パソコン)
- 地理情報(国)
- 次のクエリを実行して、この 2 番目のモデルを作成します。
CREATE OR REPLACE MODEL `ecommerce.classification_model_2`
OPTIONS
(model_type='logistic_reg', labels = ['will_buy_on_return_visit']) AS
WITH all_visitor_stats AS (
SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM `data-to-insights.ecommerce.web_analytics`
GROUP BY fullvisitorid
)
# 新しい特徴を追加
SELECT * EXCEPT(unique_session_id) FROM (
SELECT
CONCAT(fullvisitorid, CAST(visitId AS STRING)) AS unique_session_id,
# ラベル
will_buy_on_return_visit,
MAX(CAST(h.eCommerceAction.action_type AS INT64)) AS latest_ecommerce_progress,
# サイトでの行動
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site,
totals.pageviews,
# 訪問経路
trafficSource.source,
trafficSource.medium,
channelGrouping,
# モバイルかパソコンか
device.deviceCategory,
# 地域
IFNULL(geoNetwork.country, "") AS country
FROM `data-to-insights.ecommerce.web_analytics`,
UNNEST(hits) AS h
JOIN all_visitor_stats USING(fullvisitorid)
WHERE 1=1
# 初回訪問のみ予測
AND totals.newVisits = 1
AND date BETWEEN '20160801' AND '20170430' # 9 か月分でトレーニング
GROUP BY
unique_session_id,
will_buy_on_return_visit,
bounces,
time_on_site,
totals.pageviews,
trafficSource.source,
trafficSource.medium,
channelGrouping,
device.deviceCategory,
country
);
注: これは新しいモデルですが、ここでも同じように最初の 9 か月分のデータを使ってトレーニングします。優れた出力が優れた入力(特徴)に起因することを確認できるように、新しいトレーニング データや異なるトレーニング データではなく、同じトレーニング データセットを使用することが重要です。
トレーニング データセットのクエリに追加された重要な新しい特徴は、各訪問者がセッションで到達した購入手続きの段階です。これは、フィールド hits.eCommerceAction.action_type
に記録されます。フィールド定義でそのフィールドを検索すると、「6 = Completed Purchase」のフィールド マッピングが表示されます。
なお、ウェブ解析データセットには ARRAYS のようなネストされた繰り返しフィールドがあり、データセットではこれらを別個の行に分ける必要があります。これは、UNNEST() 関数を使用して行います(上述のクエリで確認できます)。
新しいモデルのトレーニングが終わるのを待ちます(5~10 分)。
- 次のクエリを実行して、この新しいモデルを評価し、予測能力が向上しているかどうかを確認します。
#standardSQL
SELECT
roc_auc,
CASE
WHEN roc_auc > .9 THEN 'good'
WHEN roc_auc > .8 THEN 'fair'
WHEN roc_auc > .7 THEN 'not great'
ELSE 'poor' END AS model_quality
FROM
ML.EVALUATE(MODEL ecommerce.classification_model_2, (
WITH all_visitor_stats AS (
SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM `data-to-insights.ecommerce.web_analytics`
GROUP BY fullvisitorid
)
# 新しい特徴を追加
SELECT * EXCEPT(unique_session_id) FROM (
SELECT
CONCAT(fullvisitorid, CAST(visitId AS STRING)) AS unique_session_id,
# ラベル
will_buy_on_return_visit,
MAX(CAST(h.eCommerceAction.action_type AS INT64)) AS latest_ecommerce_progress,
# サイトでの行動
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site,
totals.pageviews,
# 訪問経路
trafficSource.source,
trafficSource.medium,
channelGrouping,
# モバイルかパソコンか
device.deviceCategory,
# 地域
IFNULL(geoNetwork.country, "") AS country
FROM `data-to-insights.ecommerce.web_analytics`,
UNNEST(hits) AS h
JOIN all_visitor_stats USING(fullvisitorid)
WHERE 1=1
# 初回訪問のみ予測
AND totals.newVisits = 1
AND date BETWEEN '20170501' AND '20170630' # 2 か月分で評価
GROUP BY
unique_session_id,
will_buy_on_return_visit,
bounces,
time_on_site,
totals.pageviews,
trafficSource.source,
trafficSource.medium,
channelGrouping,
device.deviceCategory,
country
)
));
(出力)
Row |
roc_auc |
model_quality |
1 |
0.910382 |
good |
この新しいモデルでは、roc_auc が 0.91 となりました。これは、最初のモデルよりも著しく向上しています。
モデルをトレーニングしたので、今度は予測を行います。
タスク 7. どの新しい訪問者が戻ってきて購入を行うかを予測する
次に、新しい訪問者がどのくらい戻ってきて購入を行うかを予測するためのクエリを作成します。
- 強化済みの分類モデルを使用する以下の予測クエリを実行して、Google Merchandise Store への初めての訪問者が再訪問で購入を行う確率を予測します。
SELECT
*
FROM
ml.PREDICT(MODEL `ecommerce.classification_model_2`,
(
WITH all_visitor_stats AS (
SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM `data-to-insights.ecommerce.web_analytics`
GROUP BY fullvisitorid
)
SELECT
CONCAT(fullvisitorid, '-',CAST(visitId AS STRING)) AS unique_session_id,
# ラベル
will_buy_on_return_visit,
MAX(CAST(h.eCommerceAction.action_type AS INT64)) AS latest_ecommerce_progress,
# サイトでの行動
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site,
totals.pageviews,
# 訪問経路
trafficSource.source,
trafficSource.medium,
channelGrouping,
# モバイルかパソコンか
device.deviceCategory,
# 地域
IFNULL(geoNetwork.country, "") AS country
FROM `data-to-insights.ecommerce.web_analytics`,
UNNEST(hits) AS h
JOIN all_visitor_stats USING(fullvisitorid)
WHERE
# 初回訪問のみ予測
totals.newVisits = 1
AND date BETWEEN '20170701' AND '20170801' # 1 か月分でテスト
GROUP BY
unique_session_id,
will_buy_on_return_visit,
bounces,
time_on_site,
totals.pageviews,
trafficSource.source,
trafficSource.medium,
channelGrouping,
device.deviceCategory,
country
)
)
ORDER BY
predicted_will_buy_on_return_visit DESC;
予測は、最後の 1 か月(12 か月中)のデータセットで行われます。
モデルは、2017 年 7 月の e コマース セッションに対する予測を出力します。ここでは、新しく追加された 3 つのフィールドを確認できます。
- predicted_will_buy_on_return_visit: 訪問者が後で購入を行うことを、モデルが予測しているかどうか(1 = yes)
- predicted_will_buy_on_return_visit_probs.label: yes / no のバイナリ分類器
- predicted_will_buy_on_return_visit_probs.prob: 予測に対するモデルの信頼度(1 = 100%)
結果
- 初回訪問者(予測された確率によって降順で並べ替え)の上位 6% のうち、6% 以上が再訪問時に購入を行いました。
- これらのユーザーは、再訪問で購入に至った初回訪問者全体の 50% 近くに相当します。
- 全体として、初回訪問者の 0.7% しか再訪問で購入しませんでした。
- 初回訪問者の上位 6% にターゲットを絞ると、マーケティング ROI は、全員をターゲットにした場合に比べて 9 倍も向上します。
詳細情報
roc_auc は、モデル評価で使用できるパフォーマンス指標のひとつにすぎず、他にも accuracy、precision、recall を使用できます。どのパフォーマンス指標を使用するかは、全体の目標に基づいて決める必要があります。
お疲れさまでした
SQL のみを使用して ML モデルを作成することができました。
課題
概要
前の 2 つのタスクでは、特徴量エンジニアリングによってモデルの性能を向上させられることを確認しました。しかし、さらなる性能向上を目指して他のモデルタイプを試してみることもできます。BigQuery ML では、分類問題に対して以下のモデルタイプもサポートされています。
タスク
ここで作成した線形分類(ロジスティック回帰)モデルは、特徴量エンジニアリングによって性能が向上しましたが、特徴量とラベルの関係を完全に取得するには単純すぎる可能性があります。そこで、タスク 6 でモデル ecommerce.classification_model_2 を作成するために使用したのと同じデータセットとラベルを使用して、XGBoost 分類器を作成します。
注:
ヒント: Boosted_Tree_Classifier に対して次のオプションを使用します。
1. L2_reg = 0.1
2. num_parallel_tree = 8
3. max_tree_depth = 10
正確な構文については、上のリンク先のドキュメントをご覧ください。モデルのトレーニングには 7 分ほどかかります。クエリの書き方がわからない場合は、以下の「解決方法」セクションで確認できます。
解決方法:
XGBoost 分類器の作成方法は次のとおりです。
CREATE OR REPLACE MODEL `ecommerce.classification_model_3`
OPTIONS
(model_type='BOOSTED_TREE_CLASSIFIER' , l2_reg = 0.1, num_parallel_tree = 8, max_tree_depth = 10,
labels = ['will_buy_on_return_visit']) AS
WITH all_visitor_stats AS (
SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM `data-to-insights.ecommerce.web_analytics`
GROUP BY fullvisitorid
)
# 新しい特徴を追加
SELECT * EXCEPT(unique_session_id) FROM (
SELECT
CONCAT(fullvisitorid, CAST(visitId AS STRING)) AS unique_session_id,
# ラベル
will_buy_on_return_visit,
MAX(CAST(h.eCommerceAction.action_type AS INT64)) AS latest_ecommerce_progress,
# サイトでの行動
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site,
totals.pageviews,
# 訪問経路
trafficSource.source,
trafficSource.medium,
channelGrouping,
# モバイルかパソコンか
device.deviceCategory,
# 地域
IFNULL(geoNetwork.country, "") AS country
FROM `data-to-insights.ecommerce.web_analytics`,
UNNEST(hits) AS h
JOIN all_visitor_stats USING(fullvisitorid)
WHERE 1=1
# 初回訪問のみ予測
AND totals.newVisits = 1
AND date BETWEEN '20160801' AND '20170430' # 9 か月分でトレーニング
GROUP BY
unique_session_id,
will_buy_on_return_visit,
bounces,
time_on_site,
totals.pageviews,
trafficSource.source,
trafficSource.medium,
channelGrouping,
device.deviceCategory,
country
);
では、モデルを評価して確認してみましょう。
#standardSQL
SELECT
roc_auc,
CASE
WHEN roc_auc > .9 THEN 'good'
WHEN roc_auc > .8 THEN 'fair'
WHEN roc_auc > .7 THEN 'not great'
ELSE 'poor' END AS model_quality
FROM
ML.EVALUATE(MODEL ecommerce.classification_model_3, (
WITH all_visitor_stats AS (
SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM `data-to-insights.ecommerce.web_analytics`
GROUP BY fullvisitorid
)
# 新しい特徴を追加
SELECT * EXCEPT(unique_session_id) FROM (
SELECT
CONCAT(fullvisitorid, CAST(visitId AS STRING)) AS unique_session_id,
# ラベル
will_buy_on_return_visit,
MAX(CAST(h.eCommerceAction.action_type AS INT64)) AS latest_ecommerce_progress,
# サイトでの行動
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site,
totals.pageviews,
# 訪問経路
trafficSource.source,
trafficSource.medium,
channelGrouping,
# モバイルかパソコンか
device.deviceCategory,
# 地域
IFNULL(geoNetwork.country, "") AS country
FROM `data-to-insights.ecommerce.web_analytics`,
UNNEST(hits) AS h
JOIN all_visitor_stats USING(fullvisitorid)
WHERE 1=1
# 初回訪問のみ予測
AND totals.newVisits = 1
AND date BETWEEN '20170501' AND '20170630' # 2 か月分で評価
GROUP BY
unique_session_id,
will_buy_on_return_visit,
bounces,
time_on_site,
totals.pageviews,
trafficSource.source,
trafficSource.medium,
channelGrouping,
device.deviceCategory,
country
)
));
roc_auc が約 0.02 増えて約 0.94 になりました。
注: トレーニング プロセスにはランダム性が伴うため、実際の値は異なります。
この変化はわずかにすぎませんが、roc_auc の完璧な値は 1 であるため、1 に近づくほど向上が難しくなります。
この例からは、BigQuery ML でさまざまなモデルやオプションを試してみるのがいかに簡単かがよくわかります。SQL を 1 行変更するだけで、前よりはるかに複雑なモデルタイプを使用できました。
上で使用したオプションがどのように選択されたのか疑問に思われた方もいらっしゃるでしょうが、最適なオプションを見つけるにはひたすら試してみるしかありません。特定の問題に対する最適なモデルタイプを見つけるには、ハイパーパラメータ調整と呼ばれるプロセスでさまざまなオプションを試す必要があります。
では最後に、この改善されたモデルで予測を生成して、前に生成した予測と比較してみましょう。ブーストツリー分類モデルを使用することで、前のモデルに比べて ROC AUC がわずかに 0.2 向上したことを確認できます。以下のクエリは、新しい訪問者がどのくらい戻ってきて購入を行うかを予測します。
SELECT
*
FROM
ml.PREDICT(MODEL `ecommerce.classification_model_3`,
(
WITH all_visitor_stats AS (
SELECT
fullvisitorid,
IF(COUNTIF(totals.transactions > 0 AND totals.newVisits IS NULL) > 0, 1, 0) AS will_buy_on_return_visit
FROM `data-to-insights.ecommerce.web_analytics`
GROUP BY fullvisitorid
)
SELECT
CONCAT(fullvisitorid, '-',CAST(visitId AS STRING)) AS unique_session_id,
# ラベル
will_buy_on_return_visit,
MAX(CAST(h.eCommerceAction.action_type AS INT64)) AS latest_ecommerce_progress,
# サイトでの行動
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site,
totals.pageviews,
# 訪問経路
trafficSource.source,
trafficSource.medium,
channelGrouping,
# モバイルかパソコンか
device.deviceCategory,
# 地域
IFNULL(geoNetwork.country, "") AS country
FROM `data-to-insights.ecommerce.web_analytics`,
UNNEST(hits) AS h
JOIN all_visitor_stats USING(fullvisitorid)
WHERE
# 初回訪問のみ予測
totals.newVisits = 1
AND date BETWEEN '20170701' AND '20170801' # 1 か月分でテスト
GROUP BY
unique_session_id,
will_buy_on_return_visit,
bounces,
time_on_site,
totals.pageviews,
trafficSource.source,
trafficSource.medium,
channelGrouping,
device.deviceCategory,
country
)
)
ORDER BY
predicted_will_buy_on_return_visit DESC;
この出力は、Google Merchandise Store への初めての訪問者が再訪問で購入を行う確率をより正確に予測する分類モデルを示しています。
上の結果を前のタスク 7 のモデルと比較すると、予測に対するモデルの信頼度が logistic_regression モデルタイプに比べて向上したことがわかります。
ラボを終了する
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
- 星 1 つ = 非常に不満
- 星 2 つ = 不満
- 星 3 つ = どちらともいえない
- 星 4 つ = 満足
- 星 5 つ = 非常に満足
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。