y_uti のブログ

統計、機械学習、自然言語処理などに興味を持つエンジニアの技術ブログです

Rubix ML のサンプルプロジェクトを試す

Rubix ML のサンプルプロジェクトを一通り実行してみました。実行結果を報告します。
rubixml.com

Rubix ML は PHP で実装された機械学習、深層学習ライブラリです。分類、回帰、クラスタリングなどの機能が提供されています。また、ライブラリ本体とは別に、チュートリアルとして以下の 8 種類のサンプルプロジェクトが用意されています。

今回は、これらのサンプルプロジェクトをウェブサイトの説明に沿って実行しました。いくつかのプログラムは実行に大きなリソースを必要とするため、AWSt3.xlarge インスタンスを利用しました。実行環境を以下にまとめます。PHP のインストールには php-build を利用しました*1。ビルド時のオプションは php-build の既定の設定を利用しましたが、インストール後に Xdebug を無効にしています*2

インスタンスタイプ
Amazon EC2 T3 (t3.xlarge)
AMI
Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - ami-07d0cf3af28718ef8 (64 ビット x86)
CPU
Intel(R) Xeon(R) Platinum 8175M CPU @ 2.50GHz
メモリ
16235624 kB
OS
Ubuntu 18.04.2 LTS (Bionic Beaver)
PHP
PHP 7.3.9 (NTS)

実行方法は、各サンプルプロジェクトに用意されている PHP ファイルを実行するだけです。実行時には -dopcache.enable_cli=1 オプションを指定して OPcache を有効にしました。

各サンプルプロジェクトで学習 (train.php の実行) に要した時間、メモリ使用量は次のとおりでした。所要時間はログの各行に記録されたタイムスタンプから計算、メモリ使用量は top コマンドを用いて目視で確認しました。

プロジェクト 所要時間 メモリ使用量
CIFAR-10 約 46 時間 30 分 (3 時間 / epoch) 6 GB 弱
Colors 1 秒以内 (確認せず)
Credit 約 10 秒 (確認せず)
HAR 約 30 秒 (確認せず)
Housing 約 15 秒 (確認せず)
Iris 不明*3 (1 秒以内) (確認せず)
MNIST 約 6 時間 15 分 (22 分 / epoch) 2 GB 強
Sentiment 約 13 時間 15 分 (72 分 / epoch) 約 14 GB

以下では、サンプルプロジェクトのうち CIFAR-10 と Housing について、プログラムの実行結果を簡単に記載します。

CIFAR-10 Image Recognizer

CIFAR-10 を題材とした画像認識です。CIFAR-10 は 32x32 のカラー画像 60,000 枚からなるデータセットで、各画像は airplane, dog など 10 種類の物体のいずれか一つを表します。train.php はデータセットのうち 50,000 枚を用いてモデルを学習します。validate.php は残りの 10,000 枚それぞれが 10 種類のうち何を表す画像であるかを判別します。

validate.php を実行すると次の結果が得られました。JSON 配列の第一要素は MulticlassBreakdown の出力、第二要素は ConfusionMatrix の出力です。

[
    {
        "overall": {
            "accuracy": 0.8498554496114641,
            "precision": 0.5482694710277249,
            "recall": 0.5285,
            ...
        },
        "label": {
            "cat": {
                "accuracy": 0.8081039755351682,
                "precision": 0.3716012084592145,
                "recall": 0.369,
                ...
            },
            ...
        }
    },
    {
        "cat": {
            "cat": 369,
            "dog": 245,
            "airplane": 20,
            ...
        },
        ...
    }
]

全体で 10,000 画像のうち正解したものは 5,285 画像でした。混同行列を以下に示します。
f:id:y_uti:20190914074136p:plain

Housing Price Predictor

Kaggle の練習問題である House Prices: Advanced Regression Techniques を題材とした住宅価格予測です。学習データは敷地面積や築年数など 79 個の属性と住宅価格を持つテーブル形式のデータです。train.php では、これら 79 個の属性から住宅価格を予測するモデルを学習します。テストデータは学習データと同じ 79 個の属性を持ちますが住宅価格は不明です。predict.php では、テストデータの各レコードの属性に基づいて住宅価格を予測します。

predict.php を実行すると次の結果が得られました。第一列がテストデータの番号、第二列が予測された住宅価格で、このまま Kaggle に提出できる形式になっています。

Id,SalePrice
1461,140406.79825495
1462,157555.50978262
1463,182278.83532
1464,168701.85304667
1465,205670.36912191
1466,172944.76554544
1467,162045.98730413
1468,157551.28497877
1469,186533.89001586
1470,122709.93752079
...

得られた結果を実際に Kaggle に提出したところ、スコアは 0.14765 で順位は 4,490 人中 2,799 位でした*4。スコアは標準二乗対数誤差で、値が小さいほど良い予測であることを意味します。今回の結果は exp(0.14765) = 1.159 なので、相対誤差の平均が概ね 15.9% だったことになります。

*1:正確には anyenv, phpenv を介して php-build を利用しています。

*2:PHP のインストールディレクトリ配下にある etc/conf.d/xdebug.ini を mv して、PHP の起動時に拡張モジュールがロードされないようにしています。

*3:Iris はログが出力されないため所要時間を計算できませんでしたが、実行は一瞬で終了しました。

*4:この記事を書いている時点での順位です。提出が増えるたびに順位は変動します。