RubyでSVMを使ってみる

CentOS6.4にlibsvmを入れて、rubyでそれを使うまでの導入記事です。 rubyのバージョンは、2.0.0p247を使っています。

まず、SVM(Support Vector Machine)について軽く触れておきます。SVMは、教師あり学習(正解データを学習させる)を用いた識別手法で、 多くある識別手法のなかで最も認識性能が優れた学習モデルの一つであると言われています。様々な場面で使うことができ、例えば、テキストの極性評価であったり、ジャンル分けなどに使えます。

libsvm

何はともあれ、libsvmをインストールしましょう。EPELレポジトリを追加していないとインストールできないので、こちらの記事を参考にレポジトリを追加します。追加できたら、

$ sudo yum --enablerepo=epel -y install libsvm libsvm-devel

を実行します。

libsvmは単体で、shellから使うこともできますが、pythonrubyバインディングさせて、スクリプトで実行することもできます。なので、今回はrubyからlibsvmを実行できるようにします。

libsvm-ruby-swig

rubyからlibsvmを実行するためのgemはいくつかあるみたいですが、今回はlibsvm-ruby-swigというgemを使います。普通に、

gem install libsvm-ruby-swig

を実行して、gemをインストールしてください。

これで準備は整いました。次に、これらを使って、SVMを実行してみたいと思います。

SVMは一番始めに述べたように、教師あり学習の一手法です。したがって、段階としては、まず始めに正解データを学習させる段階があり、その後、識別したいデータを食わせるという流れになります。下記のサンプルコードでは、trainメソッドで正解データを学習させています([1,0,1]の場合には1、[-1,0,-1]の場合には-1が正解になっている)。また、ここでカーネルの種類やペナルティパラメータを設定します。そして、学習が終わったら、識別モデルができるので、そのモデルを使って、識別したいデータを与えてあげます。

require 'svm'

class SvmKlass
  def train
    prob = Problem.new([1,-1],[[1,0,1],[-1,0,-1]])
    params = Parameter.new(:kernel_type => RBF, :C => 10)
    m = Model.new(prob,params)
    m.save("svm.model")
  end

  def test
    m = Model.new("svm.model")
    res = m.predict([0,0,-1])
    puts res
  end
end

svm = SvmKlass.new
svm.train
svm.test

以上のように、rubyでも簡単にSVMを使った識別ができます。あとは、学習させるデータを整理することと、カーネルの選択、パラメータの設定をし、より良い精度で判別できるようにします。カーネル選択、パラメータの設定については、こちらのスライドが参考になります。

参考