LSTMを使用して時系列予測の問題に取り組んでいます。入力にはいくつかの機能が含まれているため、多変量LSTMを使用しています。問題は、いくつかの欠損値があることです。次に例を示します。
Feature 1 Feature 2 ... Feature n
1 2 4 nan
2 5 8 10
3 8 8 5
4 nan 7 7
5 6 nan 12
欠損値を補間する代わりに、結果にバイアスが生じる可能性があります。同じ機能に欠損値のある連続したタイムスタンプが多数ある場合があるため、LSTMに欠損値を学習させる方法があるかどうかを知りたいです。値、たとえば、マスキングレイヤーなどを使用していますか?誰かがこの問題に対処するための最良のアプローチは何かを私に説明できますか? TensorflowとKerasを使用しています。
FrançoisChollet(Kerasの作成者)が 彼の本 で提案しているように、欠損値を処理する1つの方法は、値をゼロに置き換えることです。
一般に、ニューラルネットワークでは、0はまだ意味のある値ではないという条件で、欠損値を0として入力しても安全です。ネットワークは、データへの露出から、値0がデータの欠落を意味することを学習し、値を無視し始めます。テストデータに欠損値が予想されるが、欠損値のないデータでネットワークがトレーニングされている場合、ネットワークは欠損値を無視することを学習していません。この状況では、エントリが欠落しているトレーニングサンプルを人工的に生成する必要があります。いくつかのトレーニングサンプルを数回コピーし、テストデータで欠落していると思われる機能の一部をドロップします。
したがって、データでゼロが使用されていないことを考慮して、NaN
要素にゼロを割り当てることができます([1,2]などのデータを範囲に正規化してから、NaN
要素にゼロを割り当てることができます。あるいは、すべてを正規化することもできます。値は[0,1]の範囲内にあり、ゼロではなく-1を使用してNaN
要素を置き換えます。)
別の代替方法は、Kerasで Masking
レイヤーを使用することです。あなたはそれにマスク値、例えば0を与えると、すべての特徴がマスク値と等しいすべてのタイムステップ(つまり行)をドロップします。ただし、以下のすべてのレイヤーはマスキングをサポートする必要があり、データを前処理して、1つ以上のNaN
機能を含むタイムステップのすべての機能にマスク値を割り当てる必要もあります。 Keras docの例:
形状
(samples, timesteps,features)
のNumpyデータ配列x
がLSTMレイヤーに供給されることを考慮してください。これらのタイムステップのデータがないため、タイムステップ#3と#5をマスクする必要があります。あなたはできる:
x[:, 3, :] = 0.
とx[:, 5, :] = 0.
を設定
LSTM
レイヤーの前にmask_value=0.
のマスキングレイヤーを挿入します。model = Sequential() model.add(Masking(mask_value=0., input_shape=(timesteps, features))) model.add(LSTM(32))