アクションマイニングを用いた最適なアクションの導出
description
Transcript of アクションマイニングを用いた最適なアクションの導出
アクションマイニングを⽤いた最適アクションの導出2013年10⽉12⽇第34回Tokyo.R
@sfchaos
1
⾃⼰紹介�TwitterID:@sfchaos
�お仕事:⾦融⼯学→データマイニング
�Rを使わなくても良い勉強会があると聞き,⾶んできました!
2
1. イントロダクション
3
真夏⽇ですが,秋ですね!
4
2013年秋今をときめく
データサイエンティストたち
出典:http://markezine.jp/article/detail/18435
出典:佐藤洋⾏他,データサイエンティスト養成読本, Software Design Plus, 技術評論社, 2013年.
5
データサイエンティストに憧れて・・・機械学習を使って予測精度を上げれば
業務に使ってもらえる
6
そんな⾵に思っていた時期がありました
7
ところが,世の中はそんなには⽢くない(場合がある)らしい頑張って 予測精度を 上げたのに
業務に合わず 使ってもらえず
わずかでも 精度を上げて 胸張るが
売上コスト 説明できず
予測力 端から見れば テストの点
数点アップも 劣等生
8
予測に限らずパターン発⾒でも得られた知⾒をアクションに
結びつけることが重要
9
例えば退会者の分析(churn analysis)
「誰が退会するか」だけではなく,「どうすれば退会を阻⽌できるか」が
実務的には重要
10
そんなある⽇⾒つけたアクションマイニングという
キーワード
11
というわけで,今⽇はアクションマイニングの
サワリについてお話します
12
2. アクションマイニング
13
アクションマイニングとは,アクション可能な知識発⾒の⼀分野
(Actionable Knoledge Discovery, AKD)
14
従来の予測・パターン発⾒
従来の予測・パターン発⾒では,説明変数を原因,
結果変数を結果として考える.
説明変数 結果変数
15
決定⽊サービスレベル
性別
0.9 0.2
⼥性 男性
0.1
レート
0.9 0.2
LowMiddle
High
Low High
顧客の満⾜度
16
パンとチーズを購⼊
ワインを購⼊する
以下が起きているときに,チーズを無料にすればワインを購⼊する⼈は増えるか?� 多くの消費者がパンを購⼊する� あまり多くの消費者はチーズを購⼊しない
アソシエーション分析
17
説明変数 結果変数
現状値
⽬標値
現状の状態
変更後の状態
何をどのように変えればよいか?
アクションマイニング結果変数を⽬標値にするために,
説明変数をどのように変えればよいか
18
3. 因果ネットワーク
19
因果ネットワークとは,変数の間の(因果)関係をあらわした
⾮循環有向グラフ(asyclic directed graph)
20
季節
スプリンクラー ⾬
湿り
滑りやすさ
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")
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
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)
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
25
4. 因果ネットワークを⽤いたアクションマイニング
26
今回は次の論⽂で提案された⼿法を紹介
P.Shamsinejadbabak, M.Sarace, and H.Blockeel, Causality-based cost-
effective action mining, 2013.
27
CREAMアルゴリズム
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で設定したコスト
滑りやすさを
説明変数(要因)の状態を変えたときに,
結果変数が⽬標値になる条件付確率を算出し,
期待効果を推定季節
スプリンクラー ⾬
湿り
滑りやすさ
29
こんな感じでアクションが出てくる� 業務では,このような分析結果をもとに,変数を変えるため
の施策を考える活⽤イメージ(?)
ID アクション 結果効果
(=利益 - コスト)001 CVP=HIGH =>
NORMALBP=HIGH ⇒ NORMAL(⾎圧が「⾼」から「正常」に)
300,000円
002 ・・・ ・・・ ・・・・・・ ・・・ ・・・ ・・・
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)}}}}
プログラムは後⽇公開予定
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) ............}}}}
プログラムは後⽇公開予定
32
CREAMをさらに進化させて因果ネットワークも内部で推定する
ICE-CREAM(アイスクリーム)という⼿法もある
33
5. まとめ
34
�アクションマイニングは,⽬的とする状態にするために,どのような要因を変化させると効果的かについて⽰唆.
�ぶっちゃけ,当初の⽬的からすると,ややスケールダウンな感じも・・・
�が,うまく使えば「何をどう変えれば収益をupさせられるか」が分かるかも!?
35
そんなこんなで,気がついたら
Rを使ってしまっていた・・・
36
やはり便利ですね,Rは!
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 未読.この分野を専⾨的に扱った本.