RandomForestを使用しCV確率を予測。
ユーザーを予測CV確率に応じてA,B,C,D,Fの5階級に分けをし、
各階級の人数をカウントするところまでをWorkflow化する。
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
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
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
予測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)
SELECT
grade,
count(*)
FROM
awa_lead_scoring.lead_scoring_grade
GROUP BY
grade
ORDER BY
grade
https://docs.treasuredata.com/articles/workflows
-DAG形式のワークフローの作成
-ローカルで実装してTreasureDataに登録しスケジュール実行
-DataConnectorによるデータインポート、Presto・Hiveでのクエリ実行、他システムへのデータエクスポート
などが可能。
事前にTreasure DataのCLIであるTD Toolbetをインストールしておく必要がある。
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 |