Rubix ML のサンプルプロジェクトを試す
Rubix ML のサンプルプロジェクトを一通り実行してみました。実行結果を報告します。
rubixml.com
Rubix ML は PHP で実装された機械学習、深層学習ライブラリです。分類、回帰、クラスタリングなどの機能が提供されています。また、ライブラリ本体とは別に、チュートリアルとして以下の 8 種類のサンプルプロジェクトが用意されています。
- CIFAR-10 Image Recognizer
- Color Clusterer
- Credit Default Risk Predictor
- Human Activity Recognizer
- Housing Price Predictor
- Iris Flower Classifier
- MNIST Handwritten Digit Recognizer
- Text Sentiment Analyzer
今回は、これらのサンプルプロジェクトをウェブサイトの説明に沿って実行しました。いくつかのプログラムは実行に大きなリソースを必要とするため、AWS の t3.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 画像でした。混同行列を以下に示します。

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% だったことになります。