読者です 読者をやめる 読者になる 読者になる

liblinear-ruby-swigを使って手書き数字を判別する1

今回は、liblinear-ruby-swigを使って手書き数字を判別する機械学習のプログラムを組んでいきたいと思います。
【liblinear-ruby-swigのインストール】
liblinear-ruby-swigを使うには以下のコマンドを実行して
sudo gem sources -a http://gems.github.com (you only have to do this once)
sudo gem install tomz-liblinear-ruby-swig
ソースコードの最初に
require 'rubygems'
require 'linear'
と宣言すれば大丈夫です。

【サンプルを動かす】
では早速作っていきましょう。
と言っても、一から書くのはなかなか至難の技・・・
そこであるサイトのコードを基にして、それを改良する形でソースコードを組んでいきます。
そのサイトはこちら
http://yshtak.tumblr.com/post/32271070401/ruby%E3%81%A7svm%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AAliblinear-ruby-swig
このサイトでは少し難しいですがliblinear-ruby-swigを使ったサンプルコードがあるのでこれを使います。(少し改良してあります)
libsvm.rb---------------

require "linear"

# types = [ 'L2R_LR', 'L2R_L2LOSS_SVC_DUAL', 'L2R_L2LOSS_SVC', 'L2R_L1LOSS_SVC_DUAL', 'MCSVM_CS', 'L1R_L2LOSS_SVC', 'L1R_LR' ] SVMの種類
# 0:L2_LR , 1:L2LOSS_SVM_DUAL , 2:L2LOSS_SVM , 3: L1L1LOSS_SVM_DUAL, 4: MCSVM_CS, ... 定義されている変数名

pa = LParameter.new
pa.solver_type = MCSVM_CS
pa.eps = 0.1
bias = 1
labels, samples = read_file("training_file")
sp = LProblem.new(labels,samples,bias)
model = LModel.new(sp,pa)

x = {1=>1,2=>0.1,3=>0.2,4=>0,5=>0} # テストしてみるデータ
model.predict(x)
puts x # どのラベルに分類されているかが出力される

model.save("sample01.model") # Modelファイルの保存
                                            • -

これを動かす際の注意点として、同じフォルダ内に「training_file」というファイルを作りそこに以下のような内容を記述しておいてください!(これがないと動きません。私はこれで3時間くらい止まってました・・・)

  1. 1 1:0.708333 2:1 3:1 4:-0.320755 5:-0.105023 6:-1 7:1 8:-0.419847 9:-1 10:-0.225806 12:1 13:-1
  • 1 1:0.583333 2:-1 3:0.333333 4:-0.603774 5:1 6:-1 7:1 8:0.358779 9:-1 10:-0.483871 12:-1 13:1
  1. 1 1:0.166667 2:1 3:-0.333333 4:-0.433962 5:-0.383562 6:-1 7:-1 8:0.0687023 9:-1 10:-0.903226 11:-1 12:-1 13:1
  • 1 1:0.458333 2:1 3:1 4:-0.358491 5:-0.374429 6:-1 7:-1 8:-0.480916 9:1 10:-0.935484 12:-0.333333 13:1
  • 1 1:0.875 2:-1 3:-0.333333 4:-0.509434 5:-0.347032 6:-1 7:1 8:-0.236641 9:1 10:-0.935484 11:-1 12:-0.333333 13:-1

動きましたか?とりあえず動いたなら成功です。
動かした結果このような出力が得れて
training_file: 5 samples loaded.
{1=>1, 2=>0.1, 3=>0.2, 4=>0, 5=>0}
かつ、フォルダ内にsample01.modelとかいうのが生成されたら大成功です。
次のステップに進みましょう。

【手書き数字のデータを取ってくる】
手書き数字に関する情報はこのサイトを参考にしました。
http://qiita.com/kenmatsu4/items/2d21466078917c200033
ここにあるコードはpythonですが、扱っているデータなどはcsvで問題なく扱えます。
ここに書いてあるように学習用のデータやテストデータなどはここにあります
https://www.kaggle.com/c/digit-recognizer/data
簡単な登録があります。(無料です)
ここの「train」の右側にある「.csv」をクリックしてダウンロードしましょう。
すごく時間がかかります。確か4万くらいデータがあるので。

とりあえず今回はここで区切ります。