Rust の機械学習ライブラリ smartcore に入門してみた。
はじめに
たまには Rust も書きます。機械学習に興味があり、興味があれば何でも触ります。
smartcore とは
とある Rust の機械学習に詳しい人に、最近の Rust の機械学習ライブラリのデファクトぽいのを聞いたところ、丁寧に linfa か smartcore を教えて貰いました。はじめに linfa を試したのですが、うまく行きませんでした。僕は Rust の toolchain で gnu(mingw) を使う派なのですが、linfa は Intel MKL をリンクする必要があり、Intel MKL は MSVC 形式のライブラリしか提供していません。DLL から .a
を生成してリンクしてみたりもしましたが、結局うまくリンクできず諦めてしまいました。MSVC の toolchain や他の OS(Linux) だと問題なく動くんだと思います。
しかたなく、残りの smartcore を試す事にしました。
smartcore は Pure Rust で書かれた機械学習ライブラリです。リンクで失敗する事もありません。ちょっと触ってみた所、sklearn 色が濃く、sklearn を触った事がある方ならば「sklearn で言う所のアレ」はだいたい smartcore にもあります。
サンプル
データセットも用意されているのですぐに触り始められます。試しにサンプルを書いてみました。
use smartcore::dataset::iris;
use smartcore::linalg::naive::dense_matrix::DenseMatrix;
use smartcore::linear::logistic_regression::LogisticRegression;
use smartcore::model_selection::train_test_split;
use smartcore::metrics::mean_absolute_error;
fn main() {
let iris_data = iris::load_dataset();
let x = DenseMatrix::from_array(
iris_data.num_samples,
iris_data.num_features,
&iris_data.data,
);
let y = iris_data.target;
let (x_train, x_test, y_train, y_test) = train_test_split(&x, &y, 0.2, true);
let reg = LogisticRegression::fit(
&x_train,
&y_train,
Default::default(),
).unwrap();
let result = reg.predict(&x_test).unwrap();
assert!(mean_absolute_error(&y_test, &result) < 0.2);
}
Rust を随分触っていなかったのでリハビリに時間が掛かりましたが、ひとまず動く所まで書けました。
おわりに
Pure Rust で書かれた機械学習ライブラリ smartcore を触ってみました。LogisticRegression の様な線形回帰だけでなく KNN や K-Means といった類似探索、サポートベクターマシン、などなど一通り揃っています。1点、GPU アクセラレータが実装されていませんが、小規模な機械学習であれば困らない程度に便利だと思いました。適当に試せる様にコード置いておきます。
Discussion