
モデルを評価する。
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 |
これらの項目と値の意味を簡単に解説しますが、その前に二項分類の予測と結果のマトリクスについて理解をしておく必要があります。それは以下の表で整理できます。
| 結果 | |||
| TRUE | FALSE | ||
| 予測 | 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を用いたディープニューラルネットワークなど扱えるモデルも増えていくことが予定されているので、期待して待ちたいと思います。
関連する記事
須川 敦史
UX&データスペシャリスト
クロスハック 代表 / uxmeetsdata.com 編集長


