SQLで機械学習。
BigQuery MLは、Googleが提供するデータウェアハウス(Data Warehouse:DWH)であるGoogle BigQuery上にて機械学習(Machine Learning:ML)を可能とするクラウドサービスです。最大の特徴は、モデルの作成から評価や予測までをBigQueryと同様の標準SQLによるクエリ形式で行う点です。これにより、データの準備を含めた機械学習のすべてのプロセスをBigQuery上でSQLのみで完結することが可能となり、作業効率やセキュリティの面で大きなメリットが得られます。
現時点で扱えるモデルは線形回帰・ロジスティック回帰・k 平均法クラスタリングのみですが、扱えるモデルは今後増えていくことが予定されています。
ベータ版リリースから一年近くが経過しており、いまさら試し打ちというのも変ですが、一般提供されたのを受けて、復習もかねてその触り心地をまとめておきます。それではBigQuery MLを用いた機械学習を始めましょう。
今回は「データエスノグラフィ入門」と連動し、総合ECサイトの会員の継続購買の予測を行うという設定で進めます。分析対象データは、とある総合ECサイトの会員の購買履歴データとし、概要は以下のとおりです。
- 種類:総合ECサイトの会員の購買履歴
- 期間:2005年1月〜2013年12月(9年間)
- 会員数:639,777人
- 購買数:7,599,650件(平均11.9件/人)
データソースは以下の3つを使用します。なお、こちらはすでにBigQueryに投入済みとします。
データソース | 変数 | ダウンロード |
会員マスタ mst_members |
会員ID, 年齢, 性別, 居住地など | [↓]105MB |
商品マスタ mst_products |
商品ID, 商品カテゴリなど | [↓]53MB |
購買履歴 trx_orders |
会員ID, 商品ID, 注文日, 価格 | [↓]698MB |
これらのデータを使用し、2012年の一年間の購買傾向から、2013年も継続して購買する会員を予測してみます。
機械学習用のデータと環境を準備。
分析を進める前に、まずは分析手法を決めます。売上や継続率などの数値予測の場合は線形回帰(Linear Regression)を用いますが、「継続か否か」のような二項分類の場合はロジスティック回帰(Logistic Regression)を用います。
また、予測対象の変数を目的変数(Objective Variable)といい、今回は「継続か否か」がそれになります。その結果を決定づける原因となる変数を説明変数(Explanatory Variable)といい、機械学習では特徴量(Feature Value)とも言います。説明変数は無数に存在しますが、結果の決定に対する影響力を重み(Weight)といい、重みの大きい説明変数がわかれば、意図する結果を再現しやすくなります。機械学習の目的は、予測結果を導出することでもありますが、重みの大きい説明変数を発見することでもあります。
説明変数を定義することを変数選択や特徴選択といいますが、非常に難しい問題なので、ここでは深く触れず、ひとまず「性別・年齢・購買商品カテゴリ・購買頻度・購買金額」とします。なお、集計期間は2012年の一年間とします。
次に、BigQueryで機械学習用のテーブルを用意します。必要なのは会員IDごとの集計データで、そこに目的変数と説明変数を含めます。さらに、訓練データ(Training Data)でモデルを作成し、評価データ(Evaluation Data)でモデルを評価するというプロセスを踏まえるため、データをその二つに分割します。BigQueryのクエリエディタに以下のSQL文を入力し、青い[実行]ボタンをクリックしてみましょう。また、このクエリ結果をデータセット「DE」に「sum_members_ret」という名前で保存します。
なお、処理の効率化のために10%のサンプリングをしていますが[※1]、これは会員IDを10で割った剰余が0の場合に限定するという意味です。また、欠損を除外するために性別がNULLでない会員に限定し[※2]、年齢の異常値を除外するために10歳以上90歳未満の会員に限定しています[※3]。さらに、集計期間中の購買がない会員を除外しています[※4]。
SQL内の「retention」が、目的変数である「継続か否か」を指す変数で、最終購買日が2013年以降の会員の場合のみ継続を意味する「TRUE」を、それ以外は離反を意味する「FALSE」を設定します。また「evaluation」が、訓練データと評価データを切り分ける変数で、90%が訓練データ、10%が評価データになるようランダムに振り分けます。もともと10%のサンプリングを行なっているため、会員IDを100で割った剰余が0の場合を評価データとして「TRUE」を、それ以外は訓練データとして「FALSE」を設定します。
ちなみに、説明変数に購買頻度(Frequency)や購買金額(Monetary)は含めますが、最終購買日(Recency)は含めません。これは、目的変数である「継続か否か」自体が最終購買日を基準に定義されるためです。これを含めてしまうと、当然ながら予測精度は自動的に100%になります。
モデルを作成する。
データの準備が整ったので、機械学習を進めて行きます。まずは「継続か否か」の予測モデルの作成を行います。モデルの作成には、BigQuery MLで用意されているCREATE MODELという関数を使用し、以下の構文で記述します。
CREATE OR REPLACE MODEL データセット名.モデル名 OPTIONS( model_type = 使用するモデリングタイプ ) AS ( SELECT 目的変数, 説明変数, ... FROM 機械学習用データテーブル WHERE 訓練データを指定 )
[model_type]にはロジスティック回帰を示す[logistic_reg]を指定します。目的変数は列名を「label」で指定するルールのため「retention」をそれに置き換えます。説明変数には「性別・年齢・購買商品カテゴリ・購買頻度・購買金額」を指定するため、それ以外は除外します。
BigQueryのクエリエディタに以下のSQL文を入力し、青い[実行]ボタンをクリックしてみましょう。なおこのクエリ結果はデータセット「DE」に「mdl_members_ret」という名前で自動的に保存されます。
これでモデルの作成は完了です。次回は作成したモデルの評価や予測結果の出力、さらに重みの分析を行います。
関連する記事
須川 敦史
UX&データスペシャリスト
クロスハック 代表 / uxmeetsdata.com 編集長