【初心者が1時間で】Rubyでsvmを用いた機械学習プログラムを作ってみる
今回は、rubyでsvmを用いた機械学習プログラムについてまとめます。
私のもっていた知識
私が機械学習という言葉を聞いたのはつい最近で、色々な文献を見て回りましたがイマイチ理解しきれませんでした。
というのも、ある程度わかったつもりになっていてもそれを実際に動かすことができなかったからです。
今回扱ったsvmもその一つです。文献を読んだ感じでは、
「多くのデータを与えることでデータの境界線を自動で引いてくれて、それを元に分類をしてくれるもの」
みたいな感じかな?という理解でした。
そして、どの文献を読んでも「理屈は難しいが動かせばわかる」と書いてあって「だから、動かせないんだよ!」って思ってました。
そこで、とりあえずどんなに小さいものでもいいから動かせるようにしたいと思い、どうにかしてrubyで機械学習(今回はsvmを用いた分類)を行うようなプログラムを動かせるようになったのでどのような準備をしたのかから詳しくまとめたいと思います。
準備するもの
まずはrubyでsvmを用いた機械学習プログラムを作る上で必要となるものの準備を行います。
今回、私は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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
これで以下のような感じの線が引かれてるイメージになります。
あくまでイメージなのでこのようなグラフは描画されません。
この線に対して上の部分が「1」、下の部分が「-1」というように分類されます。
試しに0,1という点について分類させると「1」という結果が返ってきたと思います。
これが一番簡単なsvmを用いた分類を行うプログラムです。
教師データを増やすと、この境界線が変わっていくことがわかると思います。
興味がある方は細かくデータを変え、予測させるデータを変えるとわかると思います。
今回は分かりやすくするために、2値の分類(1と-1)を行いましたが、データの与え方さえ変えれば3値の分類もできます。
以上です。