Pandas.DataFrameをKerasにそのままぶちこんでませんか??

この記事はKerasを使い始めて間も無い人のために役立つ記事です。

この記事の要約(忙しい人向け)

Kerasにpandas.DataFrameをつっこんではいけない。

numpy.ndarrayに変換する必要がある。

導入

まずKerasとは何なのか?

からちょこっと書きます。

Kerasは、Pythonで書かれた、TensorFlowまたはTheano上で実行可能な高水準のニューラルネットワークライブラリです。 Kerasは、迅速な実験を可能にすることに重点を置いて開発されました。 可能な限り遅れなくアイデアから結果に進められることは、良い研究をする上で重要です。 (引用元:https://keras.io/ja/)

また、このサイトではKerasの良い点として以下の4点を挙げています。

  • 簡単で早くプロトタイプ作成が可能 (全体的なモジュール性、ミニマリズム、および拡張性による)
  • CNNとRNNの両方、およびこれらの2つの組み合わせをサポート
  • 任意の接続方式 (複数入力および複数出力の学習を含む) をサポート
  • CPUとGPUでシームレスな実行

なんだかよく分からないけど、kerasはすごいらしい。

それに、日本ではChainner(スペル合ってる?)が流行っているらしいけど、

Kaggleのフォーラムを見ているかぎり、グローバルスタンダードなのはkerasなのかな

と思った。

それに実際ChainnerよりKerasの方が使いやすいって言っている人もいる。

ということで、僕はKerasを使い始めました。

本題

いざKerasで深層学習をしようと思い、csvファイルからデータをpandasで読み込みました。

下が一連のコード

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import RMSprop
from keras.callbacks import EarlyStopping
import pandas as pd
from sklearn.model_selection import train_test_split

batch_size = 39
nb_epoch = 100

if __name__ == '__main__':
    df = pd.read_csv('hoge.csv')
    df.columns = ['v1','v2','v3','t1','t2','t3','h1','h2','a1','a2','a3','loss']
    X = df.loc[:,'v1':'a3']
    y = df['loss']
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    # building the model
    print('building the model ...')

    model = Sequential()

    model.add(Dense(22, input_shape=(11,)))
    model.add(Activation('relu'))
    model.add(Dropout(0.2))

    model.add(Dense(11))
    model.add(Activation('relu'))
    model.add(Dropout(0.2))

    model.add(Dense(1))

    rms = RMSprop()
    model.compile(loss='mean_absolute_error',
                  optimizer=rms,
                  metrics=['accuracy'])

    # early stopping
    early_stopping = EarlyStopping(monitor='val_loss', patience=0)

    # training
    hist = model.fit(X_train, y_train,
                     batch_size=batch_size,
                     verbose=1,
                     nb_epoch=nb_epoch,
                     validation_split=0.1,
                     callbacks=[early_stopping])

人工知能に関する断創録 – 深層学習ライブラリ Keras様のソースコードを参考にさせていただきましたm(_ _)m)

しかし・・・

このコードではエラーが出てしまい、分析できません。

参考にしたコードでエラーは出なかったので、僕が独自で書き換えた部分が悪さをしているようです。

エラーの内容は以下のよう。

Traceback (most recent call last):
  File "/Users/Pikachu/Documents/workspace/Python/DeepLearning/DL.py", line 58, in <module>
    callbacks=[early_stopping])
  File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/keras/models.py", line 627, in fit
    sample_weight=sample_weight)
  File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/keras/engine/training.py", line 1124, in fit
    callback_metrics=callback_metrics)
  File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/keras/engine/training.py", line 831, in _fit_loop
    ins_batch = slice_X(ins[:-1], batch_ids) + [ins[-1]]
  File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/keras/engine/training.py", line 313, in slice_X
    return [x[start] for x in X]
  File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/pandas/core/frame.py", line 2053, in __getitem__
    return self._getitem_array(key)
  File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/pandas/core/frame.py", line 2098, in _getitem_array
    return self.take(indexer, axis=1, convert=True)
  File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/pandas/core/generic.py", line 1669, in take
    convert=True, verify=True)
  File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/pandas/core/internals.py", line 3953, in take
    indexer = maybe_convert_indices(indexer, n)
  File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/pandas/core/indexing.py", line 1872, in maybe_convert_indices
    raise IndexError("indices are out-of-bounds")
IndexError: indices are out-of-bounds

indices are out-of-boundsでぐぐってみると、同様なエラーで悩んでいる人が見つかりました。

Keras IndexError: indices are out-of-bounds

つまり、上のコードではだめで、

どうすればいいのかというと

#悪い例
X = df.loc[:,'v1':'a3']

のようにDataFrameをそのまま入力データに使っていたところを、

#正しい例
X = df.loc[:,'v1':'a3'].values

のように、numpy.ndarrayに変換しなくてはならないのでした。※

最後に

Kerasの日本ユーザーは少ないんでしょうか・・?

Kerasについての日本語のブログが少ない気がしました。

もっとKerasユーザーが増えるといいですね。

お疲れ様した。


※ちなみにyについては、pandas.Seriesのままつっこんでも正常に動作しました。