Document

頻出・飽和・極大頻出集合の効率的
な列挙アルゴリズムとその実装
宇野 毅明
清見 礼
有村 博紀
国立情報学研究所
国立情報学研究所
北海道大学
2004年 9月30日 データマイニングワークショップ
トランザクションデータベース
トランザクションデータベース: 各トランザクション T がアイ
テム集合 E の部分集合になっているようなデータベース
1,2,5,6,7
∀
つまり、 T , T ∈T , T ⊆ E
2,3,4,5
T = 1,2,7,8,9
1,7,9
2,7,9
・ POSデータ(各項目が、客1人の購入品目)
2
・ アンケートのデータ(1人がチェックした項目)
・ web log (1人が1回のwebサーフィンで見たページ)
・ オプション装備 (車購入時に1人が選んだオプション)
実際のデータは、疎であり大きいものが多い
集合のオカレンス
集合K に対して:
K のオカレンス: K を含むT の項目
K のオカレンス集合 Occ(K): K を含むT の項目全ての集合
1,2,5,6,7,9
2,3,4,5
T = 1,2,7,8,9
1,7,9
2,7,9
2
{1,2}のオカレンス集合
= { {1,2,5,6,7,9}, {1,2,7,8,9} }
頻出集合
・ 頻出集合:T の定数α個以上のトランザクションに含まれる集合
(オカレンス集合のサイズがα以上の集合)(α:最小サポート)
極大頻出集合:他の頻出集合に含まれない頻出集合
例) データベースT の3つ以上のトランザクションに含まれる集合
1,2,5,6,7,9
2,3,4,5
T = 1,2,7,8,9
1,7,9
2,7,9
2
3つ以上に含まれるもの
{1} {2} {7} {9}
{1,7} {1,9}
{2,7} {2,9} {7,9}
{2,7,9}
飽和集合
・ 頻出集合をオカレンス集合が等しいものでグループにわける
(これを同値類と見なす)
・ 飽和集合: グループの中の極大元
(= オカレンス集合の共通部分)
⇒ ユニークに定まる
・ アイテム集合に対して、
そのオカレンス集合の
共通部分を閉包という
極大頻出集合
頻出飽和集合
問題
・ 本発表で扱う問題:
与えられたデータベース T と α に対して、その
1.頻出集合を全て見つける
2.頻出飽和集合を全て見つける
3.極大頻出集合を全て見つける
・それぞれ多くの研究がある
・実装の研究も多くある
これらの問題に対して、アルゴリズム
LCM (Linear time Closed itemset Miner)を提案
各レベルを順に計算(apriori)
(既存)
・ 最初に大きさ1の頻出集合を全て見つけ、メモリに蓄える
・ 次に大きさ2の頻出集合を、大きさ1の頻出集合を組合せて全
て見つけ、メモリに蓄える
・ 以後、1つずつ大きさを増やす
メリット:
オカレンス計算の高速化
デメリット: メモリを大量消費&既発見解検索時間の増加
バックトラック法
(既存)
・ 空集合から出発し、分枝限定法的に探索するアルゴリズム
・ 現在の解に、1つアイテムを加えた各解に対し、再帰呼び出し
・ 重複を避けるため、現在の解の末尾より大きなアイテムのみ
追加
1,2,3
1,2
1,2,4
1,3
1,3,4
1,4
Backtrack (K)
1
1 Output K
2 For each e > K の末尾( K の最大のアイテム)
If K ∪{e}が頻出 call Backtrack (K ∪{e})
2,3,4
2,3
2,4
2
3
φ
計算時間 = O( 頻出度のチェック時間×|E| )
3,4
4
頻出度計算
(既存)
・ 集合 K∪{e} のオカレンスを求める際、素直に行うと、
データベースの全ての項目を調べる必要がある
・ Occ( K∪{e} ) ⊆ Occ(K) という性質を用いる
⇒ K のオカレンスで e を含むものを見つければよい
⇒ Occ(K) ∩ Occ({e}) を計算すればよい
(ダウン・プロジェクト、という)
O( | Occ(K)| + | Occ({e})|) 時間
検索用のデータ構造
(既存)
FP-tree: 今までに発見した頻出集合を蓄えるデータ構造
prefix tree、trie とよばれるものと同じ
・ FP-treeは入力したデータベースを保管するのにも使われる
(同一項目の縮約などの操作が楽なため)
1
/|\
2 3 5
||
4 5
|
5
2
/|\
2 3 4
/|
4 5
|
5
3
|
5
4 5
|
5
・圧縮したprefixの分だけ、
頻出度の計算が速くなる
・圧縮率は通常1/2-1/3倍、
最良でも1/6倍程度
・2分木操作のため、
計算時間は増大
オカレンスの配布
(新規)
・各 e = K の末尾, …, |E| について、Occ(K ∪{e}) を
一度に全て計算する
K = {1,2} のオカレンス
A{1,2,4,5} B{1,2,3} C{1,2,3,4}
・バックトラック法は、末尾以降のアイテムを追加
⇒ {1,2,3}, {1,2,4}, {1,2,5} のオカレンス集合を計算
⇒ 疎な行列の転置を求めているのと同じ
⇒ 非ゼロ要素数の線形時間で求められる
各 e について O( |Occ(K∪{e}|) ) 時間
A
B
C
3 4 5
4 5
5
3
3
A B C
1,2,3
B C
1,2,4 A
1,2,5 A B
実際の計算では
(新規)
・ 頻出度計算では、生成した集合 K∪{e} が非頻出なら、
それは無駄な計算 (うまくすれば省略できる可能性がある)
・ しかし、そのような無駄は、計算全体の1/3 以下
(ただし、アイテムを「含まれる項目数」の小さい順でソート)
K∪
3
4
5
6
7
8
9
α
AD
ELM
ABCEFGH JKLN
ABDEFGI JKLMSTW
BEGILT
MTW
ABCDFGH IKLMNST
検索の手間がない分
オカレンス配布が
有利と思われる
データベースの縮小
(既存&新規)
・ 入力したデータべースを縮小して、計算を高速化する
◆ e を含むトランザクションがα個未満
or 全てのトランザクションに含まれる
⇒ e をデータベースから削除
◆ 等しいトランザクションは1つにまとめる
・サポートが大きいと劇的に小さくなる(データベース縮約とよぶ)
さらに、バックトラック法なら、各反復で
◆ 末尾以前のアイテムを消去
してからデータベース縮約をすると、反復的に縮約され、
さらなる高速化が行われる(反復型データベース縮約とよぶ)
極大&飽和頻出集合の列挙
(既存)
・ 頻出集合列挙のアルゴリズムに限定操作を加える
極大用、限定操作: 1つ極大解が見つかったら、
その部分集合は極大解の候補からはずす
飽和用、限定操作: 同一のオカレンス集合を持つ集合の中で、
極大でないものを候補からはずす
・ メモリに解を保持して実装する
飽和拡張
(既存)
・ 飽和集合 K に対して、
K の飽和拡張 = (K + アイテム) の閉包
- 任意の飽和集合は、他の飽和集合の飽和拡張になる
- ( K の頻出度) >( K の飽和拡張の頻出度)なので、
飽和拡張が導出する関係は、閉路を含まない
・ 飽和拡張をもとに列挙アルゴリズムを構築すると、
計算時間が飽和集合数の線形になる
Prefix保存飽和拡張
(新規)
・ prefix保存飽和拡張は、飽和拡張のバリエーション
定義: 飽和集合K の閉包末尾
⇔ K =閉包 (K ∩{1,…,j}) が成り立つ最小の j
定義: 飽和拡張 H = 閉包 (K ∪{i})が K のprefix保存飽和拡張
⇔ i > j かつ H ∩{1,…,i-1} = K ∩{1,…,i-1} が成立
・ prefix保存飽和拡張には閉包の操作のみ必要 (既発見解は不
要)
・ 任意の飽和集合は、他の唯一の飽和集合のPrefix保存飽和拡張
⇒ メモリを使うことなく、飽和集合を重複なく探索できる
飽和拡張・prefix保存飽和拡張の例
φ
・ 飽和拡張 ⇒ 非閉路グラフ
・ prefix保存飽和拡張 ⇒ 木
2
7,9
1,2,5,6,7,9
2,3,4,5
T = 1,2,7,8,9
1,7,9
2,7,9
2
飽和拡張
prefix保存飽和拡張
1,7,9
2,5
1,2,7,9
1,2,7,8,9
2,3,4,5
1,2,5,6,7,9
2,7,9
頻出集合の列挙
・ 頻出集合列挙のボトルネックは、頻出度計算
・ 同値類内は、オカレンス集合が等しい
⇒ 頻出度計算が省略できる
・ 閉包を取らない解と閉包を取った解を保持
⇒ 両者は、同値類中の超立方体を導出
⇒ 超立方体内の解を列挙
同値類が大きければ効率が良い
極大頻出集合の列挙
(新規)
・ バックトラック法による頻出集合列挙を考える
K : 現在の解
⇒
1 2 3 4 5
H: K を含む閉包 ⇒
・ H に含まれるアイテムが
最後に来るよう、並び替える
6
7
8
9
10
並び替え
6
8
・ H のアイテムを追加した再帰呼び出しでは、
極大頻出集合は見つからない
⇒ 再帰呼び出しを省略
反復数が劇的に減少
10
4
5
7
9
閉包・極大性判定
(新規)
・ 閉包の計算や、極大性の判定を素直に行うと、
データベース縮約を用いない頻出度計算と、
同程度、あるいはそれ以上の手間がかかる
・ 閉包・極大性判定にもデータベース縮約を使う
-閉包末尾以後が等しいトランザクションを1つにまとめる
ただし、閉包末尾以前は以下を保存
・ 閉包計算
⇒ 共通部分
・ 極大性判定 ⇒ 各アイテムの含まれる数
頻出度計算と同程度、データベースが縮小される
計算機実験
・ 計算機環境:
CPU、メモリ: AMD Athron XP 1600+ 、 224MB
OS、言語、コンパイラ: Linux 、C言語、gcc
・比較アルゴリズム
FP-growth, afopt, MAFIA, PATRICIAMINE, kDCI
(どれも、実装コンテスト FIMI03 で優秀な成績をおさめたもの)
・データセット
FIMI03、KDD-cupなどで使われた、人工データ、実データ
結果
観察と考察
・ prefix保存飽和拡張・超立方体分解は、同値類が大きいと効果的
・ 極大性の判定は、他のアルゴリズムも優秀
・ データベースの縮小は
αが大きいとき & Occ(K) が大きいとき、とても良く効くようだ
・ apriori はそれほど効果がないようだ
・ オカレンス配布は、α、Occ(K) が小さいとき、効くようだ
・逆に FP-treeは、α、Occ(K) が大きいとき、効くようだ
我々のアルゴリズムは、構造があり、解が多い場合に強い
まとめと今後の課題
・ prefix保存飽和拡張と、それを用いた、線形時間・多項
式メモリの飽和集合列挙アルゴリズムLCM を提案した
・ LCMをもとに、同値類のグループ化と枝狩りを用いて頻
出・極大集合の列挙アルゴリズムを構築した
・ 計算を高速化するアルゴリズムを提案した
・ 多くの問題において既存手法より良い結果を出した
・ FP-tree 的な手法を加味した、さらなる高速化が課題
FIMI '03
・ Frequent Itemset Mining Interpretation
頻出集合列挙アルゴリズムの実装コンテスト
・ 20ほどのアルゴリズムが参加した
(我々も参加)
他のアルゴリズムの特徴
・ 基本は、頻出集合列挙。apriori が主流
・ がんばった人は FP-treeを使用
・ 前処理によるデータベースの縮小がさかん
(long の代わりに short を使い、キャッシュ効率を良くする、
という重箱隅的なものまである)
・ 極大頻出集合列挙には、限定操作を多用
・ diffset はよく使われるが、オカレンス配布は使ってないようだ
これらを丁寧にじっくり実装したアルゴリズムが高速
奇抜なアイディアもあったが、全部遅い
実験に使われたデータベース
- web log
- POS
- 機械学習用の問題
- 事故処理のデータ
- リテール
- 人工データ
・ 問題規模は大きく、項目数は 1万-100万
台集合の大きさも500-5万