web-dev-qa-db-ja.com

異なる長さと複数の特徴の複数の時系列を使用する場合、LSTMのデータを準備するにはどうすればよいですか?

多くのユーザー(nUsers)からのデータセットがあります。各ユーザーは時間的にランダムにサンプリングされます(各ユーザーのnSamplesは一定ではありません)。各サンプルにはいくつかの機能(nFeatures)があります。例えば:

nUsers = 3 ---> 3ユーザー

nSamples = [32、52、21] --->最初のユーザーが32回サンプリングされました。2番目のユーザーが52回サンプリングされました。

nFeatures = 10 --->各サンプルの特徴の定数。

LSTMに、現在の機能と同じユーザーの以前の予測に基づいて現在の予測を生成してもらいたいです。 LSTMレイヤーを使用してKerasでそれを行うことはできますか?私には2つの問題があります:

  1. データには、ユーザーごとに異なる時系列があります。これを組み込むにはどうすればよいですか?
  2. 現在の予測を行うために、以前の予測を現在の時間特徴空間に追加するにはどうすればよいですか?

ご協力いただきありがとうございます!

11
AR_

各ユーザーはシーケンスのように聞こえるので、ユーザーが問題の「バッチサイズ」である可能性があります。したがって、最初は_nExamples = nUsers_です。

問題を正しく理解した場合(次の要素を予測する場合)、「振り返る」の最大長を定義する必要があります。たとえば、前の7つの要素を見て(シーケンス全体を見ていない)、次の要素を予測できるとします。

そのためには、次のようにデータを分離する必要があります。

_example 1: x[0] = [s0, s1, s2, ..., s6] | y[0] = s7   
example 2: x[1] = [s1, s2, s3, ..., s7] | y[1] = s8
_

ここで、snは10個の機能を備えたサンプルです。通常、ユーザーを混在させるかどうかは関係ありません。すべてのユーザーのためにこれらの小さなセグメントを作成し、すべてをまとめます。

これにより、次のような形状の配列になります

_x.shape -> (BatchSize, 7, 10) -> (BatchSize, 7 step sequences, 10 features)   
y.shape -> (BatchSize, 10)
_

次の機能セットを予測するのではなく、何かを予測するだけかもしれません。その場合は、yを必要な値に置き換えてください。単一の結果が必要な場合は、y.shape -> (BatchSize,)になる可能性があります。


ここで、(前のn個の要素ではなく)予測のためにシーケンス全体が必要な場合は、最大長を定義してシーケンスをパディングする必要があります。

あなたの例のように、あなたの最長のシーケンスが52であると仮定します。

_x.shape -> (Users, 52, 10).    
_

次に、空白を埋めるためにシーケンスを「パディング」する必要があります。
たとえば、シーケンスの先頭を次のようなゼロの特徴で埋めることができます。

_x[0] = [s0, s1, s2, ......., s51] -> user with the longest sequence    
x[1] = [0 , 0 , s0, s1, ..., s49] -> user with a shorter sequence
_

または(これが機能するかどうかはわかりませんが、テストしたことはありません)、末尾をゼロ値で埋めて、 マスキングレイヤー を使用します。これは、Kerasが「可変長シーケンス」に対して持っているものです。引き続き固定サイズの配列を使用しますが、内部的にはゼロ値を破棄します(?)。

6
Daniel Möller