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>
LIBSVMの入力データ形式について
<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>
<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>
.
.
.
<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>
ここに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) が出来るようである.