Deep Learning というよりは、Keras の使い方を説明するため、単層のニューラルネットであるロジスティック回帰をKerasで実装してみます。

題材として、IMDB映画レビュー感情分類をロジスティック回帰でモデル化します。IMDB映画レビュー感情分類とは、感情(肯定/否定)のラベル付けをされた,25,000のIMDB映画レビューのデータセットです(https://keras.io/ja/datasets/

まずは、データを取得し、pathにpickleオブジェクトとして保存しつつ、以下のデータを用意します。

train_future:モデル作成用説明変数
train_label :モデル作成用目的変数
test_future :検証用説明変数
test_future :検証用目的変数

目的変数のデータには、肯定的な意見か否定的な意見か、0/1で表すデータが入ります。説明変数のデータには、出現頻度の高いTOP20の単語を除外して(skip_top=20)、頻度の高い500位(num_words=500)までの単語のレビューのシーケンスデータが入ります。シーケンスデータなので、文書の流れがわかるデータとなり、時系列のモデルを作成するときに使えると考えられます。

今回は、ロジスティック回帰で簡単なモデルを作成するので、シーケンスデータを単純に要素の有無で表すデータに加工します。

<code>
from keras.datasets import imdb

# データロード
(train_seq_future, train_label), (test_seq_future, test_label) = imdb.load_data(path=”imdb_full.pkl”, num_words=500, skip_top=20, maxlen=None, seed=113, start_char=1, oov_char=2, index_from=3)

# フラグデータ作成
train_future_list=list()
for seq_data in train_seq_future:
train_future=[0 for x in range(0,500)]
for data in seq_data:
train_future[data]=1
train_future_list.append(train_future)
test_future_list=list()
for seq_data in test_seq_future:
test_future=[0 for x in range(0,500)]
for data in seq_data:
test_future[data]=1
test_future_list.append(test_future)

# 学習データ作成
train_future=np.array(train_future_list)
test_future=np.array(test_future_list)
</code>

次にモデルの作成を行います。

ロジスティック回帰を行うため、平均0、分散1にあらかじめ変換しておきます。入力は500変数(500次元)なので、input_shape に500を指定します。あとは、ロジスティック回帰を行うため、活性化関数をsigmoid、最適化方法をadam、評価関数をbinary_crossentropyに指定します。metricsは評価する際に精度(accuracy)を出力するオプションです。

<code>
from sklearn import preprocessing
from keras.models import Sequential
from keras.layers.core import Dense, Activation

# 正規化
train_future = preprocessing.scale(train_future)
test_future = preprocessing.scale(test_future)

# モデル作成
model = Sequential()
model.add(Dense(1, input_shape=(500, )))
model.add(Activation(‘sigmoid’))
model.compile(optimizer=’adam’, loss=’binary_crossentropy’, metrics=[‘accuracy’])
</code>

最後に学習を行います。1000枚ずつ学習して、すべてのデータを50回に渡り学習するまで継続します。

<code>
model.fit(train_future, train_label, nb_epoch=50, batch_size=1000, verbose=1)
</code>

数秒で学習が終わります。結果、おおよそ84%の精度のモデルができました。ものすごく単純なモデルなので、この程度ということでしょう。データの表し方を変える(今は500個の単語の有無:0/1しか見ていない)ことや、シーケンシャルなモデルで対応すると精度が向上すると思われます。評価は以下の関数で簡単に確認出来ます。

<code>
from sklearn import metrics

# 精度
loss_and_metrics = model.evaluate(test_future,test_label)
print(“¥n loss:{0} accuracy:{1}”.format(loss_and_metrics[0],loss_and_metrics[1]))

# F値
test_pred=np.round(model.predict(test_future))
print(metrics.confusion_matrix(test_label, test_pred))
print(metrics.classification_report(test_label, test_pred))
</code>

ロジスティック回帰も非常にコンパクトにモデルを記述できることがわかります。(一番面倒くさいコードはデータ加工であることが一目瞭然。)

次回は、いよいよニューラルネットを構築します。(Sho.)