PythonでCSPADEを使えるpycspadeを使ってみる
前回の続き。
gccエラーを乗り越えインストールできたので、早速使ってみる。
data.txt
pycspade-sample.py
ターミナルから実行
例えば、以下のデータセットを食わせてみると…
結果は以下。どう読めばいいか分からない…
対策としては、各文字列を、対応する一意の数字に変換したデータセットを読ませればできる。
ドキュメントからリンクがはられているページにある
ちなみに、gccを8.x系にあげたことで、arules/arulesSequenceのライブラリが動かなくなるというトラップがあり、とても苦労した。
gccエラーを乗り越えインストールできたので、早速使ってみる。
そもそも系列データマイニングとは?
以下の記事を参考。環境
- macOS 10.13.6
- Python 3.7.1
- conda 4.5.12
- pip 19.0.3
- Homebrew 2.0.2
ドキュメントを見ながら進める
pycspade · PyPI入力データの用意
以下のような形式のデータを、スペース区切りで用意。data.txt
1 1 3 8 37 42
1 2 4 4 11 37 42
2 1 2 10 73
2 2 1 72
2 3 3 4 24 77
- 1列目 : SequenceID(ユーザーIDなどのデータ)
- 2列目 : EventID(時系列を表すデータ)
- 3列目 : 要素の個数(=4列目以降のデータ個数)
- 4列目以降 : 要素の中身
コードを書く
サンプルコードはファイル名が微妙に違っていたり、コードが動かなかったりするため、適宜省略や書き換えをしている。pycspade-sample.py
import sys
from pycspade.helpers import spade, print_result
def execSpade(filepath):
result = spade(filename=filepath, support=0.3,parse=True)
# print(result['mined']) # エラーを吐きます
print("result['logger']")
print(result['logger'])
print("result['summary']")
print(result['summary'])
print('print_result(result)')
print_result(result)
# SequenceIDが隣り合っているパターンのみ抽出
result = spade(filename=filepath,support=0.3,parse=True,maxgap=1)
print('print_result(result)/maxgap=1')
print_result(result)
# 長さが最大2個の条件で抽出
result = spade(filename=filepath,support=0.3,parse=True,maxlen=2)
print('print_result(result)/maxlen=2')
print_result(result)
if __name__ == '__main__':
execSpade(sys.argv[1])
$ python -m pycspade-sample data.txt
結果出力
こんな感じで結果が出る。
result['logger']
CONF 2 78 2.6 2.5
args.MINSUPPORT 1 2
MINMAX 1 2
4 SUPP 2
8 SUPP 1
10 SUPP 1
11 SUPP 1
24 SUPP 1
37 SUPP 1
42 SUPP 1
72 SUPP 1
73 SUPP 1
77 SUPP 1
numfreq 10 : SUMSUP SUMDIFF = 0 0
EXTRARYSZ 986316
OPENED /tmp/cspade-rExzb4sH0bgelUUL.idx
OFF 78 26
Wrote Offt
BOUNDS 1 3
WROTE INVERT
Cleaned up successful: /tmp/cspade-rExzb4sH0bgelUUL.idx
Cleaned up successful: /tmp/cspade-rExzb4sH0bgelUUL.conf
Cleaned up successful: /tmp/cspade-rExzb4sH0bgelUUL.data
Cleaned up successful: /tmp/cspade-rExzb4sH0bgelUUL.tpose
result['summary']
CONF 2 78 2.5 2.6 5 1 2 1.0198 4
TPOSE SEQ NOF2 /tmp/cspade-rExzb4sH0bgelUUL.data 0.3 2 1 1 F1stats = [ 10 0 0 ]SPADE /tmp/cspade-rExzb4sH0bgelUUL.tpose 0.3 1 49 0 0 0 0 0 -1 1 100 100 10 23 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
print_result(result)
Occurs Accum Support Confid Lift Sequence
1 1 0.5000000 N/A N/A (10)
1 1 0.5000000 1.0000000 2.0000000 (10)->(24)
1 1 0.5000000 1.0000000 1.0000000 (10)->(4)
1 1 0.5000000 1.0000000 2.0000000 (10)->(72)
1 1 0.5000000 1.0000000 2.0000000 (10)->(72)->(24)
1 1 0.5000000 1.0000000 1.0000000 (10)->(72)->(4)
1 1 0.5000000 1.0000000 2.0000000 (10)->(72)->(77)
1 1 0.5000000 1.0000000 2.0000000 (10)->(77)
1 4 0.5000000 N/A N/A (11)
1 6 0.5000000 N/A N/A (24)
1 4 0.5000000 N/A N/A (37)
1 1 0.5000000 1.0000000 2.0000000 (37)->(11)
1 1 0.5000000 1.0000000 2.0000000 (37)->(37)
1 1 0.5000000 1.0000000 1.0000000 (37)->(4)
1 1 0.5000000 1.0000000 2.0000000 (37)->(42)
2 10 1.0000000 N/A N/A (4)
1 4 0.5000000 N/A N/A (42)
1 1 0.5000000 1.0000000 2.0000000 (42)->(11)
1 1 0.5000000 1.0000000 2.0000000 (42)->(37)
1 1 0.5000000 1.0000000 1.0000000 (42)->(4)
1 1 0.5000000 1.0000000 2.0000000 (42)->(42)
1 3 0.5000000 N/A N/A (72)
1 3 0.5000000 1.0000000 2.0000000 (72)->(24)
1 3 0.5000000 1.0000000 1.0000000 (72)->(4)
1 3 0.5000000 1.0000000 2.0000000 (72)->(77)
1 1 0.5000000 N/A N/A (73)
1 1 0.5000000 1.0000000 2.0000000 (73)->(24)
1 1 0.5000000 1.0000000 1.0000000 (73)->(4)
1 1 0.5000000 1.0000000 2.0000000 (73)->(72)
1 1 0.5000000 1.0000000 2.0000000 (73)->(72)->(24)
1 1 0.5000000 1.0000000 1.0000000 (73)->(72)->(4)
1 1 0.5000000 1.0000000 2.0000000 (73)->(72)->(77)
1 1 0.5000000 1.0000000 2.0000000 (73)->(77)
1 6 0.5000000 N/A N/A (77)
1 1 0.5000000 N/A N/A (8)
1 1 0.5000000 1.0000000 2.0000000 (8)->(11)
1 1 0.5000000 1.0000000 2.0000000 (8)->(37)
1 1 0.5000000 1.0000000 1.0000000 (8)->(4)
1 1 0.5000000 1.0000000 2.0000000 (8)->(42)
print_result(result)/maxgap=1
Occurs Accum Support Confid Lift Sequence
1 1 0.5000000 N/A N/A (10)
1 1 0.5000000 1.0000000 2.0000000 (10)->(72)
1 1 0.5000000 1.0000000 2.0000000 (10)->(72)->(24)
1 1 0.5000000 1.0000000 1.0000000 (10)->(72)->(4)
1 1 0.5000000 1.0000000 2.0000000 (10)->(72)->(77)
1 4 0.5000000 N/A N/A (11)
1 4 0.5000000 N/A N/A (24)
1 4 0.5000000 N/A N/A (37)
1 1 0.5000000 1.0000000 2.0000000 (37)->(11)
1 1 0.5000000 1.0000000 2.0000000 (37)->(37)
1 1 0.5000000 1.0000000 1.0000000 (37)->(4)
1 1 0.5000000 1.0000000 2.0000000 (37)->(42)
2 8 1.0000000 N/A N/A (4)
1 4 0.5000000 N/A N/A (42)
1 1 0.5000000 1.0000000 2.0000000 (42)->(11)
1 1 0.5000000 1.0000000 2.0000000 (42)->(37)
1 1 0.5000000 1.0000000 1.0000000 (42)->(4)
1 1 0.5000000 1.0000000 2.0000000 (42)->(42)
1 3 0.5000000 N/A N/A (72)
1 3 0.5000000 1.0000000 2.0000000 (72)->(24)
1 3 0.5000000 1.0000000 1.0000000 (72)->(4)
1 3 0.5000000 1.0000000 2.0000000 (72)->(77)
1 1 0.5000000 N/A N/A (73)
1 1 0.5000000 1.0000000 2.0000000 (73)->(72)
1 1 0.5000000 1.0000000 2.0000000 (73)->(72)->(24)
1 1 0.5000000 1.0000000 1.0000000 (73)->(72)->(4)
1 1 0.5000000 1.0000000 2.0000000 (73)->(72)->(77)
1 4 0.5000000 N/A N/A (77)
1 1 0.5000000 N/A N/A (8)
1 1 0.5000000 1.0000000 2.0000000 (8)->(11)
1 1 0.5000000 1.0000000 2.0000000 (8)->(37)
1 1 0.5000000 1.0000000 1.0000000 (8)->(4)
1 1 0.5000000 1.0000000 2.0000000 (8)->(42)
print_result(result)/maxlen=2
Occurs Accum Support Confid Lift Sequence
1 1 0.5000000 N/A N/A (10)
1 1 0.5000000 1.0000000 2.0000000 (10)->(24)
1 1 0.5000000 1.0000000 1.0000000 (10)->(4)
1 1 0.5000000 1.0000000 2.0000000 (10)->(72)
1 1 0.5000000 1.0000000 2.0000000 (10)->(77)
1 4 0.5000000 N/A N/A (11)
1 4 0.5000000 N/A N/A (24)
1 4 0.5000000 N/A N/A (37)
1 1 0.5000000 1.0000000 2.0000000 (37)->(11)
1 1 0.5000000 1.0000000 2.0000000 (37)->(37)
1 1 0.5000000 1.0000000 1.0000000 (37)->(4)
1 1 0.5000000 1.0000000 2.0000000 (37)->(42)
2 8 1.0000000 N/A N/A (4)
1 4 0.5000000 N/A N/A (42)
1 1 0.5000000 1.0000000 2.0000000 (42)->(11)
1 1 0.5000000 1.0000000 2.0000000 (42)->(37)
1 1 0.5000000 1.0000000 1.0000000 (42)->(4)
1 1 0.5000000 1.0000000 2.0000000 (42)->(42)
1 3 0.5000000 N/A N/A (72)
1 1 0.5000000 1.0000000 2.0000000 (72)->(24)
1 1 0.5000000 1.0000000 1.0000000 (72)->(4)
1 1 0.5000000 1.0000000 2.0000000 (72)->(77)
1 1 0.5000000 N/A N/A (73)
1 1 0.5000000 1.0000000 2.0000000 (73)->(24)
1 1 0.5000000 1.0000000 1.0000000 (73)->(4)
1 1 0.5000000 1.0000000 2.0000000 (73)->(72)
1 1 0.5000000 1.0000000 2.0000000 (73)->(77)
1 4 0.5000000 N/A N/A (77)
1 1 0.5000000 N/A N/A (8)
1 1 0.5000000 1.0000000 2.0000000 (8)->(11)
1 1 0.5000000 1.0000000 2.0000000 (8)->(37)
1 1 0.5000000 1.0000000 1.0000000 (8)->(4)
1 1 0.5000000 1.0000000 2.0000000 (8)->(42)
難点
データセットが文字列だと、結果がなぜか数字で出力される。例えば、以下のデータセットを食わせてみると…
1 10 2 C D
1 15 3 A B C
1 20 3 A B F
1 25 4 A C D F
2 15 3 A B F
2 20 1 E
3 10 3 A B F
4 10 3 D G H
4 20 2 B F
4 25 3 A G H
Occurs Accum Support Confid Lift Sequence
2 2 1.0000000 N/A N/A (1)
1 1 0.5000000 N/A N/A (10)
2 2 1.0000000 N/A N/A (15)
1 1 0.5000000 N/A N/A (2)
1 1 0.5000000 N/A N/A (20)
1 1 0.5000000 N/A N/A (25)
1 1 0.5000000 N/A N/A (3)
1 1 0.5000000 N/A N/A (4)
ドキュメントからリンクがはられているページにある
You also need to download utilities like getconf, exttpose from github:tposedb.
という一文が気になるが、ダウンロードしたあとの手順が見えないため、手をつけられていない。
雑感
Rが使えるなら、こちらの記事などを参考にarules/arulesSequencesのライブラリを使う方が良さそう。ちなみに、gccを8.x系にあげたことで、arules/arulesSequenceのライブラリが動かなくなるというトラップがあり、とても苦労した。
ディスカッション
コメント一覧
まだ、コメントがありません