🦀

Rust の機械学習ライブラリ smartcore に入門してみた。

2021/07/10に公開

はじめに

たまには Rust も書きます。機械学習に興味があり、興味があれば何でも触ります。

smartcore とは

https://twitter.com/vaaaaanquish/status/1411682015569539074

とある Rust の機械学習に詳しい人に、最近の Rust の機械学習ライブラリのデファクトぽいのを聞いたところ、丁寧に linfa か smartcore を教えて貰いました。はじめに linfa を試したのですが、うまく行きませんでした。僕は Rust の toolchain で gnu(mingw) を使う派なのですが、linfa は Intel MKL をリンクする必要があり、Intel MKL は MSVC 形式のライブラリしか提供していません。DLL から .a を生成してリンクしてみたりもしましたが、結局うまくリンクできず諦めてしまいました。MSVC の toolchain や他の OS(Linux) だと問題なく動くんだと思います。

しかたなく、残りの smartcore を試す事にしました。

https://smartcorelib.org/

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 アクセラレータが実装されていませんが、小規模な機械学習であれば困らない程度に便利だと思いました。適当に試せる様にコード置いておきます。

https://github.com/mattn/smartcore-example/

Discussion