はじめに
- AprioriのPython実装を探してるとどうやらOrangeで実装されているので試してみたときのメモ
- Orange is a component-based data mining software.
注意
- 
新しいバージョンのOrange 3 と 古いバージョンのOrange 2(2016/9/11 時点では、Orange 2.7.8) がある 
- 
Orange 3 にAprioriモジュールが見つからない。。can't find associate module 
- 
ということで Orange 2 をインストールをする 
インストール
Ubuntu にインストールした例を示す
公式サイトよりソースファイルをダウンロードして、展開
Python Software Foundationにあるとおりビルドしてインストール
python setup.py build
python setup.py install
scipyが必要なのでなければインストールしておく
Apriori
アソシエーション分析を参考にした
データは以下のように用意。拡張子がbasketである必要がある
$ more hayes-roth-train1-1.basket
a2,b2,c3,d4,D3
a3,b2,c1,d3,D1
<snip>
実行
>>> import Orange
>>> data = Orange.data.Table('hayes-roth-train1-1.basket')
>>> rules = Orange.associate.AssociationRulesSparseInducer(data, support=0.03, confidence=0.2, classification_rules=1, store_examples=True)
>>> print "%4s %4s %4s  %4s" % ("Supp", "Conf", "Lift", "Rule")
Supp Conf Lift  Rule
>>> for r in rules[:5]:
...     print "%4.1f %4.1f %4.1f   %s" % (r.support, r.confidence, r.lift, r)
...
 0.0  0.2  3.6   b4 -> c4
 0.0  0.3  3.6   c4 -> b4
 0.0  0.2  7.2   c4 -> b4 a1
 0.0  0.5  6.0   c4 a1 -> b4
 0.0  0.2  7.2   c4 -> b4 a1 D3
Ruleを取り出す
以下のドキュメントを見て動かしてみる
Association rules and frequent itemsets
Orange.data.Instance
Orange.data.Value
>>> len(rules)
400
>>> rules[383]
b2 a2 -> c1
>>> rules[383].left
[], {"b2":1.000, "a2":1.000}
>>> rules[383].left.get_metas(str).keys()
['a2', 'b2']
>>> rules[383].right.get_metas(str).keys()
['c1']
>>> rules[383].confidence
0.7333333492279053
>>> rules[383].support
0.07692307978868484
>>> rules[383].n_applies_both
11.0
対象がルールにマッチするか
>>> rule = rules[383]
>>> for d in data:
...     if rule.appliesBoth(d):
...         print d
...
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d3":1.000, "D1":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d2":1.000, "D2":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d2":1.000, "D2":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d2":1.000, "D2":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d3":1.000, "D2":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d4":1.000, "D3":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d1":1.000, "D1":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d3":1.000, "D1":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d1":1.000, "D1":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d2":1.000, "D2":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d1":1.000, "D1":1.000}
>>> rule.examples
Orange.data.Table 'table'
>>> rule.match_both
<2, 3, 5, 40, 87, 105, 111, 116, 118, 135, 137>
おわりに
- 速度が出るかはこれからチェック
- scikit-learnとの違いはどこかに載っているのかな