mnistをDataRobotに解かせてみる

DataRobotってどうなのよ

DataRobotを触れる機械があったので触ってみた。

画像は扱えない、とのことだったけれども、

画像を画像として扱うからであって、

それぞれのピクセルの輝度を列展開して、

輝度表にしてやればできないことはないだろ…ってのを、

無理やりやってみた。

結果から言うと、悪くない。

Datarobot Third Edition

Datarobot Third Edition

データ準備

あまり大きいデータは辛いので28*28のライトなあのデータを使いました。

そうですね、mnistですね。

udemy.benesse.co.jp

リンクを開くのがめんどい人のために一行で説明すると、

手書きで書かれた数字の判別に使われるデータセットです。

ご存知の通りDLはこちらから。

yann.lecun.com

手動で解凍するも、いらないバイトがある、とのことなので、↓

qiita.com

ちょこっと改変してこんな感じでCSV化。

import numpy as np

def load_img(file_name):
    with open(file_name, 'rb') as f:
        data = np.frombuffer(f.read(), np.uint8, offset=16)
    data = data.reshape(-1, 784)
    return data

def load_label(file_name):
    with open(file_name, 'rb') as f:
        labels = np.frombuffer(f.read(), np.uint8, offset=8)
    return labels

train_x = load_img("./train-images.idx3-ubyte")
test_x = load_img("./t10k-images.idx3-ubyte")
train_y = load_label("./train-labels.idx1-ubyte")
test_y = load_label("./t10k-labels.idx1-ubyte")

np.savetxt("train_x.csv",train_x,delimiter=",")
np.savetxt("train_y.csv",train_y,delimiter=",")
np.savetxt("test_x.csv",test_x,delimiter=",")
np.savetxt("test_y.csv",test_y,delimiter=",")

さて、これで1行1画像784カラムに展開したcsvがtrain_x,test_xに、

それぞれのラベルがtrain_y,test_yに出来たので、

trainデータをdatarobotに食わせました。

結果

リーダボード(某kaggleを意識してますね)にはこんな感じで表示。

f:id:kazuhitogo:20190408111126p:plain

ホールドアウトを外して60000枚すべてで学習した時の絵ですが、 Log Lossで0.07弱は…まぁそれなりですね。

表示されているBlender(アンサンブルのことをDataRobotではBlenderというらしい…)を除いた、 LightGBMとXGBoostでtest_xを予測してみたところ、

XGBoost:

正答:9816 誤答:184 acc:98.16%

LightGBM:

正答:9815 誤答:185 acc:98.15%

でした。

わずか(0.01%というか1問というか)ながらXGBoostが勝ちましたが、

データセットを変えたら違う結果が出るだろうし間違いなく誤差でしょう。

性能としてはコサイン類似度を使ったK近傍法と同レベルではありますね…。

一つ不満があるとすれば、

DataRobotは自動で最適と思われるモデルを選んでくれるはずなのに、

XGBoostは私が手動で突っ込んだモデルだ、ということでしょうか。

(XGBoostをやらないという選択肢が基本的に私にはないのですが)

考察

さて、DataRobotには特徴量を自動で選択してくれる機能があるので、それを見てみる。

↓がDataRobotが有用と判断したピクセルである。

f:id:kazuhitogo:20190408112151p:plain

595の変数を有用と判断したようです。 (596と表示されていますが実際はLabelがあるので595)

ただここに書かれているXXXpxだけだとどこを見ているのかわからないので、 採用されたピクセル箇所をヒートマップにしてみました。

f:id:kazuhitogo:20190408114426p:plain

上下の端っこが使われないのはたぶん文字が書かれていなから、だとしても、

右上から左下にかけて、斜めに全く使われないのはなんでなんですかね。

ここに文字が書かれていない、ということはないので、 すべて塗りつぶされていて判別に使えない…?

右利きの人が多いのでその特徴…?

そんなこともないか…?

わかりませんが、DataRobotさん的には使えないと判断したようです。

逆に左端右端はがっつり使えるようですね。

また、どの特徴量が一番使えたか、もDataRobotは見ることができます。

f:id:kazuhitogo:20190408114946p:plain

一番使えたピクセルを100%としてそれを相対的にどれくらい使えたか、をプロットしているもので、

212pxだけで判別できる、という意味ではありません。

ところで212pxってどこなんでしょう。

あたりが気になるのでトップ5をプロットしてみました。

色が濃い順です。

f:id:kazuhitogo:20190408115352p:plain

ここらへんのピクセルに数字判別の特徴が出るっぽいですね。

知らんけど。

間違えた例

さて、間違えた例も一個くらい見ておきましょう

4を6と間違えた例

f:id:kazuhitogo:20190408120331p:plain

うーん、畳み込みで形を覚えているわけではなく、

ピクセルの輝度の決定木がベースなので、6が書かれているところに4が乗っちゃった感じですね。

きっと。

7を2と間違えた例

f:id:kazuhitogo:20190408120543p:plain

これは人間でも間違える…。

最後に

DataRobotを嫌うData Scientistは多いですが、

個人的にはその問題が機械学習で解けるか、

を手早く知るツールとしては優秀なのではないでしょうか。

今回は画像だったので、当然CNNを使えばもっとよい性能は出ますし、

チューニングの余地もあるかとは思いますが、

仕事をAIで…の文脈だと、出来る出来ないの判断は簡単にすぐにしてくれる、

という意味では、

個人的には良いツールかな、と思います。

(全モデルの学習時間半日程度)

現場で使える!TensorFlow開発入門 Kerasによる深層学習モデル構築手法

現場で使える!TensorFlow開発入門 Kerasによる深層学習モデル構築手法