洋食の日記

「た・である」調ではなく「です・ます」調で書きはじめれば良かったなと後悔してる人のブログです

DaruとRumaleを使ってKaggleのTitanicコンペにRubyで挑戦する

はじめに Kaggleのチュートリアルコンペぐらいなら、Rubyでもイケるんじゃないかと思って、データ分析ライブラリのDaruと機械学習ライブラリのRumaleでTitanicコンペに挑戦してみた。 Titanic: Machine Learning from Disaster | Kaggle DaruはPythonでいう…

Rumaleに改名するときにやらかしたコト

はじめに Rumaleに改名する際に以下のページをまずみた。Googleで「gem rename」で上位に来たので。 stackoverflow.com ざっと読んで、旧名のGemのリポジトリとかREADMEとかに説明をつけて、新しいの出せば良いんだな〜と思った。FactoryBot(旧FactoryGirl…

SVMKitをRumaleに改名した

SVMKitをRumale (Ruby machine learning) に改名した。SVMKitにサポートベクターマシン以外のアルゴリズムを実装するようになってから、ずっと考えていたが、いい名前が思いつかず放置していた。Rumaleの命名には、 Red Data Tools の id:mrkn さんや kou さ…

SVMKitにGrid Seachを実装した

はじめに SVMKitに、ハイパーパラメータの探索手法として定番のGrid Searchを実装した。Scikit-learnのGrid Searchと同様に、交差検定をベースにした探索を行う。与えられたハイパーパラメータの値のすべての組み合わせで、交差検定を行い、テストでのスコア…

Rubyでキーワード引数の引数名と値の一覧をHashで得る

はじめに Ruby 1.9以前のHashでキーワード引数を再現してたような感じで、Ruby 2.0以降のキーワード引数でも、引数の名前とその値の一覧をHashで得たいときがある。 コード def foo(a: 'yes', b: 'no') keywd_args = method(__callee__).parameters.map { |_…

SVMKitにPipeline機能を追加した

はじめに SVMKitで、一通りベーシックな機械学習アルゴリズムの実装を終えたので、しばらく便利機能の追加を予定している。バージョン0.7.2ではPipelineを実装した。Pipelineを使うことで、正規化して主成分分析してSVMで分類といった連結処理を定義できる。…

レトロゲームをクリアするなかで学んだこと

はじめに New ニンテンドー 3DS LLを買ってから、ひたすら、バーチャルコンソールで子どもの頃にクリアできなかったレトロゲームをやっている。忍者龍剣伝も月風魔伝もR-Typeもクリアした。タイムスリップして小学生の自分に「お前も大人になったら忍者龍剣…

Red DatasetsとSVMKitを使ってIrisデータセットでの線形SVMの分類精度を確認する

はじめに Red Datasetsは、IrisやMNISTといった公開されているデータセットを、Rubyで簡単に扱えるようにするプロジェクトである(Pythonでいえば、scikit-learnのsklearn.datasetsや、Kerasのkeras.datasetsに近い)。本記事では、Red DatasetsでIrisデータ…

Numo::Linalgで特異値の数を指定できる特異値分解を実装する

はじめに Numo::Linalgは、Rubyで行列のノルムの計算や固有値分解などの線形代数計算を行うライブラリである。Pythonのnumpy.linalgやscipy.linalgに相当する。Numo::Linalgのバージョン0.1.3から、固有値分解で求める固有値・固有ベクトルの範囲を指定でき…

はてなブログProを解約してしまった

筆不精なので「お金を払えば書くようになるかな?」と思ったら、そうでもなかったです。ちなみに、解約してスグに元に戻るのではなくて、払った分はProでいられます。良心的ですね。

RubyでLIBSVM形式のファイルを扱うLibSVMLoaderをバージョンアップした

久しぶりにLibSVMLoaderをアップデートした。 $ gem install libsvmloader これまでNMatrixで特徴ベクトルとラベルを表現していたが、これをRubyのArrayに変えた。Arrayにすることで、NMatrixだけでなくNumo::NArrayでも使用できる。 require 'libsvmloader'…

SVMKitにクラスタリングと行列分解を実装した

svmkit | RubyGems.org | your community gem host クラスタリングはK-MeansとDBSCAN、行列分解は主成分分析(Principal Component Analysis, PCA)と非負値行列因子分解(Non-negative Matrix Factorization, NMF)を実装した。K-Meansは、K-Means++による…

SVMKitでの回帰の実装をだいたい終えました

svmkit | RubyGems.org | your community gem host SVMKitの0.3系では、回帰手法の実装を目標としていたが、代表的な手法を実装して、だいたい終えた(※カーネルSVMによる回帰の実装を見送った。SVMKitではStochastic Gradient Descent, SGDでの実装を基本と…

SVMKitで回帰の実装をはじめました

はじめに これまでSVMKitでは、分類とそれに関連する手法の実装を進めていたが、回帰の実装をはじめた。手始めに線形サポートベクター回帰とk-近傍法による回帰を実装した。 svmkit | RubyGems.org | your community gem host これにあわせて、交差検定を回…

Rubyで近似最近傍探索ライブラリを作った話

はじめに Rubyで動く近似最近傍探索(Approximate Nearest Neighbor search, ANN)ライブラリが欲しくなって作成した。 hanny | RubyGems.org | your community gem host FLANNのRubyバインディングがあり検討したが、FLANN自体の開発が止まっているので、勉…

SVMKitのSVM系分類器に事後確率を推定するメソッドを追加した

はじめに SVMKitのSupport Vector Machine(SVM)系の分類器であるSVCとKernelSVCに、ロジスティック回帰と同様に事後確率を推定するpredict_probaメソッドを追加した。 svmkit | RubyGems.org | your community gem host これにあわせて、Log-Lossを評価す…

SVMKitのLogistic Regressionの勾配計算に間違いがあったので修正した

はじめに SVMKitのSVMKit::LinearModel::LogisticRegressionの勾配計算に間違いがあったので修正して0.2.8としてリリースした。 svmkit | RubyGems.org | your community gem host 0.2.8では、与えられたパラメータのチェックなどの細かな部分を補うことを予…

SVMKitの二値分類器にOne-vs-the-restを内包した

はじめに SVMKitのSVMKit::LinearModel::SVCなどの二値分類器で、多値のラベルを与えれた場合に、自動的にOne-vs-the-rest法で多値分類器化するように修正を加えた。 svmkit | RubyGems.org | your community gem host これにより、SVMKit::Multiclass::OneV…

SVMKitに決定木とランダム森の分類器を追加した

はじめに SVMKitに決定木(Decision Tree)とランダム森(Random Forest)による分類器を実装し、バージョンを0.2.6とした。 svmkit | RubyGems.org | your community gem host 決定木は、CARTをベースにした二分木によるものを実装した。Scikit-learnになら…

SVMKitに単純ベイズ分類器を追加した

はじめに Ruby 25周年の記念日に何かSVMKitをバージョンアップしたくて準備を進めていた。無事に単純ベイズ(Naive Bayes, NB)分類器を追加した状態でバージョンアップできた。Scikit-learnにならってGaussian、Multinomial、Bernoulliの各種分布のアルゴリ…

SVMKitにFactorization Machineによる分類器を追加した

はじめに SVMKitの開発は、何かしら毎月バージョンアップしようという思いで進めており、無事に2月も0.2.4をリリースすることができた。 svmkit | RubyGems.org | your community gem host SVMKitにFactorization Machine(FM)による分類器を追加した。FMは…

SVMKitにK分割交差検証を追加した

はじめに SVMKitで「LIBSVM相当のことができるように」と思い、K分割交差検証(K-fold cross validation)を追加した。一度、cross validationするためのデータを分割するクラスを追加した段階で「これでminimum viable productかな」と思って、0.2.2として…

Numo::Linalgのバックエンドライブラリを良い感じに読み込むライブラリを作った

はじめに Numo::Linalgは、numpy.linalgに相当するもので、QR分解や特異値分解を行うメソッドを提供する。これら線形代数の機能は、いわゆるBLAS/LAPACK系のバックエンドライブラリの関数を呼び出すことで実現している。このバックエンドライブラリは、まだ…

SVMKitで使用する線形代数ライブラリをNumo::NArrayに移行した

SVMKitでは、線形代数ライブラリにNMatrixを使用していたが、パフォーマンスと将来性からNumo::NArrayに移行した。Numo::NArrayのメソッド等は、NMatrixともNumpyとも違うが、specを用意しておいて淡々と作業した。思い切った移行だけど、ユーザーも少ないの…

vimのnativeなpackage管理でsyntasticをインストールした

はじめに rubocopするのを忘れがちで、vimで(自動で)できてくれると嬉しいので、syntasticを入れることにした。使ってるvimのバージョンは8.0.1200なので、nativeなpackage管理を使ってインストールすることにした。 インストール パッケージを入れるため…

機械学習ライブラリSVMKitにカーネルSVMを追加した

はじめに Pure Rubyな機械学習ライブラリSVMKitにカーネルSVMを追加しました。カーネルSVMは、Pure Rubyでは速度的にツラいものがあるかな?と思っていたが、機械学習ライブラリとしては実装されているべきものなので追加した。※それ以前にLogistic Regressi…

Pure RubyなSupport Vector Machineのgemを公開した

はじめに RubyにPythonのscikit-learnに相当するライブラリがない様なので、作ってみることにした。ひとまず、Support Vector Machine(SVM)による多値分類が実装できたので、gemとして公開することにした。今後、他の機械学習アルゴリズムも追加していく。…

rb-libsvmとlibsvmloaderを使ったRubyでのカーネル非線形SVMによる分類

はじめに RubyのLIBSVMバインドであるrb-libsvmと、libsvm形式のデータセットを読み書きするlibsvmloaderで、カーネル非線形SVMで分類する例です。カーネル非線形と明記するのは、libsvmの姉妹品であるliblinearが線形SVMなため。 準備 まずLIBSVMそのものを…

LibSVMLoaderのゼロベクトルが読み込めないバグを修正した

タイトルのとおりです。LibSVMLoader(ver. 0.1.0)は、ゼロベクトルが含まれているとコケることがわかりました。修正してアップしておきました。申し訳ありません。 libsvmloader | RubyGems.org | your community gem host specまわりの修正を除いた本体の…

RandSVDで乱数のシードを固定できるように修正した

RandSVDをマイナー(タイニー?)バージョンアップした。RandSVD(というよりも乱択アルゴリズムの特異値分解)では、ランダム行列との積により行列を小さくする処理を含んでいる。なので、乱数のシードを固定できるようにしたほうが親切だと考えた。 ※ NMat…