Location : Home > Languages > Perl > Package Title : Algorithm::SVMLight |
![]() |
Algorithm::SVMLight - SVMLight 機械学習パッケージへの Perl インタフェース
use Algorithm::SVMLight; my $s = new Algorithm::SVMLight; $s->add_instance (attributes => {foo => 1, bar => 1, baz => 3}, label => 1); $s->add_instance (attributes => {foo => 2, blurp => 1}, label => -1); ... いくつかのインスタンスを繰り返した後で $s->train; # 未見のインスタンスの結果を my $result = $s->predict (attributes => {bar => 3, blurp => 2});
本モジュールは Thorsten Joachims の SVMLight パッケージへの Perl インタフェースを実装している。
SVMLight はパターン認識・回帰・ランク関数の学習の問題を扱う Vapnik のサポートベクターマシン(Support Vector Machine) [Vapnik, 1995] の実装である。SVMlight で用いられている最適化アルゴリズムは [Joachims, 2002a] [Joachims, 1999a] に記述されている。アルゴリズムは拡張性のあるメモリ量であり、数千のサポートベクターを効率的に処理することができる。 -- http://svmlight.joachims.org/
サポートベクターマシンは一般に、SVMLight は特にテキストカテゴライズ・イメージ認識・バイオインフォマティクスの文字列処理等の領域で機械学習のアプローチのいくつかを提供する。
SVMLight エンジンは文字列ではなく整数として側面(features)を扱う。側面は一般に文字列として考えられているので(例えば文書の中の語や加工済み側面の簡略表現)、Algorithm::SVMLight では側面名(文字列)と側面インデクス(整数)とのマッピングのための単純な機構のみを提供している。この機構を利用したければ add_instance() 及び predict() メソッドを使う。そうでなければ add_instance_i() (または read_instances()) 及び predict_i() メソッド)を使う。
インストールについては、本ディストリビューションに含まれている INSTALL ファイルを参照のこと。
new(...)
新しい Algorithm::SVMLight オブジェクトを生成し、これを返す。 SVM パラメータに対応する命名された引数は、対応する set_***() メソッドで設定する。
$s = Algorithm::SVMLight->new( type => 2, # 回帰モデル biased_hyperplane => 0, # 不偏 kernel_type => 3, # シグモイド );
パラメータのリストについては set_***(...) メソッドを見よ。
set_***(...)
以下のパラメータは対応する名称のついたメソッドを利用することで設定可能である。 - 例えば maxiter パラメータは $x を欲しい値として set_maxiter($x) を用いて設定する。
学習パラメータ: type svm_c eps svm_costratio transduction_posratio biased_hyperplane sharedslack svm_maxqpsize svm_newvarsinqp kernel_cache_size epsilon_crit epsilon_shrink svm_iter_to_shrink maxiter remove_inconsistent skip_final_opt_check compute_loo rho xa_depth predfile alphafile カーネルパラメータ: kernel_type poly_degree rbf_gamma coef_lin coef_const custom
これらのパラメータの説明については SVMLight ディストリビューション中の svm_common.h ファイルで興味のある場所を見ること。
new() (上を見よ)に引数を通してパラメータを設定するまたは new() の直後に呼び出すのはいいアイデアである。コードの途中でこれらを変えることがよいこととは思えないからだ。
add_instance(label => $x, attributes => \%y)
モデルを学習するために使うインスタンスに学習インスタンスを追加する。属性パラメータはインスタンスに対し属性と値の対からなるハッシュを指定し、ラベルパラメータはラベルを指定する。ラベルは数でなければならず、典型的には正の学習インスタンスが 1 で、負の学習インスタンスは -1 である。属性ハッシュのキーは文字列で、値は数(各属性の値)である。
全ての学習インスタンスは同じ属性集合を共有する。もしあるインスタンスに対し属性が未定義であれば0として指定したことに等しい。0の値をとる属性を省略することでメモリを(潜在的には学習時間を)節約することができる。
add_instance_i($label, $name, \@indices, \@values)
add_instance() と似ているが、側面名の文字列−整数マッピングを省略する。既に側面を整数として表現している場合にはこのメソッドを使うとよい。$label パラメータは数値でなければならない(典型的には 1 または -1)。@indices 及び @values 配列はインデクスと値が対応する並行配列でなければならない。さらにインデクスは正の整数で単調増加でなければならない。
add_instance_i() が好きなら、predict_i() も好きになると賭けてもよい。
read_instances($file)
SVMLight の標準的な example_file フォーマットに学習データを組織化するために各インスタンスで add_instance_i() を呼び出す替わりの方法である。データをインポートするために read_instances() メソッドを呼び出す。フードの下では SVMLight の read_documents() C 関数を呼び出している。この方法でデータを組織化すれば速度が改善するだろう。
train()
十分な数のインスタンスをモデルに投入した後に機械学習モデルに基づく学習を行うために train() を呼び出す。
インスタンスの数によっては(属性の総数よりは小さい範囲)本メソッドは時間がかかるかもしれない。一度だけモデルを学習したいなら一度だけ実行して他のコンテキストで再利用するための保存せよ。write_model() 及び read_model() メソッドを見よ。
is_trained()
モデルで train() が呼び出されたか否かをブール値で返す。
predict(attributes => \%y)
train() が呼び出された後に、モデルは既知の属性の組み合わせを適用する。predict() メソッドは add_instance() のように属性パラメータを受け付け、所与の属性に適用すべきラベルの最良の予測を返す。返り値のラベルの符号(正または負)は新しいインスタンスが正か負かを示す。ラベルの大きさはモデルが出した結果の信頼性に対応している。
predict_i(\@indices, \@values)
predict() と似ているが、側面名の文字列−整数マッピングを省略する。add_instance_i() を見よ。
write_model($file)
ファイル $file に学習済みモデルを保存する。後に read_model() メソッドで再読み込みすることができる。モデルは SVMLight の write_model() C 関数を用いて書かれているので、svm_classify のような SVMLight コマンドラインツールと完全互換である。
read_model($file)
過去に write_model() で書き出したモデルを読み込む。
my $m = Algorithm::SVMLight->new(); $m->read_model($file);
モデルファイルは SVMLight の read_model() C 関数を用いて読み込むので、svm_learn のような SVMLight のコマンドラインツールの1つとともにモデルを生成することができる。
get_linear_weights()
線形モデルを学習した(またはモデルファイルで読み込んだ)後、本メソッドはモデルの線形重みを含む配列への参照を返す。意思決定において最大の影響をもたらす側面を探すためにモデルを走査するには有用である。
my $arrayref = $m->get_linear_weights();
配列の最初の要素(位置0)は閾値 b であり、その他の要素は重みである。1 より上は SVMLight の内部インデクスと対応している。
もしモデルが未学習またはカーネルタイプが非線形なら例外が投げられる。
feature_names()
属性パラメータのキーとして add_instance() に渡された側面名のリストを返す。またはスカラコンテキストの場合はそのような名称の数を返す。
num_features()
モデルに対し既知の特徴(features)の数を返す。add_instance_i() または read_instances() を使う際には側面のいくつかは実際には前もって見ることができない。インデクスが 2, 5, 37 のインスタンスを追加するには間のインデクスのインスタンスを追加することはできない。しかしこの場合 num_features() は 37 を返す。これは学習後はインスタンスは predict() メソッドに未見の側面とともに実数値を渡すからである。替わりに add_instance() を使う場合にはおそらくこの問題にはぶち当たらない。スカラコンテキストの場合は num_features() が feature_names() のような働きをする。
num_instances()
モデルに対し既知の学習用インスタンスの数を返す。学習が実際に実施される前後にこのメソッドを呼び出せばよい。
Algorithm::NaiveBayes, AI::DecisionTree, http://svmlight.joachims.org/
Ken Williams, <kwilliams@cpan.org>
Algorithm::SVMLight Perl インタフェースは copyright (C) 2005
Thomson Legal & Regulatory, Ken Williams. フリーソフトウェアであり、Perl 本体と同等の条件で修正/再配布してもよい。
Thorsten Joachims 及び/またはニューヨーク州のイサカ・コーネル大学(Cornell University of Ithaca, NY)が SVMLight 自体の著作権を管理している。著作権及びライセンスに関する全情報はディストリビューションの中にある。Algorithm::SVMLight を利用するにあたり SVMLight への適切なライセンスを取得する責任はユーザにある。特に SVMLight は「研究・教育の目的に対しては無料であるが、商用目的で利用する際にはライセンスを取得しなければならない」ことに留意すること。
著作権の衝突を避けるためには SVMLight 本体と同等のライセンス条件下で配布されている SVMLight.patch ファイルを参照のこと。
![]() |
Updated : 2007/11/09 |