C#でSVM libsvm.netによる方法

SVMのライブラリであるLIBSVMを.NETプロジェクトで使えるようにするlibsvm.netを動かしてみる.

libsvm.netのインストール

NuGet経由でインストール可能.プロジェクトを右クリックして「NuGetパッケージの管理」を選択する.オンラインから「libsvm.net」を検索・インストール.

動作確認

libsvm.netでは,トレーニングデータやテストデータをLIBSVMと同じ形式でファイルから入力できる.データのフォーマットは以下の通りである.

<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>
<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>
<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>
.
.
.
<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>

LIBSVMの入力データ形式について

ここにLIBSVM用のデータセットが落ちていたので,fourclassというデータセットを使ってみる.

以下に,分類器を動かすソースコード乗せる.

// トレーニングデータの読み込み
var training = libsvm.ProblemHelper.ReadProblem("fourclass");
// RBFカーネルを生成
var gamma = 1;
var kernel = libsvm.KernelHelper.RadialBasisFunctionKernel(gamma);
// C-SVC用のクラスの生成
var c = 1;
var svm = new libsvm.C_SVC(training, kernel, c);

// テストデータの読み込み(面倒だったのでトレーニングデータをそのまま使ってる)
var test = libsvm.ProblemHelper.ReadProblem("fourclass");
for (int i = 0; i < test.l; i++)
{
    // 予測値
    var z = svm.Predict(test.x[i]);
    // 入力ファイルについているラベル
    var y = test.y[i];
    // 予測値と正解値を出力
    Console.WriteLine("{0}:{1} {2}", i, z, y);
}

トレーニングデータとテストデータは同じものを使った.実行すると,予測値と正解値が出力される.

上記コードではパラメータ選択とかまでは行っていないが,結構簡単に使えそう.他にも回帰 (ϵ-SVR)や外れ値検出 (One-Class SVM) が出来るようである.