LIBLINEAR の Perl バインディングである Algorithm::LibLinear ですが、以前の記事で紹介した時点ではバージョン 0.04 だったのが現在では 0.10 になっており、非互換な変更もあったので当該記事のサンプルコードも最早動かなくなっています。 案外と今でもアクセスがある記事なので、現在までの変更を補足します。
LIBLINEAR 1.94 ベースになった
Algorithm::LibLinear 0.08 より LIBLINEAR 1.94 をバンドルしています。
配布サイトには内部処理のどうでもいい変更点しか載っていませんがメモリリークの修正が入っています。機能的には同一です。
API の非互換な変更
Algorithm::LibLinear::ScalingParameter クラスはバージョン 0.07 で非推奨になり、0.09 で廃止されました。同時に Algorithm::LibLinear::DataSet の scale()
メソッドも削除されました。
今後は新しい Algorithm::LibLiner::FeatureScaling を使ってください。
ScalingParameter は設計ミスで、テストデータをスケーリングする場合に極めて周りくどい記述が必要でした:
use Algorithm::LibLinear::DataSet;
use Algorithm::LibLinear::ScalingParameter;
my $scaling_parameter = Algorithm::LibLienar::ScalingParameter->new(...);
my $feature = +{ attr1 => 0.2, attr2 => 1, ...};
# データ1個の DataSet を作って scale し配列として取り出した最初の要素の feature...
my $scaled_feature = Algorithm::LibLinear::DataSet->new(
data_set => [ +{ feature => \%feature, label => 42 } ],
)->scale(parameter => $scaling_parameter)->as_arrayref->[0]{feature};
FeatureScaling はより分かり易いインタフェースを提供します:
use Algorithm::LibLinear::DataSet;
use Algorithm::LibLinear::FeatureScaling;
my $scaler = Algorithm::LibLinear::FeatureScaling->new(...);
my $feature = +{ attr1 => 0.2, attr2 => 1, ...};
# scale() に渡すだけ
my $scaled_feature = $scaler->scale(feature => $feature);
# DataSet やラベル付きデータも同様
my $scaled_dataset = $scaler->scale(
data_set => Algorithm::LibLinear::DataSet->new(...),
);
my $scaled_labeled_data = $scaler->scale(
labeled_data => +{ feature => $feature, label => 42 },
);
ScalingParameter が利用できる最終バージョンは 0.08 です。この点を除くと 0.08 と 0.10 は機能的に同一です。つまり事実上 0.08 は 0.10 のスーパーセットですが、新規のコードで ScalingParameter を利用する意味はありません。
今後の予定など
Algorithm::LibLinear は既に安定版です。今後非互換な変更は入りません。
今後の更新は LIBLINEAR の更新に併せたメンテナンスとドキュメントの修正のみのつもりです。あとビルドシステムが Module::Install なのが老頭児っぽいので気が向いたら変更するかも知れません。
現在 LIBLINEAR ディストリビューションで提供されている機能で Algorithm::LibLinear から利用できないものは次の2つです:
- SVR 時の
cross_validation()
の戻り値が平均二乗誤差のみで二乗相関係数を返さない - データの Y 軸方向へのスケーリング機能。換言すると
svm-scale
コマンドの-y
オプションによる設定、及び当該オプションを設定して出力されたスケーリング情報ファイルの-r
オプションによる読み込み (正確には LIBLINEAR じゃなくて LIBSVM に含まれる機能)
これらについては筆者が必要性を感じていないので対応予定はありません。いずれも互換性を保って追加できる機能なのでパッチは歓迎します。
コメント
コメントを投稿