Classias - 使い方

インストール方法

Windows環境の場合は,配布されている実行ファイルを利用するのが最も簡単です.ただし,配布されている実行ファイルを利用するには,システムにVisual C++ 2008 SP1 再頒布可能パッケージ (x86)がインストールされている必要があります. Linux環境の場合は,ソースコードからビルドしてください. ビルド方法は,こちらを参照してください.

3つのタスク・タイプとデータフォーマット

Classiasは二値分類(binary classification)多クラス分類(multi-class classification)候補選択(candidate classification)の3つのタスクをサポートします.

二値分類

二値分類は,与えられた事例の素性(属性)に基づいて,事例を正例(+1)もしくは負例(-1)に分類するタスクです. 事例のラベルには,"+1", "1", もしくは"-1"を用いることができ,ラベルにコロンで続けて実数値を書くと,事例の重みを指定できます. 事例の重みが省略された場合は,デフォルトの重み1.0が用いられます. 素性の名前として文字列を用いることができ,素性名にコロン':'で続けて素性の値を指定できます. 素性の値が省略された場合は,デフォルトの素性値1.0が用いられます. 以下に,二値分類の学習データの例(評判分析の極性判定)を示します.

+1 この:0.5 スープ:0.5 こく:0.5 ある:0.5
-1 この:0.447 スープ:0.447 調味料:0.447 入る:0.447 いる:0.447

二値分類のデータ・フォーマットのBNF表記は,以下の通りです. このデータ・フォーマットは,SVMlightやLIBSVMのデータ・フォーマットと上位互換性があります. SVMlightやLIBSVMは素性名を数値にする必要がありますが,Classiasでは素性の名前として任意の文字列が使えます. ラベルと素性の区切り文字はスペース(オプションによりタブ'\t'やカンマ','も利用可),名前と値の区切り文字はコロン(オプションによりイコール'='やバー'|'も利用可)です. 分類器を適用(タグ付け)するときは,事例のラベルを空文字列にします(ラベルのフィールドを省略することはできません).

<line>       ::= <comment> | <instance>
<comment>    ::= '#' <character>+ '\n'
<instance>   ::= <label> (' ' <feature>)+ '\n'
<label>      ::= <class> | <class> ':' <weight>
<feature>    ::= <name> | <name> ':' <weight>
<class>      ::= "+1" | "1" | "-1"
<name>       ::= (<letter> | ^' ' | ^':')+
<weight>     ::= <numeric>

多クラス分類

多クラス分類は,与えられた事例の属性に基づいて,事例のラベルを候補の中から1つ選び,分類するタスクです. 事例のラベルには,文字列を用いることができ,ラベルにコロンで続けて実数値を書くと,事例の重みを指定できます. 事例の重みが省略された場合は,デフォルトの重み1.0が用いられます. 属性の名前として文字列を用いることができ,属性名にコロン':'で続けて属性の値を指定できます. 属性の値が省略された場合は,デフォルトの素性値1.0が用いられます. 以下に,多クラス分類のデータ(クエリ分類)の例を示します. この例では,「ニューヨーク ヤンキース」というクエリは「スポーツ」カテゴリに,「ニューヨーク 自由 の 女神」というクエリは「旅行」カテゴリに,「ニューヨーク ダウ インテル」は「金融」カテゴリに分類することを示しています.

スポーツ ニューヨーク ヤンキース
旅行 ニューヨーク 自由 の 女神
金融 ニューヨーク ダウ インテル

多クラス分類のデータ・フォーマットのBNF表記は,以下の通りです. このデータ・フォーマットは,SVMlightやLIBSVMのデータ・フォーマットと上位互換性があります. SVMlightやLIBSVMはラベル名や属性名を数値にする必要がありますが,Classiasでは名前として任意の文字列が使えます. ラベルと属性の区切り文字はスペース(オプションによりタブ'\t'やカンマ','も利用可),名前と値の区切り文字はコロン(オプションによりイコール'='やバー'|'も利用可)です. 分類器を適用(タグ付け)するときは,事例のラベルを空文字列にしてください(ラベルのフィールドを省略することはできません).

<line>       ::= <comment> | <instance>
<comment>    ::= '#' <character>+ '\n'
<instance>   ::= <label> (' ' <feature>)+ '\n'
<label>      ::= <name> | <name> ':' <weight>
<feature>    ::= <name> | <name> ':' <weight>
<name>       ::= (<letter> | ^' ' | ^':')+
<weight>     ::= <numeric>

なお,Classiasで多クラス分類を行うときは,事例の属性とラベルを組み合わせた素性が(内部で)自動的に生成されます. このため,多クラス分類では事例の特徴を表す要素を「素性」と呼ばず,「属性」と呼びます.

候補選択

候補選択は,事例が取り得る候補が複数与えられているとき,最も適切と思われる候補を選ぶタスクです. 例えば,英単語"studies"の基本形の候補として,{"studie", "studi", "study", "stud"}の4つの文字列が考えられるとき,この中から基本形として最も適切と思われる文字列を選ぶタスクは,候補選択として定式化できます. まず,学習データの例を示します.

@boi
# studie
- s_ es_e ies_ie dies_die udies_udie tudies_tudie studies_studie
# studi
- es_ ies_i dies_di udies_udi tudies_tudi studies_studi
# study
+ ies_y dies_dy udies_udy tudies_tudy studies_study
# stud
- ies_ dies_d udies_ud tudies_tud studies_stud
@eoi

@boi
...
@eoi

一つの事例の記述は,"@boi"という行で始まり,"@eoi"という行で終わります. "@boi"から"@eoi"の間に,事例の候補を,1候補につき1行として必要な数だけ記述します. 上の例において,"#"から始まる行はコメントとして無視されますので,一つの事例に対して4つの候補が記述されていることになります. 候補の行は,その候補が正しければ'+'で,その候補が間違っていれば'-'から始まり,その後に素性のリストが続きます. 上の例では,3つめの候補(コメント行"# study"の直後)を選択すべきで,その他の候補は選択すべきでは無いと指示しています. 各候補の素性は,文字列を名前に持つものであれば,何でも使用できます. この例では,与えられた英単語を候補文字列に変換するための,部分文字列置換ルールを素性としています.

候補選択のデータ・フォーマットのBNF表記は,以下の通りです. 候補のラベルは,"+"もしくは"-"の文字から始まります. 先頭が"+"で始まるラベルは,その候補が正しい候補であることを示します. 先頭が"-"で始まるラベルは,その候補が間違った候補であることを示します. ラベルの2文字目以降で,その候補の実際のラベル名を与えることができます. このラベル名は適合率,再現率,F1スコアの計算に使われるだけで,省略可能です. ラベルと素性の区切り文字はスペース(オプションによりタブ'\t'やカンマ','も利用可),名前と値の区切り文字はコロン(オプションによりイコール'='やバー'|'も利用可)です. 分類器を適用(タグ付け)するときは,候補のラベルを空文字列にしてください(ラベルのフィールドを省略することはできません).

<line>          ::= <comment> | <boi> | <eoi> | <unreg> | <candidate> | '\n'
<comment>       ::= "#" <character>+ '\n'
<boi>           ::= "@boi" [ ':' <weight> ] '\n'
<eoi>           ::= "@eoi" '\n'
<unregularize>  ::= "@unregularize" (' ' <name>)+ '\n'
<instance>      ::= <class> [<name>] (' ' <feature>)+ <br>
<class>         ::= ('+' | '-')
<feature>       ::= <name> [ ':' <weight> ]
<name>          ::= (<letter> | ^' ' | ^':')+
<weight>        ::= <numeric>

Classiasフロントエンドの使い方

Classiasのフロントエンド・ユーティリティとして,ラベル付きデータから分類器のモデルを学習するclassias-trainと,構築したモデルで分類を行うclassias-tagが付属します.

分類器の学習

基本的な使い方

学習器のプログラム名はclassias-trainです. 使用方法は以下の通りです.

$ classias-train [オプション] [学習データ1] [学習データ2] [...]

学習データが指定されていないときは,標準入力から学習データを読み込みます. 学習データのファイルは,テキスト形式の他,gzip, bzip2, xzで圧縮された形式をサポートします. ファイル名の末尾が.gzで終わるときはgzip,.bz2で終わるときはbzip2,.xzで終わるときはxzユーティリティを呼び出して,学習データを自動的に解凍します. 学習データのファイルが複数指定されたときは,先頭から順にグループ番号(1から開始)が割り当てられます. グループ番号は,評価用のデータセットを指定するときに使います.

タスクのタイプは,-tオプションで指定します. タスクのタイプには,二値分類(-tb),候補選択(-tc),多クラス分類(-tmもしくは-tn)を指定します. 多クラス分類では,素性を疎に作るか(-tn),密に作るか(-tm)を選べます. 密な素性を使用すると,学習データに含まれる属性とラベルの可能な全ての組み合わせに対して素性を生成するため,素性空間が大きくなりメモリ利用量が増えますが,学習速度は速くなります. 疎な素性を使用すると,学習データに出現した属性とラベルの組のみで素性を生成するため,素性空間を小さくできますが,学習速度は遅くなります. 大規模なデータを扱うときは,疎な素性(-tn)を選択してください.

学習アルゴリズムは,-aオプションで指定します. Classias 1.0では,以下の学習アルゴリズムが利用可能です. ただし,多クラス分類,候補選択のタスクでは,SVMを利用できません.

  • L1正則化ロジスティック回帰: "lbfgs.logistic", "truncated_gradient.logistic"
  • L2正則化ロジスティック回帰: "lbfgs.logistic", "pegasos.logistic"
  • L1正則化L1ロスSVM: "truncated_gradient.hinge"
  • L2正則化L1ロスSVM: "pegasos.hinge"
  • 平均化パーセプトロン: "averaged_perceptron"

どの学習アルゴリズムが良いかは,学習データに依存するため,一概には言えません. ただし,一般的には次のような特徴が言われていますので,アルゴリズムを選ぶ際の参考にしてください.

  • L1正則化を行うと,素性選択を行いながら学習ができる
  • L1正則化よりもL2正則化の方が,分類精度は若干良くなる傾向にある
  • ロジスティック回帰よりもSVMの方が,僅かながら精度が良くなることがある
  • ロジスティック回帰は,分類結果の確率(確信度)を求めることができる
  • 平均化パーセプトロンは,非常に高速だが,分類精度が低めになる傾向がある
  • オンライン学習アルゴリズム(pegasos, truncated_gradient, averaged_perceptron)は,バッチ学習アルゴリズム(lbfgs)よりも速く解に近づくが,最終的な分類精度には差がない

以下の例は,二値分類の学習データrcv1_train.binary.bz2にPegasosのSVMアルゴリズムを適用する例です.

$ classias-train -tb -a pegasos.hinge rcv1_train.binary.bz2
Classias 1.0 trainer Copyright (c) 2008,2009 Naoaki Okazaki

Task type: binary
Training algorithm: pegasos.hinge
Instance shuffle: false
Bias feature value: 1
Model file:
Instance splitting: 0
Holdout group: -1
Cross validation: false
Attribute filter:
Start time: 2009-09-21T15:13:51Z

Reading the data set from 1 files
- 1 (bzip2): rcv1_train.binary.bz2
Number of instances: 20242
Number of groups: 1
Number of attributes: 44504
Number of labels: 2
Number of features: 44504
Seconds required: 1.77

Pegasos for linear classifier (binary) with hinge loss
c: 1
n: 20242
eta: 0.1
sample: shuffle
max_iterations: 1000
period: 20
epsilon: 0.0001

***** Iteration #1 *****
Loss: 5929.56
Feature L2-norm: 26.3076
Learning rate (eta): 0.083334
Total number of feature updates: 20242
Seconds required for this iteration: 0.04

***** Iteration #2 *****
Loss: 3448.83
Feature L2-norm: 29.3977
Learning rate (eta): 0.0714291
Total number of feature updates: 40484
Seconds required for this iteration: 0.04

(省略)

***** Iteration #124 *****
Loss: 2628.7
Feature L2-norm: 36.5945
Learning rate (eta): 0.00387597
Total number of feature updates: 2510008
Loss variance: 9.5071e-05
Seconds required for this iteration: 0.03

Terminated with the stopping criterion

Seconds required: 4.32

Finish time: 2009-09-21T15:13:57Z

次の例では,二値分類の学習データrcv1_train.binary.bz2に,L-BFGSを用いたロジスティック回帰を適用し,学習したモデルをrcv1.binary.modelに格納します.

$ classias-train -tb -a lbfgs.logistic -m rcv1.binary.model rcv1_train.binary.bz2

評価しながら学習

Classiasは,学習データと評価データを前もって別のファイルに分けておくholdout評価法と,学習データをNグループに分割して,(N-1)グループで学習して,1グループで評価するというプロセスをN回繰り返すN分割交叉検定をサポートします. holdout法では,学習データと評価データを与え,評価データのグループ番号を指示します. 次の例では,news20.bz2news20.t.bz2を多クラス分類データセットとして読み込み,グループ番号2のデータセット(news20.t.bz2)でholdout評価します.

$ classias-train -tn -e2 -a lbfgs.logistic news20.bz2 news20.t.bz2
Classias 1.0 trainer Copyright (c) 2008,2009 Naoaki Okazaki

Task type: multi-sparse
Training algorithm: lbfgs.logistic
Instance shuffle: false
Bias feature value: 1
Model file:
Instance splitting: 0
Holdout group: 2
Cross validation: false
Attribute filter:
Start time: 2009-09-21T16:09:06Z

Reading the data set from 2 files
- 1 (bzip2): news20.bz2
- 2 (bzip2): news20.t.bz2
Number of instances: 19928
Number of groups: 2
Number of attributes: 62061
Number of labels: 20
Number of features: 252009
Seconds required: 1.32

Multi-class logistic regression using L-BFGS
c1: 0
c2: 1
lbfgs.num_memories: 6
lbfgs.epsilon: 1e-05
lbfgs.stop: 10
lbfgs.delta: 1e-05
lbfgs.max_iterations: 2147483647
lbfgs.linesearch: MoreThuente
lbfgs.max_linesearch: 20
lbfgs.regularization_start: 0

***** Iteration #1 *****
Loss: 41104.3
Feature L2-norm: 1
Error norm: 6065.1
Active features: 250043 / 252009
Line search trials: 1
Line search step: 0.000104118
Seconds required for this iteration: 9.78
Accuracy: 0.5352 (2137/3993)
Micro P, R, F1: 0.5352 (2137/3993), 0.5352 (2137/3993), 0.5352
Macro P, R, F1: 0.6927, 0.5350, 0.5273

(省略)

***** Iteration #198 *****
Loss: 4003.62
Feature L2-norm: 44.7856
Error norm: 2.27719
Active features: 250043 / 252009
Line search trials: 1
Line search step: 1
Seconds required for this iteration: 5.63
Accuracy: 0.8232 (3287/3993)
Micro P, R, F1: 0.8232 (3287/3993), 0.8232 (3287/3993), 0.8232
Macro P, R, F1: 0.8244, 0.8231, 0.8234

L-BFGS terminated with the stopping criteria
Seconds required: 1185.1

Finish time: 2009-09-21T16:28:52Z

N分割交叉検定を行うには,データ分割を行う-gオプションに分割数を指定し,さらに-xオプションで交差検定を有効にします. データセットの分割から評価まで自動で行うので,N分割交差検定にかかる手間がかなり軽減されます.

$ classias-train -tb -g5 -x rcv1_train.binary.bz2
Classias 1.0 trainer Copyright (c) 2008,2009 Naoaki Okazaki

Task type: binary
Training algorithm: truncated_gradient.hinge
Instance shuffle: true
Bias feature value: 1
Model file:
Instance splitting: 5
Holdout group: -1
Cross validation: true
Attribute filter:
Start time: 2009-09-21T05:10:11Z

Reading the data set from 1 files
- 1 (bzip2): rcv1_train.binary.bz2
Number of instances: 20242
Number of groups: 5
Number of attributes: 44505
Number of labels: 2
Number of features: 44505
Seconds required: 1.86

===== Cross validation (1/5) =====
Truncated Gradient for linear classifier (binary) with hinge loss
c: 1
n: 20242
eta: 0.1
truncate_period: 1
sample: shuffle
max_iterations: 1000
period: 20
epsilon: 0.0001

***** Iteration #1 *****
Loss: 5998.9
Feature L1-norm: 1136.92
Feature L2-norm: 649.36
Learning rate (eta): 0.0925928
Active features: 14311 / 44505
Total number of feature updates: 16192
Seconds required for this iteration: 0.04
Accuracy: 0.9518 (3854/4049)
Micro P, R, F1: 0.9625 (2025/2104), 0.9458 (2025/2141), 0.9541

(省略)

***** Iteration #307 *****
Loss: 2369.45
Feature L1-norm: 1363.55
Feature L2-norm: 2910.78
Learning rate (eta): 0.0039125
Active features: 8283 / 44505
Total number of feature updates: 4971250
Loss variance: 7.91011e-05
Seconds required for this iteration: 0.04
Accuracy: 0.9637 (3902/4049)
Micro P, R, F1: 0.9650 (2069/2144), 0.9664 (2069/2141), 0.9657

Terminated with the stopping criterion

Seconds required: 13.32

===== Cross validation (2/5) =====
Truncated Gradient for linear classifier (binary) with hinge loss
c: 1
n: 20242
eta: 0.1
truncate_period: 1
sample: shuffle
max_iterations: 1000
period: 20
epsilon: 0.0001

(省略)

===== Cross validation (5/5) =====

(省略)

***** Iteration #319 *****
Loss: 2417.71
Feature L1-norm: 1374.15
Feature L2-norm: 2919.17
Learning rate (eta): 0.00377065
Active features: 7753 / 44505
Total number of feature updates: 5165885
Loss variance: 9.42357e-05
Seconds required for this iteration: 0.04
Accuracy: 0.9708 (3930/4048)
Micro P, R, F1: 0.9725 (2019/2076), 0.9707 (2019/2080), 0.9716

Terminated with the stopping criterion

Seconds required: 13.82

Finish time: 2009-09-21T05:11:23Z

精度・速度に関するオプション

分類器のパフォーマンス向上を目指すとき,よい学習アルゴリズムを使うことに気を取られがちです. しかしながら,学習アルゴリズムのパラメータも分類器のパフォーマンスに大きく影響します. Classiasでは,学習アルゴリズムに関するパラメータを-p (--set) オプションで指定できます.

学習アルゴリズムのパラメータで最も調整すべきものは,過学習に対するペナルティの度合いを決める「正則化の係数」です. 正則化の係数を小さくすると,与えられた学習データにできるだけフィットするモデルを好むため,過学習が起こりやすくなります. 正則化の係数を大きくすると,できるだけシンプルなモデルを好むため,過学習は起こりにくくなりますが,モデルが学習データに十分にフィットできない恐れがあります. 正則化のパラメータは,学習データの性質(ばらつき度合いなど)によって,最適な値が異なります. 通常は,開発用のデータセットを準備し,このデータセットにおける分類精度を計測して,正則化のパラメータを調整します. 正則化の係数は,学習アルゴリズムによってパラメータ名が異なりますが,Classiasでは "c"(lbfgs.logisticアルゴリズムの場合は"c1"及び"c2")で設定します.

オンライン学習アルゴリズムの一部には,学習率を決めるパラメータ"eta"と,収束判定を行うパラメータ"epsilon"があります. これらのパラメータも分類器の精度と学習の速さに影響します.

分類器の適用

学習器のプログラム名はclassias-tagです. 使用方法は以下の通りです.

$ classias-tag [オプション]

データを標準入力から読み込み,ラベル付け(分類)の結果を標準出力に書き出します.

分類器のモデルファイルは-mオプションで指定します.以下の例では,rcv1.binary.modelをモデルファイルとして,rcv1_test.binary.bz2のラベル付けを行います.

$ bzcat rcv1_test.binary.bz2 | classias-tag -m rcv1.binary.model
(省略)
-1
-1
-1
+1
-1
+1
+1
+1
-1
-1
(省略)

ラベル付けのスコアを出力するには,-wオプションを利用します. ラベル付け結果にコロン(':')で続けて,スコアが出力されます.

$ bzcat rcv1_test.binary.bz2 | classias-tag -m rcv1.binary.model -w
(省略)
-1:-1.677
-1:-1.03897
-1:-0.812968
+1:0.653437
-1:-0.591461
+1:0.936539
+1:0.98442
+1:0.444249
-1:-2.6872
-1:-1.17141
(省略)

ラベル付けの確率を出力するには,-pオプションを利用します. ラベル付け結果にコロン(':')で続けて,確率が出力されます. なお,この確率はロジスティック回帰で学習したモデルのみで有効です.

$ bzcat rcv1_test.binary.bz2 | classias-tag -m rcv1.binary.model -p
(省略)
-1:0.157493
-1:0.261349
-1:0.307258
+1:0.657785
-1:0.3563
+1:0.7184
+1:0.727984
+1:0.609271
-1:0.0637331
-1:0.236601
(省略)

入力データに正解のラベルが付与されているときは,分類器の性能を調べることができます. 正解のラベルと予測されたラベルを並べて出力するには,-rオプションを使います. この出力を処理すれば,正解率や精度などのスコアが計算できます.

$ bzcat rcv1_test.binary.bz2 | classias-tag -m rcv1.binary.model -r
(省略)
-1 -1
-1 -1
-1 -1
+1 +1
-1 +1
+1 +1
+1 +1
+1 +1
-1 -1
-1 -1
(省略)

分類器がラベル付けを間違えた事例のみを出力するには,-fオプションを用います. 各事例にコメントを付けておき,コメント出力オプション(-k)と併用すれば,失敗解析が行えます.

$ bzcat rcv1_test.binary.bz2 | classias-tag -m rcv1.binary.model -f
(省略)
-1 +1
+1 -1
+1 -1
+1 -1
+1 -1
-1 +1
-1 +1
+1 -1
-1 +1
+1 -1
(省略)

ラベル付けの精度をclassias-tagで計測することもできます(-tオプション). ラベル付けの出力を抑制する-qオプションと併用すると便利です.

$ bzcat rcv1_test.binary.bz2 | classias-tag -m rcv1.binary.model -qt
Accuracy: 0.9632 (652464/677399)
Micro P, R, F1: 0.9648 (343048/355571), 0.9651 (343048/355460), 0.9649

タスク・タイプが多クラス分類や候補選択の場合も使い方は同じです. タスク・タイプはモデルファイルに書き込まれているので,コマンドラインオプションで指定する必要はありません.

$ bzcat news20.t.bz2 | classias-tag -m news20.model
2
4
2
2
2
2
2
12
2
2
2
(省略)

事例のそれぞれのラベル候補の情報を出力するには,-aオプションを使います. 確率を出力するオプション(-p)と併用すると,事例中のそれぞれの候補にどのような確率が計算されたのか,確認することができます. 以下の例では,ある事例がラベルが"2"と推定される確率は0.99977で,どのラベル候補の確率よりも高いので,分類器が"2"を事例のラベルとして予測したことを示しています.

$ bzcat news20.t.bz2 | classias-tag -m news20.model -ap
@boi
-1:6.54488e-06
+2:0.99977
-3:2.80506e-13
-4:3.09902e-13
-5:0.000223139
-6:5.02903e-12
-7:5.59272e-14
-8:3.59528e-14
-9:9.96966e-13
-10:8.64676e-15
-11:1.26634e-13
-12:3.97081e-13
-13:4.16725e-14
-14:7.44803e-16
-15:2.57823e-15
-16:1.41428e-15
-17:1.07985e-15
-18:5.30595e-14
-19:2.34302e-13
-20:1.2039e-13
@eoi
(省略)

さらに,正解ラベルを出力するオプション(-r)や,失敗解析のオプション(-f)と組み合わせることができます. 失敗解析を行う以下の例では,ある事例の正解のラベルは"2"であるのに,分類器は"4"を事例のラベルと予測したことが示されています(先の例と比較すると確率分布が平坦になっていて,この事例のラベルは "2", "3", "4", "5" で紛らわしいことが分かります).

$ bzcat news20.t.bz2 | classias-tag -m news20.model -fap
@boi
--1:0.0654903
+-2:0.167662
--3:0.109992
-+4:0.251968
--5:0.204841
--6:0.012788
--7:0.019802
--8:0.0267658
--9:0.00712349
--10:0.020578
--11:0.0186353
--12:0.0121116
--13:0.0120979
--14:0.0119843
--15:0.0108746
--16:0.00433983
--17:0.0117268
--18:0.00491985
--19:0.0068262
--20:0.0194728
@eoi
(省略)

コンパイル方法

Visual Studio 2008 SP1によるビルド

Visual Studio 2008 SP1を使ってClassiasをコンパイルするには,ソリューションファイル (classias.sln) を開いてください. その際,libLBFGSのヘッダファイルとライブラリが必要になりますので,ソリューションファイルのルートフォルダ以下にwin32/liblbfgsというフォルダを作成し,lbfgs.h, lbfgs.lib (Releaseビルド), lbfgs_debug.lib (Debugビルド) を配置してください.

なお,ClassiasはC++の次期標準と見込まれるTechnical Report 1 (TR1) から,unordered_mapregexを利用しています. このため,Classiasをビルドするには,Visual Studio 2008 Service Pack 1以上が必須となります.

g++によるビルド

POSIX環境で,g++を使ってClassiasをコンパイルする方法を示します. Classiasをビルドするには,libLBFGSが必要になります. また,Classiasはunordered_mapを可能であれば利用するため,C++の次期標準と見込まれるTechnical Report 1 (TR1) もしくはBoostライブラリが推奨されます. これらが存在しなくてもビルドはできますが,特にunordered_mapはパフォーマンスに影響しますので,利用可能な環境にしておくことをお奨めします.

まず,libLBFGSをビルドしてインストールします. インストールにはルート権限が必要になりますので,configureスクリプトのオプションとして--prefixを指定し,ローカルディレクトリにインストールしても構いません. ローカルディレクトリにインストールした場合は,classias-trainを実行する際,環境変数LD_LIBRARY_PATHにライブラリ検索パスを追加してください.

$ wget http://www.chokkan.org/software/dist/liblbfgs-1.8.tar.gz
$ tar xvzf liblbfgs-1.8.tar.gz
$ ./configure [--prefix=/path/to/a/temporary/directory]
$ make
$ make install

これで,Classiasをビルドする準備が整いました. libLBFGSを別のディレクトリにインストールした場合は,そのディレクトリ名をconfigureスクリプトの--with-liblbfgsで指定してください.

$ ./configure [--with-liblbfgs=/path/to/a/temporary/directory]
$ make
$ make install

g++とlibstdc++がunordered_mapに対応している場合は,以上の手順で十分です. Boostライブラリunordered_mapを利用する場合で,Boostライブラリのヘッダファイルが標準のディレクトリにインストールされていない場合は,--with-boost-includeというオプションを指定してください. --with-boost-includeには,Boostのインクルードヘッダが配置されている場所(例えば~/local/include/boost-1_39など)を指定します.

$ ./configure --with-boost-include=~/local/include/boost-1_39 \
              [--with-liblbfgs=/path/to/a/temporary/directory]
$ make
$ make install