PythonでCSPADEを使えるpycspadeを使ってみる

前回の続き。
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のライブラリが動かなくなるというトラップがあり、とても苦労した。