第19回 Machine Learning 15minutes!で発表した資料の補足

第19回 Machine Learning 15minutes!のイベントに「低い判定精度でも業務改善できた事例紹介」という内容で登壇させていただきました。
業務への活用事例や、最新の技術など参考になることも多く、また懇親会では機械学習に関して色んな方とお話させて頂く事ができ、とても刺激になりました。

今回の発表の際に精度60%から94%に改善した内容について、軽く流してしまったたため補足したいと思います。

どんな内容で発表したか

どのようなモデルで分析をしたか

よく手書き文字認識(MINST)で99%の精度などの記事があります。

keras/mnist_mlp.py at master · keras-team/keras · GitHub

上記を実行した結果

Test loss: 0.0311189933416
Test accuracy: 0.9896 ← 約99%の精度が出ている

これと同様に転職意欲を分類すると60%(accuracy=0.6004)の精度しか出ませんでした。
実際のソースコードはお見せ出来ないため、サンプルとしてよく使われるMNISTを例に説明します。

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax'))

上記のソースコードでnum_classesの箇所が、今回は2になります。
つまり転職意欲が高い or 低いの2パターンに分類します。

ここでaccuracyを高めるためにデータクレンジングや、モデルを工夫しましたが劇的に改善することはありませんでした。

予測結果を一覧で並べてみる

そこで予測結果に着目しました。
以下のコードは、各数字の分類確度と学習時の解を並べたものを表示します。
※引き続きMINSTのソースで実行

import pandas as pd
import numpy as np

classes = model.predict_proba([x_test])
df = pd.DataFrame(classes)
df = df.applymap(lambda x: "{}%".format(round(x * 100)))

df_y = pd.DataFrame(y_test).applymap(lambda x: "●" if x == 1 else "")

pd.concat([df, df_y], keys=['作成した分析モデルで求めた確率', '学習で利用した解'], axis=1)

【結果】
f:id:masakiz_blog:20171216210158p:plain

ここで8行目の5=99%、6=1%という数字ですが、これは5になる確率が99%、6になる確率が1%と見ることができます。
5に●がついており予測結果と学習で利用したデータが一致していることも分かります。
MINSTではほぼすべて正しく判定されています。

同じことを転職意欲判定に適用すると

MINSTでは99%の精度を誇る学習モデルのため、殆どが100%になりますが、 今回の転職意欲判定では以下のような結果になりました。

高いと予測した確度 低いと予測した確度 学習データ(高い) 学習データ(低い) 正しく判定されたか?
98% 2% OK
97% 3% NG
96% 4% OK
96% 4% NG
3% 97% OK
2% 98% OK
1% 99% OK
1% 99% OK

ここでデータを並べて正しく判定されたかどうかみると、下の方の「転職意欲が低い」と判定した部分の結果が非常に良いことがわかります。
NGが一つもありません。

そこで機械学習の結果のうち下位数%の絞って予測結果を使うことで、94%という高い精度の判定に成功しました。

全体の精度を見ると低いかもしれませんが、正しく判定される可能性が高い部分に絞って利用することで活用できる事例を紹介させていただきました。