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