ディープラーニングを、世界一簡単に実装する方法を見つけましたのでご報告します。

ディープラーニングとは

ニューラルネットワークというアルゴリズムがあり、『入力層』・『中間層』・『出力層』の3つに分かれるのですが、このうち『中間層』を多層化したものをディープラーニングと呼びます。機械学習のアルゴリズムの一つです。

ディープラーニングの得意分野

画像認識分野で非常に高い性能を発揮します。理由は、畳み込みニューラルネットワークとReLU関数です。畳み込みニューラルネットワークにより、画像の特徴を適切に捉えることが出来るようになりました。ReLU関数では、誤差逆伝播法で微分が1になることから、勾配が消えなくなるという問題を解決しました。またそもそも計算量が低いため、活性化関数として非常に利用されています。

音声認識分野でも、音声の「あ」とか「い」とかの波形があるのですが、その波形を画像と見立て分類することで、素晴らしい性能を発揮しています。

ディープラーニングは特徴量設計がいらない

ディープラーニングが流行った理由は、特徴量を自動抽出できるからです。従来の機械学習のアルゴリズムでは、人間がデータから特徴量の設計を行わなければいけませんでした。特徴量設計には、業務スキルと機械学習のスキルが求められ、1カ月くらい時間がかかります。この作業がゼロになったため、ディープラーニングはすごいという事になりました。

ただ、ディープラーニングの精度が他のアルゴリズムに優れているかどうかはまた別問題です。以前マーケティングデータ3000件を使った分類問題で、アルゴリズム別の比較実験をしましたが、決定木に精度で負けてました。データ量がせめて5000件はないとディープラーニングはまともな精度が出てきません。

まあそのうちディープラーニングのアルゴリズムも改良されて、少数データで画像分類以外でも性能が出てくるようになります。データサイエンティストがいらなくなる未来が、すぐそこまで来ています(やばいです)。

Scikit-learnでディープラーニングを実装する

たった12行で、その人がニートかどうかを判別するディープラーニングを実装できました。Scikit-learnのMLPClassifierを利用しています。実際のコードは以下の通りです。
#scikit-learnから必要な関数をインポート
import numpy as np
from sklearn.neural_networkimport MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.metrics import confusion_matrix

#データの読み込み
data = np.loadtxt("neet.csv",delimiter=",", skiprows=1)

#特徴量データをXに、教師データをyに格納
X = data[:, 0:-1]
y = data[:, -1]

#学習データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

#ニューラルネットワークで学習と評価 
clf = MLPClassifier()
print cross_val_score(clf, X_train, y_train, cx=10)

#混合行列で評価
y_predict = clf.predirct(X_train)
print confusion_matrix(y_train, y_predict)

scikit-learnが最強すぎて泣けてきます。GPUには対応していませんが、ちょっと事前検証するにはもってこいのライブラリです。
ちなみに上記のコードでは、あまり精度が出ませんでした。理由はパラメーターをデフォルトのままだからです。ニューラルネットのモデルは、デフォルトの隠れ層の数1、ノード数100を設定しています。本当はいろいろ試して、最も良さそうなモデルを探す必要があります。

なのでグリッドサーチで探してみました。グリッドサーチは、総当たりでパラメータを探し、最も精度の高かったパラメータを教えてくれます。
from sklearn import grid_search

#ニューラルネットワークの隠れ層の候補をいろいろ定義
parameters = {'hidden_layer_sizes' : [(100,), (100, 10), (100, 100, 10), (100, 100, 100, 10)]}

#ニューラルネットワークのベストな隠れ層を探索
clf = grid_seatch.GridSearchCV(MLPClassifier(), parameters)
clf.fit(X_train, y_train)
clf.best_params_

手元のデータでは、隠れ層が3層の時に、最も精度が高いと出力されました。必ずしも層の数を増やすと精度が上がるわけではありません。ディープラーニングは表現力が高いため、教師データの数が少なすぎると、過学習が発生して精度が下がることがよく起きます。

参考記事:これだけは知っておけ!PythonでAI開発の基礎まとめ

これからディープラーニングを実装する人へ

最後にディープラーニングを動かして思う事を、つらつら書いていきます。

・教師データが1万件を超えてくると精度が高くなってくる。
・教師データが少ないと、非常に精度が低くなる。分類問題で55%の精度とか普通にある。
・特徴量の数を変えて実験したときに、精度が安定しない。SVMやランダムフォレストはやはり安定感あるので、実務ではこっちを使いたくなる。
・ディープラーニングは中のモデルがブラックボックスになるので、結果に対して説明できないのは辛い。
・ディープラーニングはパラメータの数が多すぎ。潤沢な分析環境は必須。
・画像と音声データ以外でのディープラーニングの活用は少し早い印象。自然言語は今年中に実用化レベルに到達しそう。
・構造データの分類は、これまでの機械学習アルゴリズムの方が精度は高くなることが多い。



現場からは以上です。