アクションマイニングを用いた最適なアクションの導出

38
アクションマイニングを⽤いた 最適アクションの導出 2013年10⽉12⽇ 第34回Tokyo.R @sfchaos

description

 

Transcript of アクションマイニングを用いた最適なアクションの導出

Page 1: アクションマイニングを用いた最適なアクションの導出

アクションマイニングを⽤いた最適アクションの導出2013年10⽉12⽇第34回Tokyo.R

@sfchaos

Page 2: アクションマイニングを用いた最適なアクションの導出

1

⾃⼰紹介�TwitterID:@sfchaos

�お仕事:⾦融⼯学→データマイニング

�Rを使わなくても良い勉強会があると聞き,⾶んできました!

Page 3: アクションマイニングを用いた最適なアクションの導出

2

1. イントロダクション

Page 4: アクションマイニングを用いた最適なアクションの導出

3

真夏⽇ですが,秋ですね!

Page 5: アクションマイニングを用いた最適なアクションの導出

4

2013年秋今をときめく

データサイエンティストたち

出典:http://markezine.jp/article/detail/18435

出典:佐藤洋⾏他,データサイエンティスト養成読本,   Software Design Plus, 技術評論社, 2013年.

Page 6: アクションマイニングを用いた最適なアクションの導出

5

データサイエンティストに憧れて・・・機械学習を使って予測精度を上げれば

業務に使ってもらえる

Page 7: アクションマイニングを用いた最適なアクションの導出

6

そんな⾵に思っていた時期がありました

Page 8: アクションマイニングを用いた最適なアクションの導出

7

ところが,世の中はそんなには⽢くない(場合がある)らしい頑張って 予測精度を 上げたのに

業務に合わず 使ってもらえず

わずかでも 精度を上げて 胸張るが

売上コスト 説明できず

予測力 端から見れば テストの点

数点アップも 劣等生

Page 9: アクションマイニングを用いた最適なアクションの導出

8

予測に限らずパターン発⾒でも得られた知⾒をアクションに

結びつけることが重要

Page 10: アクションマイニングを用いた最適なアクションの導出

9

例えば退会者の分析(churn analysis)

「誰が退会するか」だけではなく,「どうすれば退会を阻⽌できるか」が

実務的には重要

Page 11: アクションマイニングを用いた最適なアクションの導出

10

そんなある⽇⾒つけたアクションマイニングという

キーワード

Page 12: アクションマイニングを用いた最適なアクションの導出

11

というわけで,今⽇はアクションマイニングの

サワリについてお話します

Page 13: アクションマイニングを用いた最適なアクションの導出

12

2. アクションマイニング

Page 14: アクションマイニングを用いた最適なアクションの導出

13

アクションマイニングとは,アクション可能な知識発⾒の⼀分野

(Actionable Knoledge Discovery, AKD)

Page 15: アクションマイニングを用いた最適なアクションの導出

14

従来の予測・パターン発⾒

従来の予測・パターン発⾒では,説明変数を原因,

結果変数を結果として考える.

説明変数 結果変数

Page 16: アクションマイニングを用いた最適なアクションの導出

15

決定⽊サービスレベル

性別

0.9 0.2

⼥性 男性

0.1

レート

0.9 0.2

LowMiddle

High

Low High

顧客の満⾜度

Page 17: アクションマイニングを用いた最適なアクションの導出

16

パンとチーズを購⼊

ワインを購⼊する

以下が起きているときに,チーズを無料にすればワインを購⼊する⼈は増えるか?� 多くの消費者がパンを購⼊する� あまり多くの消費者はチーズを購⼊しない

アソシエーション分析

Page 18: アクションマイニングを用いた最適なアクションの導出

17

説明変数 結果変数

現状値

⽬標値

現状の状態

変更後の状態

何をどのように変えればよいか?

アクションマイニング結果変数を⽬標値にするために,

説明変数をどのように変えればよいか

Page 19: アクションマイニングを用いた最適なアクションの導出

18

3. 因果ネットワーク

Page 20: アクションマイニングを用いた最適なアクションの導出

19

因果ネットワークとは,変数の間の(因果)関係をあらわした

⾮循環有向グラフ(asyclic directed graph)

Page 21: アクションマイニングを用いた最適なアクションの導出

20

季節

スプリンクラー ⾬

湿り

滑りやすさ

Page 22: アクションマイニングを用いた最適なアクションの導出

21

必要なパッケージのインストール� Rgraphvizパッケージ> source("http://bioconductor.org/biocLite.R")> source("http://bioconductor.org/biocLite.R")> source("http://bioconductor.org/biocLite.R")> source("http://bioconductor.org/biocLite.R")> biocLite("Rgraphviz")> biocLite("Rgraphviz")> biocLite("Rgraphviz")> biocLite("Rgraphviz")

� bnlearnパッケージ> install.packages("bnlearn")> install.packages("bnlearn")> install.packages("bnlearn")> install.packages("bnlearn")

Page 23: アクションマイニングを用いた最適なアクションの導出

22

Alarmデータセット�患者の診断項⽬とアラームのデータセット> library(bnlearn)> library(bnlearn)> library(bnlearn)> library(bnlearn)> alarm[1:2, ]> alarm[1:2, ]> alarm[1:2, ]> alarm[1:2, ] CVP PCWP HIST TPR BP CO HRBP HREK HRSA PAP SAO2 FIO2 CVP PCWP HIST TPR BP CO HRBP HREK HRSA PAP SAO2 FIO2 CVP PCWP HIST TPR BP CO HRBP HREK HRSA PAP SAO2 FIO2 CVP PCWP HIST TPR BP CO HRBP HREK HRSA PAP SAO2 FIO21 NORMAL NORMAL FALSE LOW NORMAL HIGH HIGH HIGH HIGH NORMAL NORMAL LOW1 NORMAL NORMAL FALSE LOW NORMAL HIGH HIGH HIGH HIGH NORMAL NORMAL LOW1 NORMAL NORMAL FALSE LOW NORMAL HIGH HIGH HIGH HIGH NORMAL NORMAL LOW1 NORMAL NORMAL FALSE LOW NORMAL HIGH HIGH HIGH HIGH NORMAL NORMAL LOW2 NORMAL NORMAL FALSE NORMAL LOW LOW HIGH HIGH HIGH NORMAL LOW NORMAL2 NORMAL NORMAL FALSE NORMAL LOW LOW HIGH HIGH HIGH NORMAL LOW NORMAL2 NORMAL NORMAL FALSE NORMAL LOW LOW HIGH HIGH HIGH NORMAL LOW NORMAL2 NORMAL NORMAL FALSE NORMAL LOW LOW HIGH HIGH HIGH NORMAL LOW NORMAL PRSS ECO2 MINV MVS HYP LVF APL ANES PMB INT KINK DISC PRSS ECO2 MINV MVS HYP LVF APL ANES PMB INT KINK DISC PRSS ECO2 MINV MVS HYP LVF APL ANES PMB INT KINK DISC PRSS ECO2 MINV MVS HYP LVF APL ANES PMB INT KINK DISC1 HIGH ZERO HIGH NORMAL FALSE FALSE FALSE FALSE FALSE NORMAL FALSE TRUE1 HIGH ZERO HIGH NORMAL FALSE FALSE FALSE FALSE FALSE NORMAL FALSE TRUE1 HIGH ZERO HIGH NORMAL FALSE FALSE FALSE FALSE FALSE NORMAL FALSE TRUE1 HIGH ZERO HIGH NORMAL FALSE FALSE FALSE FALSE FALSE NORMAL FALSE TRUE2 HIGH ZERO ZERO NORMAL FALSE FALSE FALSE FALSE FALSE NORMAL FALSE FALSE2 HIGH ZERO ZERO NORMAL FALSE FALSE FALSE FALSE FALSE NORMAL FALSE FALSE2 HIGH ZERO ZERO NORMAL FALSE FALSE FALSE FALSE FALSE NORMAL FALSE FALSE2 HIGH ZERO ZERO NORMAL FALSE FALSE FALSE FALSE FALSE NORMAL FALSE FALSE LVV STKV CCHL ERLO HR ERCA SHNT PVS ACO2 VALV VLNG VTUB LVV STKV CCHL ERLO HR ERCA SHNT PVS ACO2 VALV VLNG VTUB LVV STKV CCHL ERLO HR ERCA SHNT PVS ACO2 VALV VLNG VTUB LVV STKV CCHL ERLO HR ERCA SHNT PVS ACO2 VALV VLNG VTUB1 NORMAL NORMAL HIGH FALSE HIGH FALSE NORMAL NORMAL NORMAL HIGH LOW ZERO1 NORMAL NORMAL HIGH FALSE HIGH FALSE NORMAL NORMAL NORMAL HIGH LOW ZERO1 NORMAL NORMAL HIGH FALSE HIGH FALSE NORMAL NORMAL NORMAL HIGH LOW ZERO1 NORMAL NORMAL HIGH FALSE HIGH FALSE NORMAL NORMAL NORMAL HIGH LOW ZERO2 NORMAL LOW HIGH FALSE HIGH FALSE NORMAL LOW LOW ZERO ZERO LOW2 NORMAL LOW HIGH FALSE HIGH FALSE NORMAL LOW LOW ZERO ZERO LOW2 NORMAL LOW HIGH FALSE HIGH FALSE NORMAL LOW LOW ZERO ZERO LOW2 NORMAL LOW HIGH FALSE HIGH FALSE NORMAL LOW LOW ZERO ZERO LOW VMCH VMCH VMCH VMCH1 NORMAL1 NORMAL1 NORMAL1 NORMAL2 NORMAL2 NORMAL2 NORMAL2 NORMAL

Page 24: アクションマイニングを用いた最適なアクションの導出

23

Alarmデータセット�診断項⽬(変数)間の関係を可視化> library(bnlearn)> library(bnlearn)> library(bnlearn)> library(bnlearn)> res = empty.graph(names(alarm))> res = empty.graph(names(alarm))> res = empty.graph(names(alarm))> res = empty.graph(names(alarm))> modelstring(res) <- > modelstring(res) <- > modelstring(res) <- > modelstring(res) <-

paste("[HIST|LVF][CVP|LVV][PCWP|LVV][HYP][LVV|HYP:LVF]",paste("[HIST|LVF][CVP|LVV][PCWP|LVV][HYP][LVV|HYP:LVF]",paste("[HIST|LVF][CVP|LVV][PCWP|LVV][HYP][LVV|HYP:LVF]",paste("[HIST|LVF][CVP|LVV][PCWP|LVV][HYP][LVV|HYP:LVF]",+ "[LVF][STKV|HYP:LVF][ERLO][HRBP|ERLO:HR][HREK|ERCA:HR][ERCA]",+ "[LVF][STKV|HYP:LVF][ERLO][HRBP|ERLO:HR][HREK|ERCA:HR][ERCA]",+ "[LVF][STKV|HYP:LVF][ERLO][HRBP|ERLO:HR][HREK|ERCA:HR][ERCA]",+ "[LVF][STKV|HYP:LVF][ERLO][HRBP|ERLO:HR][HREK|ERCA:HR][ERCA]",+ "[HRSA|ERCA:HR][ANES][APL][TPR|APL][ECO2|ACO2:VLNG][KINK]",+ "[HRSA|ERCA:HR][ANES][APL][TPR|APL][ECO2|ACO2:VLNG][KINK]",+ "[HRSA|ERCA:HR][ANES][APL][TPR|APL][ECO2|ACO2:VLNG][KINK]",+ "[HRSA|ERCA:HR][ANES][APL][TPR|APL][ECO2|ACO2:VLNG][KINK]",+ + + +

"[MINV|INT:VLNG][FIO2][PVS|FIO2:VALV][SAO2|PVS:SHNT][PAP|PMB][PMB]","[MINV|INT:VLNG][FIO2][PVS|FIO2:VALV][SAO2|PVS:SHNT][PAP|PMB][PMB]","[MINV|INT:VLNG][FIO2][PVS|FIO2:VALV][SAO2|PVS:SHNT][PAP|PMB][PMB]","[MINV|INT:VLNG][FIO2][PVS|FIO2:VALV][SAO2|PVS:SHNT][PAP|PMB][PMB]",+ + + +

"[SHNT|INT:PMB][INT][PRSS|INT:KINK:VTUB][DISC][MVS][VMCH|MVS]","[SHNT|INT:PMB][INT][PRSS|INT:KINK:VTUB][DISC][MVS][VMCH|MVS]","[SHNT|INT:PMB][INT][PRSS|INT:KINK:VTUB][DISC][MVS][VMCH|MVS]","[SHNT|INT:PMB][INT][PRSS|INT:KINK:VTUB][DISC][MVS][VMCH|MVS]",+ + + +

"[VTUB|DISC:VMCH][VLNG|INT:KINK:VTUB][VALV|INT:VLNG][ACO2|VALV]","[VTUB|DISC:VMCH][VLNG|INT:KINK:VTUB][VALV|INT:VLNG][ACO2|VALV]","[VTUB|DISC:VMCH][VLNG|INT:KINK:VTUB][VALV|INT:VLNG][ACO2|VALV]","[VTUB|DISC:VMCH][VLNG|INT:KINK:VTUB][VALV|INT:VLNG][ACO2|VALV]",+ "[CCHL|ACO2:ANES:SAO2:TPR][HR|CCHL][CO|HR:STKV][BP|CO:TPR]", + "[CCHL|ACO2:ANES:SAO2:TPR][HR|CCHL][CO|HR:STKV][BP|CO:TPR]", + "[CCHL|ACO2:ANES:SAO2:TPR][HR|CCHL][CO|HR:STKV][BP|CO:TPR]", + "[CCHL|ACO2:ANES:SAO2:TPR][HR|CCHL][CO|HR:STKV][BP|CO:TPR]",

sep = "")sep = "")sep = "")sep = "")> graphviz.plot(res)> graphviz.plot(res)> graphviz.plot(res)> graphviz.plot(res)

Page 25: アクションマイニングを用いた最適なアクションの導出

24

CVPPCWP

HIST

TPR

BP

CO HRBP HREKHRSA

PAP

SAO2

FIO2

PRSS

ECO2

MINV

MVS

HYP LVF

APL

ANES

PMB INT KINK

DISC

LVV STKV

CCHL

ERLO HR ERCA

SHNT

PVS ACO2

VALV

VLNG

VTUB

VMCH

複雑な,あまりに複雑な

Blood Pressure

Page 26: アクションマイニングを用いた最適なアクションの導出

25

4. 因果ネットワークを⽤いたアクションマイニング

Page 27: アクションマイニングを用いた最適なアクションの導出

26

今回は次の論⽂で提案された⼿法を紹介

P.Shamsinejadbabak, M.Sarace, and H.Blockeel, Causality-based cost-

effective action mining, 2013.

Page 28: アクションマイニングを用いた最適なアクションの導出

27

CREAMアルゴリズム

Page 29: アクションマイニングを用いた最適なアクションの導出

28

Step.1因果ネットワークが与えられた前提で,

以下の値を外製的に設定§ スプリンクラーをOffからOnに変えるコスト§ 滑りやすさが変更されたときに得られる利益

Step.2⽬標とする滑りやすさを設定

Step.3スプリンクラーをOffからOnにしたときに,

⽬標とする滑りやすさが実現する条件付確率を算出

Step.4Step.1で設定した利益とStep.3で求めた条件

付確率から,利益upの期待値を算出

Step.5スプリンクラーをOffからOnにする期待効果 =

Step.4で算出した利益upの期待値 - Step.1で設定したコスト

滑りやすさを

説明変数(要因)の状態を変えたときに,

結果変数が⽬標値になる条件付確率を算出し,

期待効果を推定季節

スプリンクラー ⾬

湿り

滑りやすさ

Page 30: アクションマイニングを用いた最適なアクションの導出

29

こんな感じでアクションが出てくる� 業務では,このような分析結果をもとに,変数を変えるため

の施策を考える活⽤イメージ(?)

ID アクション 結果効果

(=利益 - コスト)001 CVP=HIGH =>

NORMALBP=HIGH ⇒ NORMAL(⾎圧が「⾼」から「正常」に)

300,000円

002 ・・・ ・・・ ・・・・・・ ・・・ ・・・ ・・・

Page 31: アクションマイニングを用いた最適なアクションの導出

30

Rでの実装

cream.main <- function(target="BP", n=173328)cream.main <- function(target="BP", n=173328)cream.main <- function(target="BP", n=173328)cream.main <- function(target="BP", n=173328){{{{ # CREAM # CREAM # CREAM # CREAMアルゴリズムを実⾏する関数 # @param target: target attribute(character) # @param target: target attribute(character) # @param target: target attribute(character) # @param target: target attribute(character) # @param n: number of record of observational data # @param n: number of record of observational data # @param n: number of record of observational data # @param n: number of record of observational data

library(bnlearn) library(bnlearn) library(bnlearn) library(bnlearn)

# # # # 観測データ((((アラームデータセット)))) data(alarm) data(alarm) data(alarm) data(alarm)

# CREAM # CREAM # CREAM # CREAMアルゴリズムの実⾏ cost <- 1.0 cost <- 1.0 cost <- 1.0 cost <- 1.0 profit <- 1.0 profit <- 1.0 profit <- 1.0 profit <- 1.0 cn <- hc(alarm) cn <- hc(alarm) cn <- hc(alarm) cn <- hc(alarm) cream(alarm, target, "NORMAL", cost, profit, cn) cream(alarm, target, "NORMAL", cost, profit, cn) cream(alarm, target, "NORMAL", cost, profit, cn) cream(alarm, target, "NORMAL", cost, profit, cn)}}}}

プログラムは後⽇公開予定

Page 32: アクションマイニングを用いた最適なアクションの導出

31

Rでの実装

cream <- function(x, target, target.value, cost, profit, cn)cream <- function(x, target, target.value, cost, profit, cn)cream <- function(x, target, target.value, cost, profit, cn)cream <- function(x, target, target.value, cost, profit, cn){{{{ # The CREAM algorithm # The CREAM algorithm # The CREAM algorithm # The CREAM algorithm # for learning cost-effective action sets from causal networks # for learning cost-effective action sets from causal networks # for learning cost-effective action sets from causal networks # for learning cost-effective action sets from causal networks

# @param x: object data(data frame or matrix) # @param x: object data(data frame or matrix) # @param x: object data(data frame or matrix) # @param x: object data(data frame or matrix) # @param target: target attribute(character) # @param target: target attribute(character) # @param target: target attribute(character) # @param target: target attribute(character) # @param target.value: target value # @param target.value: target value # @param target.value: target value # @param target.value: target value # @param cost: cost data(numeric) # @param cost: cost data(numeric) # @param cost: cost data(numeric) # @param cost: cost data(numeric) # @param profit: profit(numeric) # @param profit: profit(numeric) # @param profit: profit(numeric) # @param profit: profit(numeric) # @param cn: underlying causal network # @param cn: underlying causal network # @param cn: underlying causal network # @param cn: underlying causal network # @return # @return # @return # @return

library(foreach) library(foreach) library(foreach) library(foreach) library(doSNOW) library(doSNOW) library(doSNOW) library(doSNOW)

var.list <- colnames(x) var.list <- colnames(x) var.list <- colnames(x) var.list <- colnames(x) to.str <- paste0("(", target, "=='", target.value, "')") to.str <- paste0("(", target, "=='", target.value, "')") to.str <- paste0("(", target, "=='", target.value, "')") to.str <- paste0("(", target, "=='", target.value, "')")

result <- vector("list", nrow(x)) result <- vector("list", nrow(x)) result <- vector("list", nrow(x)) result <- vector("list", nrow(x))

fitted <- bn.fit(cn, x) fitted <- bn.fit(cn, x) fitted <- bn.fit(cn, x) fitted <- bn.fit(cn, x) ............}}}}

プログラムは後⽇公開予定

Page 33: アクションマイニングを用いた最適なアクションの導出

32

CREAMをさらに進化させて因果ネットワークも内部で推定する

ICE-CREAM(アイスクリーム)という⼿法もある

Page 34: アクションマイニングを用いた最適なアクションの導出

33

5. まとめ

Page 35: アクションマイニングを用いた最適なアクションの導出

34

�アクションマイニングは,⽬的とする状態にするために,どのような要因を変化させると効果的かについて⽰唆.

�ぶっちゃけ,当初の⽬的からすると,ややスケールダウンな感じも・・・

�が,うまく使えば「何をどう変えれば収益をupさせられるか」が分かるかも!?

Page 36: アクションマイニングを用いた最適なアクションの導出

35

そんなこんなで,気がついたら

Rを使ってしまっていた・・・

Page 37: アクションマイニングを用いた最適なアクションの導出

36

やはり便利ですね,Rは!

Page 38: アクションマイニングを用いた最適なアクションの導出

37

参考⽂献⽂献名 著者 出版社等 コメント

Incorporating causal reasoningin cost-effective action mining

Hendrik Blockeel COSTS workshop @ ICDM 2012

下記の論⽂を要訳したスライドであり,分かりやすい.

Causality-based Cost-effective Action Mining

Pirooz Shamsinejadbabaki, Mohamad Saraee, and Hendrik 

因果ネットワークを⽤いたCREAM, ICE-CREAMという2つのアクションマイニングのアルゴリズムを提唱.

Action Rules Mining

Agnieszka Dardzinska

Springer 未読.この分野を専⾨的に扱った本.