コラム

2021.06.29

Treasure Data Hivemallで退会予測する方法

● はじめに


 前回のコラム「プログラミング不要! 機械学習で退会予測(Treasure Data Predictive Scoring)」では、Treasure Dataの「Predictive Scoring」という機能を用いてCRMの退会予測を行う方法を紹介しました。すべてUI上の操作で完結できるもので、プログラミングの知識が一切必要でなかったことが特徴的でした。

 実はTreasure Dataにはもう1つ、機械学習で退会予測を行うことができる機能が存在しています。それが今回取り上げる「Hivemall」です。
こちらはSQLや機械学習の知識をある程度要求されるものにはなっていますが、その分自分なりの微調整を加えることができる柔軟性もあります。

 Hivemallで退会予測をしてみたい、でも手順がイマイチわからない。そんな人のために、本記事ではHivemallで退会予測を行う手順を整理し、紹介していきます。

● Hivemallとは


 HivemallはTreasureDataが開発している機械学習ライブラリです。Hivemallを活用すれば、Predictive Scoringよりさらに本格的な機械学習を行うことができます。

 Predictive Scoringはロジスティック回帰のアルゴリズムを用いた二値分類を行うことが可能となっている一方で、Hivemallはそれに加えて線形回帰やXGBoostなど多くの手法が用意されており、それらを使用する事で、回帰、マルチクラス分類、レコメンド、自然言語処理など、様々な問題を扱うことができます。

 Hivemallで機械学習を行うメリットとしては以下の3つが挙げられます。

  • Predictive Scoringでは算出できない評価指標(例えば「Log Loss」など)を参照できる
  • 一度作成したSQLをベースに、カスタマイズを施して他の問題に転用できる
  • Treasure Data Workflowに組み込んで処理を自動化、定期化することができる

参考:プレスリリース:機械学習ライブラリ「Hivemall」を提供開始
(リンク先:Treasure Data Webページ)

● Hivemallの使い方・退会予測の手順


 Hivemallを用いた二値分類での退会予測は以下の手順で可能でした。後程、前回記事でのPredictive Scoringとの違いも振り返っていきたいと思います。

<大まかな手順>

  1. 前処理
    ・入力データの作成
    ・トレーニングデータを抽出
  2. トレーニング
    ・トレーニング実行
  3. 予測
    ・予測実行
  4. 結果取得
    ・予測結果と前処理データの紐づけ
  5. 評価
    ・AUC指標の算出
    ・Log Loss指標の算出

<利用データ>

  • オンラインで公開されているパブリックデータ(約7,000件)
  • 含まれているデータ:各会員の退会フラグ、性別、未既婚、サービスへの支払額、サポートサービス加入の有無など

● 手順1.前処理


1-1:入力データの作成①

 トレーニング用データを作成するにあたり、以下をセットします。

  • ユーザーを識別するカラム(顧客ID)
  • 予測する材料となるカラム(契約期間、1か月の利用料金、利用料金総額など)
  • 予測したいカラム(解約状況:1=解約済、0=未解約)

 予測する材料となるカラムは配列型のカラム内に全てセットします。

<参考クエリ>

INSERT OVERWRITE TABLE customer_churn_dataset_array 
  SELECT
    customerid,
  ARRAY(phoneservice,multiplelines,internetservice,onlinesecurity,onlinebackup,deviceprotection,techsupport) AS features,

    churn AS target
  FROM
    customer_churn_seed

<結果>

 このように、Hivemallでは予測する材料となるカラム(説明変数)を配列型で保持しておく必要があります。

1-2:入力データの作成②

 トレーニングデータと検証データに分けるため、各レコードに行番号(rownum)を採番します。検証データは後の評価の手順で利用します。

<参考クエリ>

INSERT OVERWRITE TABLE customer_churn_dataset_rownum
  SELECT
    customerid,
    features,
    target,
    row_number() over (order by customerid, features, target) AS rownum
  FROM
    customer_churn_dataset_array
  GROUP BY 1,2,3

<結果>

1-3:トレーニングデータを抽出

 入力データの総レコード数の8割のレコードをトレーニングデータとして抽出します。
入力データのうち、採番した行番号が総レコード数×0.8の数値より少ないものを抽出します。

※一般に教師あり学習を行う際、モデルがトレーニングデータに適合しすぎた(過学習した)結果、モデルの汎用性が損なわれてしまうことがあります。
 その事態が起きていないかを確認するため、全データを学習に使うのではなく、正解データを任意の割合で(例 80%:20%)トレーニングデータと検証データに分割し、トレーニングデータでモデル構築を行い、検証データでモデルの評価を行うことが良いとされています。

<参考クエリ>

INSERT OVERWRITE TABLE customer_churn_dataset_extract
  SELECT
    customerid,
    features,
    target,
    rownum
  FROM
    customer_churn_dataset_rownum
  WHERE rownum < 7000 * 0.8

※WHERE rownum < の箇所はテーブル件数に応じて変更必要。

1-4:検証データを抽出

 上記1-3で抽出した8割のデータ以外を検証用データとして抽出します。

<参考クエリ>

INSERT OVERWRITE TABLE customer_churn_dataset_extract2
  SELECT
    customerid,
    features,
    target,
    rownum
  FROM
    customer_churn_dataset_rownum
  WHERE rownum >= 7000 * 0.8

※WHERE rownum >= の箇所はテーブル件数に応じて変更必要。

● 手順2.トレーニング


2-1:トレーニング実行

 作成したトレーニングデータを用いてモデルのトレーニングを実行します。

 二値分類では train_xgboost関数 を使ってトレーニングを行います。train_xgboost は UDTF(関数)であり、予測モデルを返します。

<UDTF: User-Defined Table Function>

  • 第1引数に予測する材料となるカラム、
  • 第2引数に予測したいカラム、
  • 第3引数にハイパーパラメータ(学習のさせ方を調整する)

を指定します。

<参考クエリ>

INSERT OVERWRITE TABLE customer_churn_train
  SELECT
    train_xgboost(
                    features,
                    target,
                    '-objective binary:logistic'
                  )
  FROM
    customer_churn_dataset_extract

※‘-objective binary:logistic’:2値分類をロジスティック回帰で学習するための設定。

 その他設定可能なパラメータは train_xgboost ハイパーパラメータ一覧 の通りです。

 第3引数のハイパーパラメータの設定を変更することにより、様々なアルゴリズムを用いて学習を行うことができます。

<結果>

● 手順3.予測


3-1:予測実行

 トレーニングをしたモデルを用いて予測を実行します。

 予測には xgboost_predict関数 を使用します。xgboost_predict関数の引数として、あらかじめ1-4で用意した検証データの説明変数(features)カラム、行番号カラム(rownum)と、2-1で学習したモデルの情報が必要となります。モデルの情報は、検証データの各行に結合する必要があります。以下のクエリでは検証データに対して学習したモデルが格納されたテーブルをCROSS JOIN(LEFT OUTER JOINの条件無し)を行っています。

<参考クエリ>

INSERT OVERWRITE TABLE customer_churn_predict
  SELECT
    xgboost_predict(
                    customer_churn_dataset_extract2.rownum,
                    customer_churn_dataset_extract2.features,
                    customer_churn_train.model_id,
                    customer_churn_train.model
                    ) AS (rownum, predicted)
  FROM
    customer_churn_train
  LEFT OUTER JOIN customer_churn_dataset_extract2

<結果>

 予測結果として、predictedカラムにtargetが1である確率(解約にどれだけ近いかの予測)が出力されます。

● 手順4.結果取得


4-1:予測結果と前処理したデータを紐づける

 AUC指標やAccuracy指標といった評価指標を算出するためには、以下が必要となります。

  • 目的変数(解約フラグtarget)
  • 予測結果の数値(predicted)

 これを用意するため、上記3-1で得られた予測結果とトレーニング前の前処理済みデータを紐づけます。(予め付与したrownumで紐づける)

※後続の評価のため、predictedカラム(予測結果:target=1である確率)を降順で並べ替える必要があります。

<参考クエリ>

INSERT OVERWRITE TABLE customer_churn_predicted
  SELECT
    customer_churn_predict.rownum,
    customer_churn_predict.predicted[0] AS predicted,
    customer_churn_dataset_extract2
  FROM
    customer_churn_predict
  INNER JOIN customer_churn_dataset_extract2
  ON customer_churn_predict.rownum = customer_churn_dataset_extract2.rownum
  ORDER BY predicted DESC--【重要】スコアが高い順に並べておく必要がある

<結果>

 これにより、解約の確率が高いと予想されたデータを確率が高い順に並べることができました。

 この結果から、例えばpredictedのスコアが一定以上のユーザーを 抽出し、例えばCRMツールへ連携する、などの施策へ繋げることができます。

● 手順5.評価


5-1:AUC指標の算出

 評価指標としてAUC指標を算出します。
 AUC指標は二値分類の評価で用いられ、0~1の値をとり、1に近ければ近いほど良いとされています。

 以下のようにAUC関数で、降順に並べた予測結果(predictedカラム)と予測対象である顧客ID(targetカラム)を指定します。

<参考クエリ>

INSERT OVERWRITE TABLE customer_churn_auc
SELECT
  AUC(
    predicted,
    target
  ) as auc
FROM
  customer_churn_predicted

<結果>

5-2:Log Loss指標の算出

 PredictiveScoringでは評価指標として出力されるのはAcuuracyとAUCのみとなっていましたが、HivemallではLog Loss指標も算出することができます。

 Log Loss(Logarithmic Loss)とは、分類モデルの性能を測る指標です。0~1の値をとり、予測値が正解から離れるほど増加し、完璧なモデルではLog Lossが0になります。

 Accuracyは予測値の正解/不正解のみ考慮しますが、Log Lossは「正解からの差」を考慮することができます。今回のような退会予測では、「退会する場合、どれくらい退会する確率が高いか」が重要であり、このような場合にはAccuracyではなくLog Lossを評価指標とするのが望ましいとも言えます。

 算出には以下の通り、logloss関数 で降順に並べた予測結果(predictedカラム)と予測対象である顧客ID(targetカラム)を指定します。

<参考クエリ>

INSERT OVERWRITE TABLE customer_churn_logloss
SELECT
  logloss(
    predicted,
    target
  ) as logloss
FROM
  customer_churn_predicted

<結果>

Predictive Scoringでの退会予測と比べて


  • すべてがUI上で実施となるPredictive Scoringと違い、Hivemallでの機械学習はSQLによる実施となります。このため、処理の微調整(例えばトレーニングデータと検証データの割合を変更)したり、一つ一つの処理結果を確認し分析するといったような柔軟な使い方ができると言えます。
  • 評価指標もAUC指標、Accuracy指標に加えて、例えば本コラムではLog Loss指標を確認しましたが、解く問題によって柔軟に評価指標を選択する事が可能となっています。*1
  • 一方で、Predictive Scoringでは解約に影響が大きいと予想されるデータ項目をピックアップしてくれる機能がありましたが、本コラムで使ったxgboost関数においては、同等の機能は実装されていないようです。同じような機能を使いたい場合は、RandomForest を検討いただくのが良いかもしれません。*2

*1 例えば、売上高など数値を予測したい場合(回帰問題)、HivemallのユーザガイドのRegression Metricsを参照いただくと回帰問題の代表的な評価指標の使い方を確認する事が出来ます。

*2 RandomForestというアルゴリズムは、今回ご紹介したxgboost関数と同じような手順で扱う事が出来ます。こちらのリンクを参照いただくと、その手順と「Predictive Scoringでは解約に影響が大きいと予想されるデータ項目をピックアップしてくれる機能」に相当する機能の使い方を確認する事が出来ます。

おわりに


 今回はSQLを使って本格的な機械学習を行う方法としてTreasure Data Hivemallをご紹介しました。
Python等のプログラミング言語でコードを書いたり、機械学習のための環境を用意したりせずにSQLクエリを書くことで本格的な機械学習を行うことができます。
今回は二値分類の手順をご紹介しましたが、使用する関数やパラメータを変更することでPredictive Scoringでは扱えないマルチクラス分類など他の様々な問題を扱うことができます。

 弊社DataCurrentは、Treasure Dataのシルバー・パートナーとして、このようにTreasure Dataを使ったデータ利用施策の支援を提供しています。
 上記のような取り組みを自社データでやってみたい、けれどスタートアップのタイミングでは一時的に運用のサポートをしてほしいといったお声があれば、サポートさせていただくことも可能ですので是非一度ご相談ください。

本件に関するお問い合わせは下記にて承ります。
株式会社DataCurrent
info@datacurrent.co.jp