BigQuery ML 試し打ち #02

モデルを評価する。

BigQuery MLと総合ECサイトの会員の購買履歴データを用いて、一年間の購買傾向から、翌年も継続して購買する会員を予測するという試みをしていますが、前回「BigQuery ML 試し打ち #01」で予測モデルの作成まで完了したので、今回はモデルの評価予測結果の出力、さらに重みの分析を行います。

まずは予測モデルの評価を行いますが、それにはBigQuery MLで用意されているML.EVALUATEという関数を使用し、以下の構文で記述します。

SELECT * 
FROM ML.EVALUATE(
  MODEL モデル名
  , (
    SELECT 目的変数, 説明変数, ...   
    FROM 機械学習用データテーブル
    WHERE 評価データを指定
  )
)

モデル作成時と同様、目的変数は列名を「label」で指定するルールのため「retention」をそれに置き換えます。説明変数には「性別・年齢・購買商品カテゴリ・購買頻度・購買金額」を指定するため、それ以外は除外します。BigQueryのクエリエディタに以下のSQL文を入力し、青い[実行]ボタンをクリックしてみましょう。

すると、クエリ結果に以下のような表が出力されるかと思います。

項目
precision 0.8941798941798942
recall 0.5014836795252225
accuracy 0.7704517704517705
f1_score 0.6425855513307985
log_loss 0.5168232647120398
roc_auc 0.832985

これらの項目と値の意味を簡単に解説しますが、その前に二項分類の予測と結果のマトリクスについて理解をしておく必要があります。それは以下の表で整理できます。

結果
TRUEFALSE
予測TRUE真陽性偽陽性
FALSE偽陰性真陰性
  • 真陽性:TRUEの結果を正しくTRUEと予測
  • 真陰性:FALSEの結果を正しくFALSEと予測
  • 偽陽性:FALSEの結果を誤ってTRUEと予測
  • 偽陰性:TRUEの結果を誤ってFALSEと予測

このマトリクスを基に、評価結果の[precision][recall][accuracy][f1_score]の各項目の意味を以下のように説明することができます。またそれぞれの値は0から1の実数となり、1に近くほど精度が高いことを意味します。

項目 意味
precision 適合率 (真陽性)/(真陽性+偽陽性)
recall 再現率 (真陽性)/(真陽性+偽陰性)
accuracy 正解率 (真陽性+真陰性)
/(真陽性+真陰性+偽陽性+偽陰性)
f1_score F値 2×(適合率×再現率)
/(適合率+再現率)

すなわち今回の予測モデルの評価結果としては、正解率は77%であり、TRUEと予測したものが結果としてTRUEであった確率を示す適合率は89%と非常に高いものの、結果が TRUEであるものを正しくTRUEと予測した確率を示す再現率は50%に止まった、ということになります。

継続か否かを予測する。

続いて、作成した予測モデルを使って、評価データに対する「継続か否か」の予測を行い、結果を出力します。それにはBigQuery MLで用意されているML.PREDICTという関数を使用し、以下の構文で記述します。

SELECT 出力したい変数
FROM ML.PREDICT(
  MODEL モデル名
  , (
    SELECT *
    FROM 機械学習用データテーブル
    WHERE 評価データを指定
  )
)

構文としては評価の場合とおおむね同じですが、機械学習用データテーブルから抽出する項目には、最終的に出力したい変数を含めておく必要があります。BigQueryのクエリエディタに以下のSQL文を入力し、青い[実行]ボタンをクリックしてみましょう。

すると、以下のスキーマのテーブルが出力されます。レコードは会員ID単位で、predicted_labelが予測結果となります。predicted_label_probs.probは真偽それぞれの予測の確からしさの値であり、高いほうが予測結果として選択されます。

フィールド名 概要 タイプ
predicted_label 予測結果 真偽
predicted_label_probs.label 予測の確からしさの項目 真偽
predicted_label_probs.prob 予測の確からしさの値 実数(0〜1)
member_id 会員ID 整数

重みを分析する。

最後に重みの分析を行います。重み(Weight)とは結果の決定に対する影響力のことであり、それが大きい説明変数がわかれば、意図する結果を再現しやすくなります。機械学習の目的は、予測結果を導出することでもありますが、重みの大きい説明変数を発見することでもあります。それにはBigQuery MLで用意されているML.WEIGHTという関数を使用し、以下の構文で記述します。

SELECT * 
FROM ML.WEIGHT(
  MODEL モデル名
  ORDER BY ABS( weight ) DESC
)

BigQueryのクエリエディタに以下のSQL文を入力し、青い[実行]ボタンをクリックしてみましょう。

すると、クエリ結果に以下のような表が出力されるかと思います。

processed_input weight category_weights.category category_weights.weight
__INTERCEPT__ -1.198761487350279
frequency 0.26443061661515105
age -5.464877050426754E-4
monetary 1.4273789647951177E-5
gender 女性 -0.06224747387551884
男性 -0.0016923874680583803
category おもちゃ・子供・赤ちゃん -0.27861305570603795
映画・音楽・ゲーム 0.12202359844247163
本・聞く本 0.006707035351433535
スポーツ・アウトドア 0.02979014651640284
エレクトロニクス・コンピューター -0.04263333605516763
美容・健康・食料品 -0.03431735605454703
自動車・工業 -0.08863931077413578
ファッション・ジュエリー 0.04375393071659543
家庭・ガーデニング用品 -0.029685028287024184

重みは、正の場合は値が大きいほど、その変数が目的変数の真値への影響力が強く、逆に負の場合は値が小さいほど、目的変数の偽値への影響力が強いことを意味します。この結果から、やはり購買金額(Monetary)と購買頻度(Frequency)が目的変数の真値への影響力が強い、すなわち購買金額や頻度が高い会員ほど継続する可能性が高いことがわかります。逆に年齢(Age)が目的変数の偽値への影響力が強い、すなわち年齢が高い会員ほど離反する可能性が高いことがわかります。

BigQuery MLと総合ECサイトの会員の購買履歴データを用いて、一年間の購買傾向から、翌年も継続して購買する会員を予測するという試みをしましたが、BigQuery上で完結して簡単に実現できることがわかりました。現時点で扱えるモデルは線形回帰・ロジスティック回帰・k 平均法クラスタリングのみですが、今後は協調フィルタリングやTensorFlowを用いたディープニューラルネットワークなど扱えるモデルも増えていくことが予定されているので、期待して待ちたいと思います。