500 likes | 2.02k Vues
データマイニング & パターンマイニング. 目次. 相関ルール Apriori algorithm 頻出アイテム集合を探す subset 関数 Apriori-Gen 関数 相関ルールを探す FP-growth algorithm さまざまな手法 列パタンのマイニング :PrefixSpan. 相関ルールとは. 「目玉商品 A と日用品 B を購入した顧客は、同時に高級品 C も高い確率で購入する」. A,B,C のセット商品を発売する 顧客の便利性を考えて、商品の配置を近づける. { 目玉商品 A 、日用品 B}⇒{ 高級品 C} と表現できる.
E N D
目次 • 相関ルール • Apriori algorithm • 頻出アイテム集合を探す • subset関数 • Apriori-Gen関数 • 相関ルールを探す • FP-growth algorithm • さまざまな手法 • 列パタンのマイニング:PrefixSpan
相関ルールとは 「目玉商品Aと日用品Bを購入した顧客は、同時に高級品Cも高い確率で購入する」 • A,B,Cのセット商品を発売する • 顧客の便利性を考えて、商品の配置を近づける {目玉商品A、日用品B}⇒{高級品C}と表現できる {X}⇒{Y}
価値のある相関ルールを求める • Mこのアイテムの中からkこを選ぶ方法= • kこのアイテムの各々が前提に来るか、結論に来るかのわけ方= 2k • 全部のアイテムが前提に集まる場合と、結論に集まる場合は、ルールにならないので排除 • 2k -2
価値のある相関ルールを求める • アイテムが10種類の場合でもルールは約57,000もある • 価値のある相関ルールはわずかだけ • 価値のある相関ルールとは • 確信度 conf が高い • 支持度 support が高い
アプリオリアルゴリズム(Agrawal 1994, VLDB94) • 最小確信度、最小サポート(min support)を与えて確信度、サポートがそれ以上の相関ルールを発見する support(XUY)>α support(XUY)/support(X)=conf(X⇒Y) >β を満たす相関ルールX⇒Yを取り出すのが目的
アイテム集合のサポートは単調減であることを使う。アイテム集合のサポートは単調減であることを使う。 頻出アイテム集合とは、最小サポート以上のサポートを持つアイテム集合 この背反を取ると support(XUY)とsupport(X)が必要。 support(XUY)は最小サポート以上であるので、XUYの部分集合であるXのサポートも最小サポート以上( XとY はともに条件なので、XUYは、 X、Y 単独よりも厳しい条件) 最小サポート以上の頻出アイテム集合のサポートを求めておけばすべての相関ルールの確信度を求めることができる 効率よく探し出すために {A,B}が頻出アイテム集合でない ↓ {A,B,C}も頻出アイテム集合ではない {A,B,C}が頻出アイテム集合⇒{A,B}も頻出アイテム集合
アルゴリズム • support(XUY)>αを満たす頻出アイテム集合をすべて探し出し、サポートを求める • support(XUY)/support(X)>β を満たす相関ルールを探し出す (1)が求まれば、それを使うと(2)は簡単 どうやって(1)を効率よくもとめるか
頻出アイテム集合を探し出す • 要素数の少ないサポートから求めていき、最小サポートより少ない集合を含めるものは計算しない {A,B}が頻出アイテム集合でない⇒ {A,B,C}も頻出アイテム集合ではない • データベースをスキャンしCk中の各サポートを計算する • Ck中の最小サポートを満足する部分をLkとする • LkからCk+1を生成する
Apriori algorithm L1={頻出アイテム集合} for ( k=2; Lk-1≠Ø; k++) do { Ck= apriori_gen(Lk-1) ; // New candidates for (all transactions t in D )do { Ct = subset(Ck , t) // Candidates contained in t; for (all candidates c in Ct) do {c.count++} }; Lk ={c in Ck | c.count≥ minsup} } Answer ∪k Lk }
Apriori-Gen関数 • 結合フェーズ • Lk中から最後の要素だけが異なる二つのアイテム集合を結合して要素数k+1の候補アイテム集合を作る • 枝狩りフェーズ • 結合フェーズで作った候補アイテム集合に対し、要素数kの部分集合がLkに含まれていないような候補を除去する
頻出アイテム集合を計算する例min support =2 頻出アイテム集合の候補 頻出アイテム集合の候補 頻出アイテム集合 subset関数 & minsupport>=2のものを選択 Apriori-Gen関数
頻出アイテム集合を計算する例つづき 頻出アイテム集合 頻出アイテム集合の候補 頻出アイテム集合の候補 Apriori-Gen関数 subset関数 & minsupport>=2のものを選択 ここだけが異なる subset 関数 頻出アイテム集合
頻出アイテム集合C3 頻出アイテム集合の候補L4 要素数3の部分集合 {A,D,E} が含まれていないので、 {A,C,D,E}は排除
Apriori_Gen(Lk) {Ck+1=φ; foreach p,q in Lk such that ( p.item1=q.item1,…, p.itemk-1=q.itemk-1, p.itemk ≠ q.itemk) {c=p U q.itemk; Ck+1=Ck+1U{c} } //prune for (all itemsets c in Ck+1 )do for(all k subsets s of c )do {if s not in Lk then delete c from Ck+1} } return Ck+1 }
subset関数 • トランザクションtに含まれる候補アイテム集合を見つけ出す 例 • t={A,B,C,E} • SUBSET(C2,t)={{A,B}1、{A,C}2、 {A,E}1、 {B,C}2、 {B,E}3、 {C,E}2} (数字は出現回数) がsubset関数で生成されるが、そのうち min support=2以上のものだけを選ぶと {{A,C}、 {B,C}、 {B,E}、{C,E}}
相関ルールの導出:枝刈り2 対偶をとる • {A,B,C}⇒{D}と{A,B,D}⇒{C}のどちらか一方でも最小確信度未満ならば • {A,B}⇒{C,D}も最小確信度未満である
FP-growth algorithm • Apriori algorithm の効率を大きく改善するアルゴリズム(J.Han, 1999 SIGMOD)
I = {a1; a2; : : :; am} be a set of items • a transaction database DB = {T1; T2; : :Tn} • where Ti (i =1,..,n) is a transaction which contains a set of items in I. • The support1 (or occurrence frequency) of a pattern A, which is a set of items is the number of transactions containing A in DB. • A is a frequent pattern if A's support is no less than a predefined minimum support threshold, ξ.
FP-treeの定義 • 要素 • one root “null” • a set ofitem prefix subtrees as the children of the root • a frequent-item header table • Node in the item prefix subtree consists of • (1)item-name, (2)count, (3)node-link • frequent-item header table con-sists of • (1) item-name and (2) head of node-link
例 Item name Count Item link a:3----->
FP-tree construction algorithm Step1:DBをscanし、ξ以上の頻度を持つfrequent item Fを集め、頻度の降順にソート。 Step2:DBの格要素(transaction)において、それに含まれるitemを頻度の降順にソートし、 Step3: for( each transaction: L) do { root のnullノードからスタートして、以下のように rootにぶら下がる木を作る。ただし、T=rootする; L=[p|P], pは先頭の要素、Pは残りのリスト; insert_tree([p|P],T) }
insert_tree([p|P],T) { If T has a child N such that N.item-name= p.item-name, then increment N's count by 1; else { create a new node N, and let its count be 1; its parent link be linked to T; its node-linkbe linked to the nodes with the same item-namevia the node-link structure. } If P is nonempty, then call insert tree(P;N) recursively }
FP-Treeの木の高さは、ひとつのtransactionに含まれるitemの個数の最大値FP-Treeの木の高さは、ひとつのtransactionに含まれるitemの個数の最大値 • Rootからleafまでの枝(path)において、itemは頻度の降順に並んでいる。
Property 3.1 (Node-link property) For any frequent item ai, all the possible frequent patterns that contain ai can be obtained by following ai's node-links,starting from ai's head in the FP-tree header.
パタンマイニング関数:mine • Header table の中で、一番頻度の低い(つまり、一番下の) itemから順にパターンを探す。 • (p:3)の上に来るパタンはpの条件付パタンベースと呼ばれ、以下の通り。 • {<f:4; c:3; a:3;m:2>|p}, {<c:1; b:1>|p} • pの上に共通に来るパタンはcのみなので、抽出されたパタンは (cp:3)だけ。
つづき • mの上には、<f:4; c:3; a:3>, <f:4; c:3; a:3; b:1> が来るが、共通するパタンは< f:3; c:3; a:3>だけ。 • そこで、mine(< f:3; c:3; a:3>|m)を実行すると(am:3),(cm:3),(fm:3)が得られる。 • 次に、mine(< f:3; c:3>|am)を実行すると、(cam:3),(fam:3)が得られる。 • さらに(<f:3>|cam)を実行すると、(fcam:3)が得られる。 以下他のパタンについても同様。
Conditional FP-tree は、条件のitem(例えば1番上の例だと p)のcountに合わせる。
パタン・マイニング・アルゴリズム • Input: FP-tree constructed based on Algorithm 1,using DB and a minimum support threshold ξ. • Output: The complete set of frequent patterns. • Method: Call FP-growth (FP-tree ; null). Procedure FP-growth (Tree、α ) { if Tree contains a single path P then for each combination (denoted as β )of the nodes in the path P do {generate pattern β∪α [ with support =minimum support of nodes in β]} else for each ai in the header of Tree do {generate pattern β= ai∪α [ withsupport = ai :support}; construct 's conditional pattern base; β‘s conditional FP-tree :Treeβ; if Tree β≠Ø then call FP-growth (Treeβ, β) } }
その他 • 分類階層つき相関ルール • 数値属性を1個持つ相関ルール • 数値属性を2個持つ相関ルール • 並列アルゴリズム • 視覚化手法
Sequential pattern mining 列パタンのマイニング • 抽出対象のデータは要素の列の集合 • 要素はitemの集合 • min_support以上の出現頻度を持つ部分列をすべて探し出すこと
対象のデータ • I={i1,i2,….,in}, ijはitem • Sequenceは順序付きのitem集合の列 • Sequence:S=<s1,s2,…,sl>, • Si=(x1,x2,…,xm)xiはIの要素(=item)。 1個しかitemを含まない(x)はxと略記 • Sequence:Sの長さ: Sが含むitem数 • length(<(a)(b)>)=length(<ab>)=2, length(<(a b)>)=2 • β(=b1,..,bm) is super-sequence of α(=a1,…,an)(逆にαはβのsubsequence)とは 次の条件を満たす1≤j1≤j2≤…. ≤ jn≤mなるサフィックス列が存在すること。 • Sequence database: <sid,s>の集合。sidはseqience:sの名前
Prefix, projection and postfix • α=<e1,e2,..en>, β=<e1’,e2’,..,em’>, m≤n • 次の条件を満たすとき、βはαのprefix • (1)ei’=ei for (i≤m-1) • (2) • (3)em-e’mの要素はe’mの要素より辞書順で後のもの • βをαのsubsequenceとするとき、αのsubsequence α’がαのprojectionであるとは以下のように定義される • α’はprefix βを持つ • α’のsuper-sequenceであり、prefixβを持ち、かつαのsubsequenceであるものは存在しない。(α’は上記の条件を持たす最大の列
Prefix, projection and postfix • α’=<e1,e2,..,ek>はβ=< e1,e2,..,em-1,e’m>に対するαのprojection.ただし(m≤k) • このとき列γ=<e’’m,em+1,…,ek>はβに対するαのpostfix ただし、e’m+ e’’m=em。 • つまり α=βγ • 例:α=< (a) (b) (a b c) (f) > β=< (a) (b) (a b )> γ=<(c) (f) > • 例:<a>,<aa>,<a(ab)>,<a(abc)>は<a(abc)(ac)d(cf)>のprefixだが、 <ab>や<a(bc)>はprefixではない?? prefix <ab> =<(a)(b)> のpostfixは <(_c) )(ac)d(cf)>。2項目の(abc)は集合だから、いきなり<ab>をprefixにしてもよい。
PrefixSpanの動作sequence data base:S の例を用いてただし、min_support=2 • Step 1: length=1の列パタンを全て求める • <a>:a, <b>:4, <c>:4, <d>:3, <e>:3, <f>:3 • Step 2:列パタンの分割(辞書順に含むアイテムを拡大していくように) • a以外は持たないもの、 • a b以外は持たないもの、 • a b c以外は持たないもの、 • ……
Step 3:列パタンの部分集合を数え上げるStep 3:列パタンの部分集合を数え上げる • これは、step 2の各結果に対して、projectionを数え上げ、その結果の列パタンに同様の数え上げを再帰的に繰り返す。
Step 3のSにおける動作例 • <a>に対するprojectionのデータベースは • <a(abc)(ac)d(cf)> <( abc)(ac)d(cf)> (1) • <(ad)c(bc)(ae)> <(_d)c(bc)(ae)> (2) • <(ef)(ab)(df)cb> <(_b)(df)cb> (3) • <eg(af)cbc> <(_f)cbc> (4) • prefix<a>を含むlength=2の列パタン(min_support=2)は上記の結果のprojectionたちを調べると • <aa>:2 (1),(2), <ab>:4 (1)(2)(3)(4) • <(ab)>:2 (1)(3), <ac>:4 (1)(2)(3)(4) • <ad>:2 (1)(3), <af>:2 (1)(3)
つづき • Prefix <aa>を持つpostfix subsequence(<aa>-projected database) は(1)から得られる< (_bc)(ac)d(cf)>だけ。よって、min_support以上の頻出パタンはここからは生成されない。よって、このパタンは修了 • <ab>-projected databaseからは <(_c) (ac)d(cf)> (1) , <(_c)a> (1)(2), <c> (1)-(4) • この結果を再帰的に調べると <(_c)>:2, <(_c)a>:2, <a>:2, <c>:3 (全部書くと<a(bc)>, <a(bc)a>, <aba>, <abc>) • <(ab)>-projected databaseからは <(_c)(ac)d(cf)>, <(df)cb> • この結果を再帰的に調べると <(ab)c>, <(ab)d>, <(ab)f>, <(ab)dc> • 以下同様に全ての列パタンを再帰的に調べ、min_support以上の列パタンを数え上げる。
PrefixSpanの効率化 • Apriori propertyの利用 • 例:<ac>は列パタン(すなわちmin_support以上)だが、<ad>は列パタンでない(min_support未満)の場合は、両者を含む<acd>およびそのsuper-sequenceは列パタンにならないことは明白なので、調べる必要はない。 • Pointer利用によるメモリの効率的使用 • 例えば、<a(abc)(ac)d(cf)>の処理では、その部分列が何回も処理される。 例えば、<a>のprojection:①<(abc)(ac)d(cf)>と、<ab>のprojection:②<(_c) )(ac)d(cf)>。これらが別々にメインメモリに格納されることを防ぐために、projection databaseには、s①=2(offset), s②=4(offset)を記憶しておけば、 <a(abc)(ac)d(cf)>は1箇所で記憶しておくだけで良い。