web-dev-qa-db-ja.com

LSTMの入力として、ベクトル内の数値とカテゴリ値を組み合わせる方法は?

import pandas as pd
import numpy as np

rands = np.random.random(7)
days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
dates = pd.date_range('2018-01-01', '2018-01-07')

df = pd.DataFrame({'date': dates, 'days': days, 'y': rands})

df_days_onehot = pd.get_dummies(df.days)[days]
df[days] = df_days_onehot
df['target'] = df.y.shift(-1)

df.drop('days', axis=1, inplace=True)
df.set_index('date', inplace=True)

X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values

上記のコード例を共有しました。私の質問は、LSTMの入力として数値変数とカテゴリ変数をどのように組み合わせる必要があるかということです。

入力ベクトルはどのようにすべきですか?

  1. [0.123、0、1、0、0 ...](コードのXのように)dim =(1,8)のようにする必要がありますか?
  2. [0.123、[0、1、0、0 ...]] dim(1,2)のようになります
  3. または、ANNやRNNなどに入力を渡す特定の方法/方法はありますか?もしそうなら、それは何ですか、そしてなぜそれ/それら(賛否両論)を使用する必要がありますか?

埋め込みについて読んだのですが、これらすべての背後にあるロジックを学びたかったので、説明だけでは不十分なようです。

このようなもの...

model = Sequential()
model.add(LSTM(64, batch_input_shape=(batch_size, look_back, 1), stateful=True, return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(32, batch_input_shape=(batch_size, look_back, 1), stateful=True))
model.add(Dropout(0.3))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer=adam)
model.fit(trainX, trainY, epochs=100, batch_size=batch_size, verbose=2, shuffle=False)

ガイダンス、リンク、説明、またはヘルプが適用されます...良い一日を。

8
TheDarkKnight

一般にさまざまな範囲の入力(正規化など)を処理するときに確認できるさまざまな前処理があります。 1つのホットな表現は、カテゴリを表現するための良い方法です。

埋め込みは、カテゴリ要素が多すぎて1つのホットエンコーディングが非常に大きくなる場合に使用されます。それらは、与えられた入力をエンコードするベクトル表現(潜在的にトレーニング可能)を提供します。以下のリンクでそれらについてもっと読むことができます。埋め込みの使用は、NLPでは非常に一般的です。

https://towardsdatascience.com/deep-learning-4-embedding-layers-f9a02d55ac12

それはさておき、Kerasモデリングが複数の入力レイヤーをサポートしているという事実を利用することもできます。

あなたの特定のケースのために、これはあなたが始めるのを助けるかもしれない作り上げられた例です。繰り返しになりますが、要点を示すために、密な隠れ層をいくつか追加しました。それは自明であるべきです

X1 = rands  
X2 = df_days_onehot
Y = np.random.random(7)

float_input = Input(shape=(1, ))
one_hot_input = Input(shape=(7,) )

first_dense = Dense(3)(float_input)
second_dense = Dense(50)(one_hot_input)

merge_one = concatenate([first_dense, second_dense])
dense_inner = Dense(10)(merge_one)
dense_output = Dense(1)(dense_inner)


model = Model(inputs=[float_input, one_hot_input], outputs=dense_output)


model.compile(loss='mean_squared_error',
              optimizer='adam',
              metrics=['accuracy'])

model.summary()

model.fit([X1,X2], Y, epochs=2)
5
user007

別の方法(おそらくよりエレガント)は、カテゴリ変数(値が時間の経過とともに変化しない)を条件付けることです。

パリとサンフランシスコの2つの異なる都市の気象データを使用して例を見てみましょう。履歴データに基づいて次の気温を予測したいとします。しかし同時に、あなたは天気が都市に基づいて変化することを期待しています。次のいずれかを実行できます。

  • 補助機能を時系列データ(ここで提案したもの)と組み合わせます。

  • 補助機能をRNN層の出力と連結します。 RNNレイヤーはこの補助情報を認識しないため、これはある種のRNN後の調整です。

  • または、条件の学習された表現でRNN状態を初期化します(例:パリやサンフランシスコ)。

補助入力を条件とするライブラリを作成しました。それはすべての複雑さを抽象化し、可能な限りユーザーフレンドリーになるように設計されています。

https://github.com/philipperemy/cond_rnn/

それが役に立てば幸い!

1
Philippe Remy