Rubyで機械学習を始める方法|2026年の現行ライブラリと選定基準
RubyはWebアプリケーション開発で広く使われる一方、機械学習では「ライブラリが少ない」と語られがちだ。だが状況は数年前と大きく変わっている。かつて紹介されていたNMatrixやDaru、Shogunのバインディングは開発が止まり、代わりにRumaleやNumo::NArray、torch.rb、XGBoostといった現役のgemが実務で使える水準まで育った。この記事では2026年時点で本当に使えるライブラリだけに絞り、Rubyで機械学習を始める具体的な手順と、Pythonとの棲み分け・ライブラリ選定の基準までを実装例つきで整理する。機械学習そのものの基礎は機械学習とは何かを仕組みから解説した記事に譲り、ここではRubyでの実装に集中する。
まとめ:Rubyで機械学習を始めるときの結論
- 数値計算とデータ整形はNumo::NArrayとRoverが標準。旧NArray・Daru・NMatrixは使わない。
- 古典的な機械学習(分類・回帰・クラスタリング)はRumale一択。scikit-learnに近いAPIで、2025年に1.0、2025年11月時点で2.0系まで更新が続いている。
- 表形式データで精度を出すならXGBoostとLightGBMのgemが有効。PythonやR版と同じCライブラリを使うため精度は同等。
- 深層学習はtorch.rb(LibTorchバインディング)でPyTorchとほぼ同じ書き味で書ける。
- Pythonで学習したモデルを使いたいだけなら、ONNX Runtimeで推論するかPyCallでPythonを直接呼ぶ。ゼロからRubyで実装し直す必要はない。
- Railsアプリに組み込む用途にはeps。ActiveRecordのデータからそのまま学習・推論できる。
結論として、Rubyでの機械学習は「Ruby単体で全部やる」より「Rubyが得意な領域はネイティブgem、重い学習はPythonやONNX経由」と割り切るのが2026年の現実的な設計になる。以下でその中身を掘り下げる。
Rubyで機械学習は現実的か:得意領域とPythonとの棲み分け
「Rubyは機械学習に向かない」という評価は半分正しく半分古い。研究やディープラーニングの最前線はPythonに集中しており、そこをRubyで置き換える理由はない。一方で、既存のRailsアプリにレコメンドや需要予測を足す、社内データで分類器を回すといった実務レベルなら、Rubyのgemだけで十分完結する。判断を誤らないために、得意・不得意を先に切り分けておく。
Rubyが得意なことと不得意なこと
得意なのは、既存のRuby/Railsコードベースと同じ言語で前処理から推論までを一気通貫できる点だ。データベース、Webアプリ、バッチ処理がすべてRubyなら、モデルの学習・推論を別言語のマイクロサービスに切り出す運用コストを省ける。逆に不得意なのは、最新の大規模モデルの実装や、論文実装の追随、GPUを酷使する大規模学習だ。ここはライブラリの層の厚さでPythonに勝てないため、無理にRubyで書き直すと保守コストだけが増える。Ruby以外の選択肢を比較検討したいなら、Rustの深層学習フレームワークを扱ったRust製DLフレームワークBurnの解説記事も判断材料になる。
Pythonとの棲み分け:作り直さず「つなぐ」
Rubyで機械学習を検討する人がまず知るべきなのは、「PythonのモデルをRubyで作り直す必要はない」ということだ。学習済みモデルをONNX形式で書き出せばONNX Runtimeで推論でき、scikit-learnやpandasの機能そのものが必要ならPyCallでPythonを直接呼び出せる。つまり選択肢は「Rubyネイティブgemで完結」「ONNXで推論だけRuby」「PyCallでPython資産を流用」の3つあり、要件に応じて混在させてよい。scikit-learn自体の位置づけはScikit-learnとは何かを解説した記事で確認できる。
2026年に現役のRuby機械学習ライブラリ地図
用途ごとに現在の推奨gemを一覧にまとめる。旧来のカタログ記事に載っていたライブラリの多くは更新が止まっているため、ここでは2026年時点でメンテナンスが継続しているものだけを挙げる。なお画像処理・自然言語処理・近似最近傍探索といった周辺領域にも専用gem(画像はruby-vips、日本語形態素解析はMeCabバインディング、類似検索はFaiss・NGTなど)があるが、本記事は機械学習を始める中核に絞って扱う。
| 用途 | 現行の推奨gem | 位置づけ |
|---|---|---|
| 数値計算・多次元配列 | Numo::NArray | NumPy相当の標準 |
| 線形代数(BLAS/LAPACK) | Numo::Linalg | 高速な行列演算 |
| データフレーム | Rover | Numo基盤・Daru代替 |
| 古典的な機械学習 | Rumale | scikit-learn風・2.x系 |
| 勾配ブースティング | XGBoost / LightGBM | 表形式データで高精度 |
| 深層学習 | torch.rb | LibTorch・PyTorch API |
| 学習済みモデルの推論 | ONNX Runtime | 他言語の学習済みを実行 |
| Python連携 | PyCall | scikitやpandasを直接利用 |
| 可視化 | Charty | 複数バックエンド対応 |
数値計算とデータ整形の土台:Numo::NArrayとRover
機械学習の前処理は行列演算とデータ整形が中心になる。この土台がNumo::NArrayで、C実装によりRubyの標準配列より桁違いに速い。データフレーム操作は、Numoを内部に持つRoverが現行の推奨だ。旧来紹介されていたDaruは更新が止まっているため、新規に選ぶ理由はない。
require 'rover'
df = Rover::DataFrame.new(
"age" => [25, 30, 35],
"salary" => [500, 600, 700]
)
puts df.mean.to_h.inspect
使うべきでない旧ライブラリ:NMatrix・Daru・Shogun
ここは検索でたどり着く古い記事との最大の違いなので、はっきり書く。以下のライブラリは2026年時点で新規採用すべきではない。
- NMatrix:開発が停止している。行列演算はNumo::NArrayに置き換える。
- Daru:活発なメンテナンスが行われていない。データフレームはRoverを使う。
- Shogunのバインディング:Ruby向けの提供が休眠状態で、環境構築が現実的でない。SVMはRumaleのrumale-svm(LIBSVM/LIBLINEARバインディング)で代替する。
- Rblearn・Statsample:更新が長く途絶えており、情報も古い。分類・回帰はRumale、統計処理はNumoベースで賄える。
古い入門記事のコマンドをそのまま実行するとインストールに失敗したり、Rubyの新しいバージョンで動かないことが多い。ライブラリ選定の時点で現役のものに絞るのが、遠回りを避ける最短ルートになる。
Rumaleによる古典的な機械学習の実装
分類・回帰・クラスタリングといった古典的な機械学習は、Rumaleで完結する。scikit-learnに影響を受けたAPIで、fitとpredictの書き味がPythonユーザーにも馴染みやすい。
インストールとgem構成の注意点
Rumaleは1.0以降、機能ごとにrumale-coreやrumale-treeなどのサブgemへ分割された。まとめて導入するには従来どおりrumaleを入れればよく、これがサブgem一式を束ねる。なお2.0以降のRumaleは、数値計算の依存としてNumo::NArrayの派生であるnumo-narray-alt(Numo::名前空間はそのままのドロップイン代替)を自動で導入するため、別途numo-narrayを入れる必要はない。
gem install rumale
gem install rumale-svm
2行目のrumale-svmはSVM(サポートベクターマシン)を使う場合に追加する。バージョンは更新が続いているため、最新は公式のRubyGemsで確認するとよい。コード例で登場するNumo::DFloatなどのAPIは、派生版でもそのまま利用できる。
分類タスクの実装例
4つの特徴量を持つデータを多クラス分類する例を示す。データを数値配列にし、モデルに渡すだけで学習と予測ができる。
require 'rumale'
require 'numo/narray'
# 学習データ(4特徴量)とラベル
samples = Numo::DFloat[[5.1, 3.5, 1.4, 0.2], [6.7, 3.1, 4.4, 1.4], [6.3, 3.3, 6.0, 2.5]]
labels = Numo::Int32[0, 1, 2]
# ロジスティック回帰で多クラス分類
model = Rumale::LinearModel::LogisticRegression.new
model.fit(samples, labels)
puts model.predict(samples).to_a.inspect
回帰とクラスタリング
同じインターフェースで回帰やクラスタリングも扱える。線形回帰で連続値を予測し、k-meansで教師なしにグループ分けする例を示す。
require 'rumale'
# 線形回帰
x = Numo::DFloat.new(50, 1).rand
y = 3 * x.flatten + 5
reg = Rumale::LinearModel::LinearRegression.new
reg.fit(x, y)
puts reg.predict(x)[0..4].to_a.inspect
# k-meansクラスタリング
km = Rumale::Clustering::KMeans.new(n_clusters: 3, random_seed: 1)
groups = km.fit_predict(Numo::DFloat.new(30, 2).rand)
puts groups.to_a.inspect
分類・回帰・クラスタリングまでを1つのライブラリで統一的に書けるため、Rubyで機械学習を始める入り口としてはRumaleから触るのが最も学習コストが低い。
勾配ブースティングと深層学習:XGBoost・LightGBM・torch.rb
Rumaleでカバーしきれない2つの領域が、実務で精度を求める勾配ブースティングと、深層学習だ。どちらもRubyから利用できるgemが整っている。
XGBoostとLightGBMによる表形式データの高精度予測
表形式(テーブル)データの予測精度では、勾配ブースティングが依然として強力だ。RubyのXGBoost・LightGBMのgemは、PythonやR版と同じCライブラリを内部で呼ぶため、精度はそのまま同等になる。LightGBMのgemは2025年も更新が続いている。仕組みの背景はGBDT(勾配ブースティング決定木)の基礎を解説した記事が詳しい。
require 'xgboost'
x_train = [[1, 2], [3, 4], [5, 6], [7, 8]]
y_train = [0, 0, 1, 1]
dtrain = XGBoost::DMatrix.new(x_train, label: y_train)
booster = XGBoost.train({ objective: 'binary:logistic' }, dtrain)
puts booster.predict(XGBoost::DMatrix.new([[2, 3]])).inspect
torch.rbによる深層学習
ディープラーニングを試したい場合はtorch.rbを使う。PyTorchのLibTorchを土台にしており、テンソル演算やレイヤー、オプティマイザの書き方がPyTorchとほぼ一致する。GPUにも対応する。PyTorch本体の概要はPyTorchとは何かを解説した記事を参照するとRubyとの対応が掴みやすい。
require 'torch'
# テンソル演算はPyTorchと同じ書き味
x = Torch.tensor([[1.0, 2.0], [3.0, 4.0]])
w = Torch.randn(2, 1)
puts x.matmul(w).to_a.inspect
ただしtorch.rbはネイティブ拡張のビルドに数分かかり、Windowsは未対応だ。最新モデルの実装をそのまま追う用途ではPython版に一日の長があるため、「既存のRubyアプリに軽い深層学習を足す」用途に向く。
学習済みモデルの利用とRailsへの組み込み
Rubyで機械学習を導入する現場で最も多いのは、実はゼロから学習させるより「他で作ったモデルを使う」「既存のRailsアプリに予測を足す」ケースだ。この2つを最短で実現する手段を押さえておく。
ONNX Runtimeによる他言語の学習済みモデルの推論
Pythonやその他の環境で学習したモデルをONNX形式で書き出せば、RubyのONNX Runtimeで推論だけを実行できる。学習は使い慣れた環境で行い、本番の推論はRubyアプリに載せる、という分担がきれいに決まる。
require 'onnxruntime'
# 別環境で学習しONNX形式に変換したモデルを読み込む
model = OnnxRuntime::Model.new('model.onnx')
result = model.predict('input' => [[5.1, 3.5, 1.4, 0.2]])
puts result.inspect
PyCallによるPython資産の直接利用
scikit-learnやpandasの機能そのものが欲しいときは、PyCallでPythonを直接呼び出せる。Rubyの配列をそのままPython側に渡せるため、Ruby中心のコードにPythonの機械学習資産を差し込める。Pythonの実行環境が別途必要になる点だけ注意する。
require 'pycall/import'
include PyCall::Import
pyimport 'sklearn.linear_model', as: 'lm'
model = lm.LogisticRegression.new
model.fit([[0], [1], [2], [3]], [0, 0, 1, 1])
puts model.predict([[2]]).to_a.inspect
eps:Railsアプリへの組み込み
ActiveRecordで扱っているデータからそのまま学習・推論したいなら、epsが手軽だ。ハッシュの配列やActiveRecordのレコードを渡すだけで回帰・分類が動き、学習済みモデルをコードとして書き出して本番に載せられる。小さな需要予測やスコアリングをRailsに足す用途に向く。
require 'eps'
data = [
{ bedrooms: 1, price: 100000 },
{ bedrooms: 2, price: 125000 },
{ bedrooms: 3, price: 155000 }
]
model = Eps::Model.new(data, target: :price)
puts model.predict(bedrooms: 2)
このように、Rubyでの機械学習は「学習はどこで行い、推論をどこに載せるか」を先に決めると、必要なgemが自ずと定まる。
よくある質問
Rubyは機械学習に本当に向いていますか?
研究や大規模な深層学習の最前線はPythonが適しており、そこをRubyに置き換える理由はありません。一方、既存のRubyやRailsのアプリに分類・回帰・レコメンドなどを足す実務用途では、Rumaleやtorch.rbなどのgemで十分完結します。用途を絞れば十分実用的です。
RubyとPythonのどちらで機械学習を学ぶべきですか?
これから機械学習そのものを体系的に学ぶならPythonが無難です。教材・ライブラリ・情報量が圧倒的に多いためです。すでにRuby/Railsで開発していて、そのアプリに機械学習機能を組み込みたいのであれば、同じ言語で完結できるRubyから始める価値があります。目的が「学習」か「既存アプリへの組み込み」かで選ぶとよいでしょう。
Rubyで深層学習(ディープラーニング)はできますか?
できます。torch.rbがPyTorchのLibTorchを土台にしており、テンソル演算やニューラルネットワークの構築がPyTorchとほぼ同じ書き方で行えます。GPUにも対応します。ただしネイティブ拡張のビルドに時間がかかり、Windowsは未対応のため、環境面はPython版より制約があります。
PythonのscikitやPyTorchで学習したモデルをRubyで使えますか?
使えます。モデルをONNX形式で書き出せば、RubyのONNX Runtimeで推論を実行できます。学習は使い慣れたPython環境で行い、本番の推論だけをRubyアプリに載せる構成が一般的です。scikit-learnやpandasの機能そのものが必要なら、PyCallでPythonを直接呼び出す方法もあります。
NMatrixやDaru、Shogunのgemはまだ使えますか?
新規採用は避けるべきです。NMatrixは開発が停止し、Daruは活発なメンテナンスが行われておらず、ShogunのRubyバインディングも休眠状態です。行列演算はNumo::NArray、データフレームはRover、SVMはrumale-svmへ置き換えてください。古い入門記事のコマンドをそのまま使うとインストールで詰まることが多いです。