0
votes

LSTM en Python générant des prévisions plates

 Entrez la description de l'image ici  Entrez la description de l'image ici J'ai des données quotidiennes de juillet 2017-déc. 2018 qui n'est pas stationnaire de nature et j'essaie de générer des prévisions pour les six prochains mois, c'est-à-dire; De Jan 2019- Jul 2019. J'ai essayé d'utiliser Sarimax & Lstm, mais je reçois des prévisions plates. C'est la première fois que j'utilise LSTM, donc j'ai essayé à la fois relié et sigmoïde en tant que fonctions d'activation, mais les prévisions sont plates xxx pré>

suivantes sont les données d'un mois: p> xxx

scaler = MinMaxScaler()
train = daily_data.iloc[:365]
test = daily_data.iloc[365:]

scaler.fit(train)


scaled_train = scaler.transform(train)
scaled_test = scaler.transform(test)

from keras.preprocessing.sequence import TimeseriesGenerator

scaled_train
# define generator
n_input = 7
n_features = 1
generator = TimeseriesGenerator(scaled_train, scaled_train,    
length=n_input, batch_size=1)


from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM


# define model
model = Sequential()
model.add(LSTM(200, activation='sigmoid', input_shape=(n_input,     
n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

model.summary()

# fit model
model.fit_generator(generator,epochs=25)

model.history.history.keys()

loss_per_epoch = model.history.history['loss']
plt.plot(range(len(loss_per_epoch)),loss_per_epoch)

first_eval_batch = scaled_train[-7:]
first_eval_batch = first_eval_batch.reshape((1,n_input,n_features))

model.predict(first_eval_batch)

test_predictions = []

first_eval_batch = scaled_train[-n_input:]
current_batch = first_eval_batch.reshape((1, n_input, n_features))


np.append(current_batch[:,1:,:],[[[99]]],axis=1)



test_predictions = []

first_eval_batch = scaled_train[-n_input:]
current_batch = first_eval_batch.reshape((1, n_input, n_features))

for i in range(len(test)):

 # get prediction 1 time stamp ahead ([0] is for grabbing just the  
 number instead of [array])
 current_pred = model.predict(current_batch)[0]

 # store prediction
 test_predictions.append(current_pred) 

 # update batch to now include prediction and drop first value
 current_batch = np.append(current_batch[:,1:,:],                        

 [[current_pred]],axis=1)


0 commentaires

3 Réponses :


0
votes

J'ai eu un problème similaire. Essayez de définir «relu» comme fonction d'activation dans la première couche. ici est un lien vers un grand Blog. Il contient beaucoup de détails très utiles, surtout si vous commencez par l'apprentissage de la machine.

Voici une influence du nombre d'époques résultant avec mon ancien modèle. 5000 Epochs 25 EPOCHS Je suis également un peu inquiet de la quantité de données de formation que vous avez. J'ai formé mon modèle sur 18 000 documents à prédire les 24 prochaines 24 heures, mais mon modèle analyse un système assez complexe. Je ne sais pas ce qui décrit vos données, mais vous devez réfléchir au nombre de dépendances possibles dans votre système et à la manière dont vos données de formation peuvent préparer votre modèle pour eux. Je suis nouveau à l'apprentissage de la machine, mais ce qui est appris que la plus grande partie de la préparation du modèle est la méthode d'essai et d'erreur. Surtout au début. Le blog forme le début de ma réponse m'a beaucoup aidé, je vous recommande de le lire.

Je me souviens que dans mon cas, j'ai utilisé des fonctions d'activation incorrectes presque partout.

ICI est un message sur la sous-lit et la surcharge.


3 commentaires

Comment l'avez-vous résolu? J'ai commencé avec relu mais cela n'a pas aidé


Pourriez-vous envoyer un écran de votre parcelle de résultat?


Ajouté à la fois les parcelles de prévisions quotidiennes et mensuelles



0
votes

Quelques problèmes:

  1. 18 mois de données quotidiennes n'est probablement pas substantiel pour un réseau neuronal de construire une prédiction précise de l'avenir. LI>
  2. Votre modèle n'a que 1 couche de LSTM, ajoutez une seconde pour bénéficier de sa "mémoire": li> OL>
    from keras.layers import Dropout
    
    # define model
    model = Sequential()
    model.add(LSTM(50, activation='relu', input_shape=(n_input,n_features), return_sequences=True))
    model.add(Dropout(.4))
    model.add(LSTM(100, activation='relu', return_sequences=False))
    model.add(Dropout(.4))
    model.add(Dense(1))
    model.compile(optimizer='adam', loss='mse')
    


2 commentaires

Merci beaucoup, donc si je brise les données @ niveau quotidien, il y a plus de 500 points de données. Quelle serait la meilleure façon de partager les données?


Salut merci à tout le monde. Je pense que j'ai pu résoudre le problème que je rencontrais. Le défi que je suis confronté est de faire des prévisions hors du temps. Quelqu'un peut-il m'aider à faire prévoir un mois à venir. J'ai des données jusqu'en décembre 2018, je souhaite prévoir jusqu'en mars 2019. Quelqu'un peut-il aider?



0
votes

Ceci est un fil plus ancien mais j'ai eu un problème similaire et cela s'est effectivement venu de sous-traiter. De toute évidence, il pourrait y avoir de nombreuses raisons à cela, mais OP a 25 époques dans son script qui ne suffit généralement pas. J'exécutais 30 époques et obtiendis cette prédiction de la ligne droite lorsque je n'engagé pas les données (mon ordinateur n'est pas le meilleur, donc je pensais pouvoir vous échapper avec moins d'époques):

 sous condition de prévision

Après avoir utilisé les époques, j'ai eu beaucoup de meilleurs résultats et entraîne des résultats. Il y a beaucoup d'autres raisons pour lesquelles les prévisions sortiraient comme des lignes droites, mais espérons que, espérons que, les époques, peuvent vous aider.


0 commentaires