BigQuery ML 試し打ち #01

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」という名前で自動的に保存されます。

これでモデルの作成は完了です。次回は作成したモデルの評価や予測結果の出力、さらに重みの分析を行います。