【初心者が1時間で】Rubyでsvmを用いた機械学習プログラムを作ってみる

今回は、rubysvmを用いた機械学習プログラムについてまとめます。

私のもっていた知識

私が機械学習という言葉を聞いたのはつい最近で、色々な文献を見て回りましたがイマイチ理解しきれませんでした。
というのも、ある程度わかったつもりになっていてもそれを実際に動かすことができなかったからです。
今回扱ったsvmもその一つです。文献を読んだ感じでは、
「多くのデータを与えることでデータの境界線を自動で引いてくれて、それを元に分類をしてくれるもの」
みたいな感じかな?という理解でした。
そして、どの文献を読んでも「理屈は難しいが動かせばわかる」と書いてあって「だから、動かせないんだよ!」って思ってました。
そこで、とりあえずどんなに小さいものでもいいから動かせるようにしたいと思い、どうにかしてruby機械学習(今回はsvmを用いた分類)を行うようなプログラムを動かせるようになったのでどのような準備をしたのかから詳しくまとめたいと思います。 

準備するもの

まずはrubysvmを用いた機械学習プログラムを作る上で必要となるものの準備を行います。
今回、私はMacでこの作業を進めました。
libsvm
・liblinear
この二つのインストールには
http://blog.tsuda.me/computer/2013/05/19/ruby-svm/
このサイトを参考にしました。
一応コマンドだけ抜粋すると

libsvmのインストール

brew install libsvm
gem install libsvm-ruby-swig

・liblinearのインストール

brew install liblinear
gem install liblinear-ruby-swig

これで、

require 'svm'

をすればsvmが使えるようになります。

まず準備が完了です。
ここから実際にコードを動かすことをしていきます。

実際に動かす

今回一番最初に動かしたコードがこちらです。
sample.rb----------------

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
                                            • -

http://hongo35.hatenablog.com/entry/2013/08/04/133348より引用
なんとなくですが、trainの部分で学習して、それを元にtestで予測のテストをしているのがわかると思います。
実際、
prob = Problem.new([1,-1],[[1,0,1],[-1,0,-1]])
この行で行っていることは
prob = Problem.new([データAに対する答え,データBに対する答え],[[データA],[データB]])
このような形で教師データを与えているのです。
と言ってもこのサンプルは3次元なのでよくわからなかったので、こんな感じに書き換えました。
sample.rb----------------

require 'svm'
class SvmKlass
def train
prob = Problem.new([1,-1],[[1,1],[-1,-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,1])
puts res
end
end

svm = SvmKlass.new
svm.train
svm.test
                                            • -

これで以下のような感じの線が引かれてるイメージになります。
f:id:mr-itaya-magic:20161109202645p:plain
あくまでイメージなのでこのようなグラフは描画されません。
この線に対して上の部分が「1」、下の部分が「-1」というように分類されます。
試しに0,1という点について分類させると「1」という結果が返ってきたと思います。
これが一番簡単なsvmを用いた分類を行うプログラムです。

教師データを増やすと、この境界線が変わっていくことがわかると思います。
興味がある方は細かくデータを変え、予測させるデータを変えるとわかると思います。
今回は分かりやすくするために、2値の分類(1と-1)を行いましたが、データの与え方さえ変えれば3値の分類もできます。

以上です。