しろかい!

アプリ開発や機械学習などの開発Tips.

【LIBLINEAR】cross validationに使う評価尺度を変更する方法

LIBLINEARで cross validation (クロスバリデーション, 交差検定) を行う時は,評価指標として Accuracy が用いられます.しかし,用途によってはF 値など,他の指標を使いたい時もあるかと思います.
というわけで,本記事では LIBLINEAR の cross validation に使う評価尺度を変更する方法を紹介します.

実は公式サイトに書いている!?

公式サイトの以下のページに,評価尺度を変更する方法が書かれているんです.

と言っても英語なので,以下に日本語で手順を示しておきます.

評価尺度の変更方法

LIBLINEAR をインストールしたディレクトリ (恐らく liblinear-2.01/ とかだと思います) 上で実行して下さい.

必要なファイルのDL

必要なファイル (3つ) をダウンロードします.

$ wget http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/eval/liblinear/eval.cpp
$ wget http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/eval/liblinear/eval.h
$ wget -N https://gist.githubusercontent.com/shun91/ed604455722cd170e727/raw/f9656df951ae728213667724b3a2f8f1bb38e7a2/Makefile

Makefile は元のページからDLしても ver.2.01 に対応していません.
修正したものをGistにあげてあるので,それをDLします.

train.c の修正

「train.c」の先頭に以下の1行を追記します.

#include "eval.h"

さらに, main() 関数にある,

do_cross_validation();

の行を以下に置換します.

double cv =  binary_class_cross_validation(&prob, &param, nr_fold);
printf("Cross Validation = %g%%\n",100.0*cv);

predict.c の修正

「train.c」同様,「predict.c」の先頭に以下の1行を追記します.

#include "eval.h"

さらに, main() 関数にある,

do_predict(input, output);

の行を以下に置換します.

binary_class_predict(input, output);

eval.cpp の修正

「eval.cpp」の以下の行の auc の部分を出力させたい評価尺度に変更します.

double (*validation_function)(const dvec_t&, const ivec_t&) = auc;

指定できるのは以下の値です.
accuracy, auc, precision, recall, fscore, bac

F値を出力させたい場合は fscore を指定します.

コンパイルする

LIBLINEAR を再コンパイルします.

$ make clean
$ make

これで別の評価尺度を使った cross validation ができるようになります.
試しにやってみましょう.

$ ./train -v 5 heart_scale
......*
optimization finished, #iter = 68
Objective value = -100.355195
nSV = 155
......*
optimization finished, #iter = 69
Objective value = -91.741174
nSV = 150
......**.
optimization finished, #iter = 70
Objective value = -99.387037
nSV = 160
......**
optimization finished, #iter = 69
Objective value = -97.614512
nSV = 154
......*
optimization finished, #iter = 68
Objective value = -87.859201
nSV = 150
F-score = 0.808696
Cross Validation = 80.8696%

確かに F値 (F-score) が出力されるようになりました!

まとめ

LIBLINEAR の cross validation に使う評価尺度を変更する方法を解説しました.
指標を変更する度に再コンパイルの必要があるのが若干ネックですが,それでも簡単にできるのはいいですね!

参考