データ解析作業の救世主! 超絶☆実験ビルドシステムmafをOSS公開しました

beam2d
リサーチャー

2013-12-25 13:39:24

Photo by midiman. Used following a Creative Commons License. Taken from https://www.flickr.com/photos/midiman/90232391/
Photo by midiman under Creative Commons License (original)

メリークリスマフ!

得居です。今日はクリスマスですね。皆様昨日はいかがお過ごしでしたでしょうか?

クリスマスということで、今日は私たちから皆様に、特にデータ解析や論文執筆、手法の比較検証のために計算機上で様々な実験をしている方々に、プレゼントがあります!

Github – pfi/maf

今日、実験結果を「ビルドする」ためのツールmafを公開しました!

mafは、PFIでもよく使われているPythonベースのビルドツールwafを実験に使うための拡張です。大まかな使い方を学ぶために、ドキュメントとサンプルも公開しています。

maf — maf 0.1 documentation
サンプル

実験手順をビルドだと思って宣言的に書くこと自体はwaf等既存のビルドツールで可能です。mafはこの手順のうち、パラメータだけが違うという部分をまとめて書くための仕組みや、実験特有の手順(プロットなど)をサポートするようなライブラリを提供しています。

例えば5-foldの交差検証を行う例は以下のような雰囲気で書けます。なんとなく何をやる実験なのかわかるでしょうか? 正確な書き方はドキュメントやサンプルを参照してください。

...  # import等

def experiment(exp):
    # 5-foldの交差検証のためにデータセットを5通りに分割
    NUM_FOLD = 5
    exp(source='dataset',
        target='train test',
        # parametersを指定することで、パラメータ付けられたタスクや
        # パラメータ付けられた出力ファイルを作ることができる
        parameters=[{'fold': i} for i in range(NUM_FOLD)}],
        # 1行1データの形式のデータセットを5通りのtrain testに分割する
        # 出力されるtrain, testは'fold'パラメータでパラメータ付けられる
        rule=maflib.rules.segment_by_line(NUM_FOLD, 'fold'))

    # 分割した各foldに対して実験
    exp(source='train',
        target='model',
        parameters=maflib.util.product({  # 全組合せを実行
            'param1': [1, 2, 3, 4],
            'param2': ['a', 'b', 'c']
        }),  # 'fold'はもう指定しなくて良い (trainに紐付いている)
        rule='my-train ${SRC} ${TGT}')

    # ここにはもうfold, param1, param2などのパラメータを指定する必要はない
    # (modelとtestに紐付いているので)
    exp(source='model test',
        target='result',
        rule='my-eval ${SRC} ${TGT}')

    # 各foldにおける実験結果における'accuracy'値の最大値を取る
    exp(source='result',
        target='max_accuracy_result',
        aggregated_by('fold'),  # foldパラメータを「潰す」
        rule=maflib.rules.max('accuracy'))

    # 結果を可視化
    exp(source='max_accuracy_result',
        target='result.png',
        rule=my_plot_fun)

# 結果をプロットする方法はmatplotlibを使って書ける
@maflib.plot.plot_by
def my_plot_fun(figure, plotdata, parameter):
    ...

my-trainとmy-evalという学習・評価コマンドさえあれば、データサイエンティストや研究者の方なら誰でもforループを使って書いたことのある面倒くさい、そして意外とややこしい交差検証が実質3行で書けます。my-trainやmy-evalのコマンド部分はpython関数で書いて指定することもできます。

maf開発の背景は、実験の複雑さです。データを解析したりアルゴリズムの比較を行う際に、実験手順をスクリプト(shell, python, ruby…)でよく書くと思います。最初は単一のデータに単一のアルゴリズムを一回適用して結果を見るだけだったりするので、直接スクリプトを書くので十分なのですが、他のデータに適用したり、他のアルゴリズムや異なる設定(パラメータ)と比べたりし始めると、実験手順と実験結果の管理に割くコストが上がっていきます。機械学習の実験だとさらにデータを複数通りに分割する必要もあったりして、データの管理も必要になります。これを最初のスクリプトの延長で書き続けると書いた本人にしか読み解けない複雑な実験スクリプトができあがったり、実験に必要な手操作が本人にしかわからなくなったりします。メンテナンス性を上げるために実験のためのドキュメントを書き始めると、管理コストはさらに上がります。

様々な設定での実験手順と実験結果、およびそれらの集約と可視化、これらを宣言的に記述して途中で生成されるファイル群の管理をうまく隠蔽することができれば、実験とそのメンテナンスにかかるコストは大幅に下がると期待できます。mafはこれらを実現することを目指して開発されました。

mafは辛い実験生活をサポートしてくれる縁の下の力持ち的な存在です。ぜひ一度試してみてください。フィードバックやPull Reqなどもお待ちしております!

Leave a Reply