前回、Attribution ModelにMarkov連鎖を使うネタがあったので、簡単な触りをしました。
Attribution Modelには、ベイジアンネットワークを用いたものもあるようなので、そちらのパッケージや使い方の確認もしたいと思います。
ベイジアンネットワーク自体は、色々な記事と書籍を確認してください。ベイジアンネットワークそのもので検索したり、グラフィカルモデルでも関連するものが出てきます。
Pythonパッケージ
- Pebl(https://pypi.python.org/pypi/pebl)
- Open Bays(https://github.com/PyOpenPNL/PyOpenPNL)
どうもこの2つがあるみたいです。
まずは、Peblを使って見たいと思います。
Pebl
インストール
※ 普段はmac利用ですが、もふもふ技術部の記事によると、macでpeblは動作しないとの情報がありました。今回は、virtualboxにubuntuを入れて動かします。
動作環境は
Ubuntu16.0.4
anaconda: 3-4.1.0
python: 2.7.12
pydot: 1.0.28
numpy: 1.11.1```
です。
本体と関連するパッケージは以下のものをインストールしました。
```pip install pebl
conda install Graphviz
pip install simple_json```
※ nose_testが通らなかったですが、Tutorialは実行できました。
### 利用データ
[公式ページのTutorial](http://pythonhosted.org/pebl/tutorial.html)を見ながら、サンプルデータを確認したいと思います。
そちらから、"pebl-tutorial-data1.txt"をDLして、実行するディレクトリに格納しておきます。
これは、ゲノム系のテストデータで、76行12列のデータみたいです。列名を見ても残念ながらよくわかりませんでした。
### 実行例
続いて、Tutorialのテストデータを実行します。
First Example中のコマンド`ex1result.tohtml("example1-result")`で以下のエラーが出ました。
```/home/usrname/.pyenv/versions/anaconda3-4.1.0/envs/py27/lib/python2.7/site-packages/pebl/network.pyc in layout(self, width, height, dotpath)
287 dotgraph = pydot.graph_from_dot_file(dot2)
288 nodes = (n for n in dotgraph.get_node_list() if n.get_pos())
--> 289 self.node_positions = [[int(i) for i in n.get_pos()[1:-1].split(',')] for n in nodes]
290
291 ```
文字列の浮動小数点('99.9'みたいなもの)をint()に入れている所がエラーの原因らしいです。
仕方ないので、該当行に変更を加えました。
リファレンスのものとは少し違う出力が出る可能性が出てきましたが、実行はできました。
```変更前) self.node_positions = [[int(i) for i in n.get_pos()[1:-1].split(',')] for n in nodes]
変更後) self.node_positions = [[int(round(i)) for i in n.get_pos()[1:-1].split(',')] for n in nodes]```
Tutorialが回って、htmlファイルが出力されました。
Log Scoreなどが出てきましたが、この辺りの意味がわからないと読み解けないので、その辺りも調べないと。。。