web-dev-qa-db-fra.com

LSTM multivarié avec valeurs manquantes

Je travaille sur un problème de prévision de séries chronologiques à l'aide de LSTM. L'entrée contient plusieurs fonctionnalités, donc j'utilise un LSTM multivarié. Le problème est qu'il manque des valeurs, par exemple:

    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

Au lieu d'interpoler les valeurs manquantes, cela peut introduire un biais dans les résultats, car parfois il y a beaucoup d'horodatages consécutifs avec des valeurs manquantes sur la même fonctionnalité, je voudrais savoir s'il existe un moyen de laisser le LSTM apprendre avec les manquants valeurs, par exemple, en utilisant un calque de masquage ou quelque chose comme ça? Quelqu'un peut-il m'expliquer quelle sera la meilleure approche pour faire face à ce problème? J'utilise Tensorflow et Keras.

13
Marco Miglionico

Comme suggéré par François Chollet (créateur de Keras) dans son livre , une façon de gérer les valeurs manquantes est de les remplacer par zéro:

En général, avec les réseaux de neurones, il est sûr de saisir des valeurs manquantes à 0, à condition que 0 ne soit pas déjà une valeur significative. Le réseau apprendra de l'exposition aux données que la valeur 0 signifie des données manquantes et commencera à ignorer la valeur. Notez que si vous vous attendez à des valeurs manquantes dans les données de test, mais que le réseau a été formé sur les données sans aucune valeur manquante, le réseau n'aura pas appris à ignorer les valeurs manquantes! Dans ce cas, vous devez générer artificiellement des exemples d'apprentissage avec des entrées manquantes: copiez plusieurs échantillons d'apprentissage plusieurs fois et supprimez certaines des fonctionnalités qui, selon vous, risquent de manquer dans les données de test.

Vous pouvez donc affecter zéro à NaN éléments, étant donné que zéro n'est pas utilisé dans vos données (vous pouvez normaliser les données à une plage, par exemple [1,2], puis affecter zéro à NaN éléments; ou bien, vous pouvez normaliser toutes les valeurs pour qu'elles soient dans la plage [0,1], puis utiliser -1 au lieu de zéro pour remplacer les éléments NaN.)

Une autre manière alternative consiste à utiliser une couche Masking dans Keras. Vous lui donnez une valeur de masque, disons 0, et il supprimerait n'importe quel pas de temps (c'est-à-dire une ligne) où toutes ses caractéristiques sont égales à la valeur du masque. Cependant, toutes les couches suivantes doivent prendre en charge le masquage et vous devez également prétraiter vos données et affecter la valeur du masque à toutes les fonctionnalités d'un pas de temps qui comprend une ou plusieurs fonctionnalités NaN. Exemple de doc Keras:

Considérons un tableau de données Numpy x de forme (samples, timesteps,features), pour alimenter une couche LSTM. Vous souhaitez masquer les pas de temps # 3 et # 5 car vous manquez de données pour ces pas de temps. Vous pouvez:

  • ensemble x[:, 3, :] = 0. et x[:, 5, :] = 0.

  • insérer un calque de masquage avec mask_value=0. avant la couche LSTM:

model = Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(LSTM(32))
19
today