機械学習をやろうと思うとPythonを覚えないといけない雰囲気があります。確かにPythonには行列や算術系ライブラリが充実しているので採用しやすいでしょう。しかし他の言語もその状態に甘んじている訳ではありません。 今回はRubyで機械学習を行うRumaleを紹介します。以前はSVMKitという名前で知られていたライブラリです。

Rumaleの使い方

インタフェースはScikit-Learnに似せているそうです。libsvmのファイルが読み込めます。

$ wget https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/pendigits
$ wget https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/pendigits.t

そしてトレーニングを実行します。

require 'rumale'

# トレーニングデータを読み込み
samples, labels = Rumale::Dataset.load_libsvm_file('pendigits')

# データをRBFカーネルにマッピング
transformer = Rumale::KernelApproximation::RBF.new(gamma: 0.0001, n_components: 1024, random_seed: 1)
transformed = transformer.fit_transform(samples)

# サポートベクターマシンによるトレーニング
classifier = Rumale::LinearModel::SVC.new(reg_param: 0.0001, max_iter: 1000, batch_size: 50, random_seed: 1)
classifier.fit(transformed, labels)

# モデルの保存
File.open('transformer.dat', 'wb') { |f| f.write(Marshal.dump(transformer)) }
File.open('classifier.dat', 'wb') { |f| f.write(Marshal.dump(classifier)) }

テストは次のようなコードで行います。

require 'rumale'

# テストデータの読み込み
samples, labels = Rumale::Dataset.load_libsvm_file('pendigits.t')

# モデルの読み込み
transformer = Marshal.load(File.binread('transformer.dat'))
classifier = Marshal.load(File.binread('classifier.dat'))

# データをRBFカーネルにマッピング
transformed = transformer.transform(samples)

# テストデータの分類を実行
puts("Accuracy: %.1f%%" % (100.0 * classifier.score(transformed, labels)))

結果は98.4%で分類分けに成功しました。

$ ruby test.rb 
Accuracy: 98.4%

Rumaleはベクトルマシン、ロジスティック回帰、線形回帰、リッジ、因数分解、ベイズ、決定木、AdaBoost、ランダムフォレスト、k近傍法、DBSCAN、主成分分析、非負行列因数分解(NMF)をサポートしています。これまでPythonを呼び出して実行するものはありましたが、RumaleはRubyだけで作られています。これは大いに期待がかかるライブラリではないでしょうか。

RumaleはRuby製のオープンソース・ソフトウェア(2-clause BSD lisence)です。

yoshoku/rumale: Rumale is a machine learninig library in Ruby