自然言語処理向けの非常に効率的なオンライン学習器opal

opalは、自然言語処理に適したオンライン学習器で、二値の素性に特化して大規模な学習を非常に効率的に行います。線形または多項式カーネルが利用できて、ホームページに性能比較表が載っていますが、どちらの方式でも驚くほど高速かつ省メモリで学習とテストができます。線形学習器といえば、LIBLINEARが高速なことで有名ですが、これをも遥かに凌駕する性能です。
opal - C++ header library of online learning with kernel slicing#Performance comparison

このopalをMacPortsに登録しました。ただし、OPALという物理演算エンジンのパッケージがすでに登録されていたため、MacPorts上ではopal-ml (Machine Learning) という名前になっています。最新バージョンのopalは、コンパイル時にオプションを指定することで、多クラス分類にも対応します。しかし、多クラス対応の学習器で二値の分類を行うと、本来の高速性がやや失われてしまうため、二値分類専用のコマンドopalとは別に多クラス対応版のコマンドopal-multiclassが用意されています。

試しに、20 Newsgroupsのデータを対象に多クラス分類を実行してみます。なお、コメントにもありますが、素性の値はすべて1扱いになるので注意してください(したがって例としてあまり適切ではないかもしれません…):

$ sudo port selfupdate
$ sudo port install opal-ml
$ curl -O http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/news20.bz2
$ curl -O http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/news20.t.bz2
$ bunzip2 news20.bz2 news20.t.bz2
$ opal-multiclass news20 news20.m news20.t
mode: BOTH
loading examples..done.
PA1 iter=10 #ex=159350 saving..done.
loading..done (# features = 52951).
acc. 81.017% (corr 3235) (incorr 758)
classify : 0.0093 ms./trial (37.03207692/3993)

train : 1706.7085 ms.
test : 168.7972 ms.

あっという間に終わりました。比較のために、LIBLINEARでも実行してみます:

$ sudo port install liblinear
$ time train -q news20 news20.m

real 0m25.183s
user 0m23.439s
sys 0m0.214s
$ predict news20.t news20.m news20.o
Accuracy = 82.2189% (3283/3993)

こちらも十分速いのですが…。上の結果は、デフォルトの設定で動かしただけですが、もちろんオプション指定によって様々な設定で試すことができます。opalの場合、opal --help でコマンドの使用法が表示されて、-O 2 オプションを指定するとテスト対象ごとの分類結果が出力されます。

作者の方のブログです:)
自作の学習器が MacPorts から導入可能になっていた - ny23の日記