RNN avec de multiples fonctionnalités

27

J'ai un peu de connaissances autodidactes travaillant avec des algorithmes d'apprentissage automatique (les trucs basiques de type Random Forest et Linear Regression). J'ai décidé de me diversifier et de commencer à apprendre les RNN avec Keras. En regardant la plupart des exemples, qui impliquent généralement des prédictions de stock, je n'ai pas pu trouver d'exemples de base de plusieurs fonctionnalités mises en œuvre, à l'exception d'une colonne étant la date de la fonctionnalité et l'autre étant la sortie. Y a-t-il une chose fondamentale qui me manque ou quelque chose?

Si quelqu'un a un exemple, je l'apprécierais grandement.

Merci!

Rjay155
la source
1
Je ne sais pas ce que vous entendiez par "fonctionnalités multiples". Si vous voulez dire que plus d'une fonctionnalité a un impact sur l'apprentissage, vous utilisez simplement une matrice de conception multivariée. Veuillez clarifier par un exemple ou quelque chose.
horaceT
@horaceT J'ai développé multiple features ici , une question plus spécifique sur la façon d'utiliser RNN pour les prédictions de séries chronologiques avec des fonctionnalités contenant des données numériques et des données non numériques?
hhh

Réponses:

25

Les réseaux de neurones récurrents (RNN) sont conçus pour apprendre les données de séquence. Comme vous le devinez, ils peuvent certainement prendre plusieurs fonctionnalités en entrée! Les RNN de Keras prennent des entrées 2D ( T , F ) des pas de temps T et comportent F ( j'ignore la dimension de lot ici).

Cependant, vous n'avez pas toujours besoin ou ne voulez pas les pas de temps intermédiaires, t = 1, 2 ... ( T - 1). Par conséquent, Keras prend en charge de manière flexible les deux modes. Pour qu'il affiche tous les pas de temps T , passez return_sequences=Trueà votre RNN (par exemple, LSTMou GRU) à la construction. Si vous ne voulez que le dernier pas de temps t = T , alors utilisez return_sequences=False(c'est la valeur par défaut si vous ne passez pas return_sequencesau constructeur).

Voici des exemples de ces deux modes.

Exemple 1: apprentissage de la séquence

Voici un exemple rapide de formation d'un LSTM (type de RNN) qui conserve toute la séquence. Dans cet exemple, chaque point de données d'entrée a 2 pas de temps, chacun avec 3 caractéristiques; les données de sortie ont 2 pas de temps (parce que return_sequences=True), chacun avec 4 points de données (parce que c'est la taille à laquelle je passe LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    [
        # Target features at timestep 1
        [101, 102, 103, 104],
        # Target features at timestep 2
        [105, 106, 107, 108]
    ],
    # Datapoint 2
    [
        # Target features at timestep 1
        [201, 202, 203, 204],
        # Target features at timestep 2
        [205, 206, 207, 208]
    ]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=True, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=True)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)

Exemple 2: apprentissage du dernier pas de temps

Si, d'autre part, vous souhaitez former un LSTM qui ne produit que le dernier pas de temps dans la séquence, vous devez le définir return_sequences=False(ou simplement le supprimer entièrement du constructeur, car Falsec'est la valeur par défaut). Et puis vos données de sortie ( data_ydans l'exemple ci-dessus) doivent être réorganisées, car vous n'avez qu'à fournir le dernier pas de temps. Donc, dans ce deuxième exemple, chaque point de données d'entrée a toujours 2 pas de temps, chacun avec 3 fonctionnalités. Les données de sortie, cependant, ne sont qu'un seul vecteur pour chaque point de données, car nous avons tout aplati en un seul pas de temps. Cependant, chacun de ces vecteurs de sortie a toujours 4 fonctionnalités (car c'est la taille à laquelle je passe LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    # Target features at timestep 2
    [105, 106, 107, 108],
    # Datapoint 2
    # Target features at timestep 2
    [205, 206, 207, 208]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=False, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=False)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)
Adam Sypniewski
la source
Merci pour votre grande explication. Quelle est la relation entre le point de données n ° 1 et le point de données n ° 2. Par exemple, dans la première situation, si vous supprimez le point de données 2 et le placez sous le point de données 1, nous avons maintenant 4 pas de temps. Comment cela affecterait-il le modèle dans son ensemble?
Rjay155
Il n'y a pas de relation spéciale entre les points de données. Un bon ensemble de formation en apprentissage en profondeur comportera plusieurs dizaines de milliers, voire des millions de points de données. Un point de données = un échantillon de formation, c'est tout. Si vous deviez «fusionner» les points de données # 1 et # 2, alors data_xil contiendrait simplement un seul point de données, et ce point de données aurait quatre pas de temps, chacune de 3 dimensions (et de même, vous devriez fusionner data_yde la même manière). Le nombre de pas de temps que vous utilisez dépend simplement de ce que vous essayez de modéliser (et du nombre de pas de temps pertinents pour ce processus).
Adam Sypniewski
@Adam Sypniewski J'ai une question sur le y. data_y = numpy.array ([# Datapoint 1 # Entités cibles au pas de temps 2 [[105, 106, 107, 108], [0, 1]], # Datapoint 2 # Entités cibles au pas de temps 2 [[205, 206, 207 , 208], [1, 0]]]) si l'un de mes y est des caractéristiques catégorielles. Comment pourrais-je structurer cela. THX!
Hua Ye
2
Dans ce cas, vous devez probablement alimenter la sortie du RNN dans une couche dense, de sorte que chaque pas de temps de sortie soit mappé dans une catégorie unique.
Adam Sypniewski
Comment pouvez-vous visualiser les résultats ici? Certaines parcelles seraient utiles.
hhh