復習 BQML で分類モデルを使用して訪問者の購入を予測する
復習ための素晴らしいエントリがあった!感謝!感謝!
その1は、どんなデータセットなのか読み取っている。 その2は、データセット分析続きとモデル作成/評価とモデル作成/評価。
1つ目のモデル
2つの特徴(変数)から生成。値の尺度なんかを設定しなくいいものなのかな?
- fullVisitorId
- totals.bounces 合計直帰数
- totals.timeOnSite セッションの合計時間
CREATE OR REPLACE MODEL `ecommerce.classification_model`
OPTIONS
(
model_type='logistic_reg',
labels = ['will_buy_on_return_visit']
)
:
(SELECT
fullVisitorId,
IFNULL(totals.bounces, 0) AS bounces,
IFNULL(totals.timeOnSite, 0) AS time_on_site
FROM
:
モデルの評価
期間が20170501から2か月になっている。この2か月をモデルに与えて性能を評価するということなのだろう。結果は 0.72 でまあまあ。
SELECT
roc_auc,
CASE
WHEN roc_auc > .9 THEN 'good'
WHEN roc_auc > .8 THEN 'fair'
WHEN roc_auc > .7 THEN 'decent'
WHEN roc_auc > .6 THEN 'not great'
ELSE 'poor' END AS model_quality
FROM
ML.EVALUATE(MODEL ecommerce.classification_model, (
SELECT
* EXCEPT(fullVisitorId)
FROM
# features
(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') # eval on 2 months
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)
));
2つ目のモデル
totals.bounces, totals.timeOnSite にいろんな変数を加えてモデルを生成している。
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
## totals.transactions 取引回数
## totals.newVisits 最初の訪問の場合は「1」、そうでない場合は「null」
## 帰った来て買ったら1
FROM `data-to-insights.ecommerce.web_analytics`
GROUP BY fullvisitorid
)
# add in new features
SELECT * EXCEPT(unique_session_id) FROM (
SELECT
CONCAT(fullvisitorid, CAST(visitId AS STRING)) AS unique_session_id,
# labels
will_buy_on_return_visit,
## 前段selectで生成
MAX(CAST(h.eCommerceAction.action_type AS INT64)) AS latest_ecommerce_progress,
## アクション タイプ。商品一覧のクリックスルー = 1、商品詳細表示 = 2、カートに商品を追加 = 3、
## カートの商品を削除 = 4、決済 = 5、購入の完了 = 6、払い戻し = 7、決算オプション = 8、不明 = 0
# behavior on the site
IFNULL(totals.bounces, 0) AS bounces,
## セッション開始後にすぐに離脱した場合、値は「1」となります。そうでない場合は「null」
IFNULL(totals.timeOnSite, 0) AS time_on_site,
## セッションの合計時間(秒数)
totals.pageviews,
## セッション中の合計ページビュー数。
# where the visitor came from
trafficSource.source,
## トラフィックの参照元
trafficSource.medium,
## トラフィック参照元のメディア
channelGrouping,
## このビューのエンドユーザーのセッションと関連付られたデフォルトのチャネル グループ
# mobile or desktop
device.deviceCategory,
## 端末の種類(モバイル、タブレット、PC)
# geographic
IFNULL(geoNetwork.country, "") AS country
## IP アドレスに基づいて特定されたセッションの起点となる国
FROM `data-to-insights.ecommerce.web_analytics`,
UNNEST(hits) AS h
JOIN all_visitor_stats USING(fullvisitorid)
WHERE 1=1
# only predict for new visits
AND totals.newVisits = 1
AND date BETWEEN '20160801' AND '20170430' # train 9 months
GROUP BY
unique_session_id,
will_buy_on_return_visit,
bounces,
time_on_site,
totals.pageviews,
trafficSource.source,
trafficSource.medium,
channelGrouping,
device.deviceCategory,
country
);
モデルの評価結果は 0.91 で good。