Skip to content

Instantly share code, notes, and snippets.

@awajundesu
Last active January 27, 2017 09:58
Show Gist options
  • Select an option

  • Save awajundesu/33fbb296d1e9ae574fc8b628b9025b1a to your computer and use it in GitHub Desktop.

Select an option

Save awajundesu/33fbb296d1e9ae574fc8b628b9025b1a to your computer and use it in GitHub Desktop.

TreasureWorkflowでleadscoringを試してみる。

RandomForestを使用しCV確率を予測。
ユーザーを予測CV確率に応じてA,B,C,D,Fの5階級に分けをし、
各階級の人数をカウントするところまでをWorkflow化する。

dataset

leads-and-customers.csv

STEP1) データの前処理

hivemallでのRandomForestでは、
説明変数が量的変数であることを前提としているので、
quantify関数で質的変数に採番する必要がある。
ダミー変数を使うことも可能。

SELECT
    rowid() as rowid,
    converted as label,
    array(acquisition_channel,company_size,industry,is_manager2,days_since_signup,completed_form,visited_pricing,registered_for_webinar,attended_webinar)
        as features
FROM(
    SELECT
        --質的変数を採番して数値化
        quantify(true,converted,days_since_signup,completed_form,visited_pricing,registered_for_webinar,attended_webinar,is_manager2,acquisition_channel,company_size,industry)
            as (converted,days_since_signup,completed_form,visited_pricing,registered_for_webinar,attended_webinar,is_manager2,acquisition_channel,company_size,industry)
    FROM(
        SELECT
            *,
            --job_titleだと種類が豊富すぎるので、経営・管理者かそうでないかという1/0に変換
            case
            when LOWER(job_title) LIKE '%manager%' then 1
            when LOWER(job_title) LIKE '%director%' then 1
            when LOWER(job_title) LIKE '%supervisor%' then 1
            else 0
        end as is_manager2
    FROM
        awa_lead_scoring.lead_scoring
    ) t1    
) t2

STEP2) Random Forest による学習

train_randomforest_classifier関数を使用。
決定木の数等を引数で指定できる。
https://docs.treasuredata.com/articles/hivemall-iris-rf

また今回は、質的変数を数値化して使っているので
-attrsで変数ごとにCategoricalかQuantitativeか指定している。

SELECT
  train_randomforest_classifier(features,label,'-attrs C,C,C,C,Q,C,C,C,C -trees 50')
      as (model_id,model_type,pred_model,var_importance,oob_errors,oob_tests)
FROM
  awa_lead_scoring.lead_scoring_featured

STEP3) モデルを用いて予測

tree_predict関数で各データを全ての決定木のあてはめて、
rf_ensemble関数でアンサンブルにラベルと確率を推定。

SELECT
  rowid,
  predicted.label, predicted.probability, predicted.probabilities
FROM(
  SELECT
    rowid,
    rf_ensemble(predicted) as predicted
  FROM(
    SELECT
      t.rowid,
      tree_predict(p.model_id,p.model_type,p.pred_model,t.features,true) as predicted
    FROM
      awa_lead_scoring.lead_scoring_model  as p
      LEFT OUTER JOIN awa_lead_scoring.lead_scoring_featured as t
  ) t1
  GROUP BY
    rowid
) t2

STEP4) 予測確率からユーザーを階級分け

予測CV確率 : rank
0.8 ~ 1.0 : A
0.6 ~ 0.8 : B
0.4 ~ 0.6 : C
0.2 ~ 0.4 : D
0.0 ~ 0.2 : F

SELECT
  t.rowid,
  f.label as actual,
  t.label as predicted,
  t.cv_probability,
  case
    when (t.cv_probability < 0.2) then 'F'
    when (t.cv_probability < 0.4 AND t.cv_probability >= 0.2) then 'D'
    when (t.cv_probability < 0.6 AND t.cv_probability >= 0.4) then 'C'
    when (t.cv_probability < 0.8 AND t.cv_probability >= 0.6) then 'B'
    else 'A'
  end as grade
FROM(
  SELECT
    rowid,
    label,
    probabilities[2] as cv_probability  --Presto: probabilities[2], Hive: probabilities[1]
  FROM
    awa_lead_scoring.lead_scoring_predicted
) t
  LEFT OUTER JOIN awa_lead_scoring.lead_scoring_featured as f ON (t.rowid = f.rowid)

STEP5) 各階級の人数をカウント

SELECT
    grade,
    count(*)
FROM
    awa_lead_scoring.lead_scoring_grade
GROUP BY
    grade
ORDER BY
    grade

TreasureWorkflow

https://docs.treasuredata.com/articles/workflows

-DAG形式のワークフローの作成
-ローカルで実装してTreasureDataに登録しスケジュール実行
-DataConnectorによるデータインポート、Presto・Hiveでのクエリ実行、他システムへのデータエクスポート

などが可能。
事前にTreasure DataのCLIであるTD Toolbetをインストールしておく必要がある。

Workflowの作成

leadscoring.digを作成。

timezone: UTC

_export:
  td: 
    database: awa_lead_scoring

+task1:
  td>: queries/leadscoring_1.sql
  create_table: lead_scoring_featured
  engine: hive

+task2:
  td>: queries/leadscoring_2.sql
  create_table: lead_scoring_model
  engine: hive

+task3:
  td>: queries/leadscoring_3.sql
  create_table: lead_scoring_predicted
  engine: hive

+task4:
  td>: queries/leadscoring_4.sql
  create_table: lead_scoring_grade

+task5:
  td>: queries/leadscoring_5.sql
  create_table: lead_scoring_gradecount

順番に+task:でタスクを作成。
create_table:は"drop table if exists + create table"という意味である。
また、engine: hiveでHiveでの実行を指定。指定なしの場合はPresto。

leadscoring ━┳━leadscoring.dig  
             ┗━queries ━┳━leadscoring_1.sql  
                        ┣━leadscoring_2.sql  
                        ┣━leadscoring_3.sql  
                        ┣━leadscoring_4.sql  
                        ┗━leadscoring_5.sql  

実行

$ td wf run leadscoring

結果

grade count
A 10155
B 2565
C 2609
D 5244
F 79427
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment