Keras ile zaman ufkunun gelecekteki değerlerini nasıl tahmin edebilirim?


11

Bu LSTM sinir ağını Keras ile kurdum

    import numpy as np
    import pandas as pd 
    from sklearn import preprocessing
    from keras.layers.core import Dense, Dropout, Activation
    from keras.activations import linear
    from keras.layers.recurrent import LSTM
    from keras.models import Sequential
    from matplotlib import pyplot

    #read and prepare data from datafile
    data_file_name = "DailyDemand.csv"
    data_csv = pd.read_csv(data_file_name, delimiter = ';',header=None, usecols=[1,2,3,4,5])
    yt = data_csv[1:]
    data = yt
    data.columns = ['MoyenneTransactHier', 'MaxTransaction', 'MinTransaction','CountTransaction','Demand']
    # print (data.head(10))
    pd.options.display.float_format = '{:,.0f}'.format
    data = data.dropna ()
    y=data['Demand'].astype(int)
    cols=['MoyenneTransactHier', 'MaxTransaction', 'MinTransaction','CountTransaction']
    x=data[cols].astype(int)

    #scaling data
    scaler_x = preprocessing.MinMaxScaler(feature_range =(-1, 1))
    x = np.array(x).reshape ((len(x),4 ))
    x = scaler_x.fit_transform(x)
    scaler_y = preprocessing.MinMaxScaler(feature_range =(-1, 1))
    y = np.array(y).reshape ((len(y), 1))
    y = scaler_y.fit_transform(y)
    print("longeur de y",len(y))
    # Split train and test data
    train_end = 80
    x_train=x[0: train_end ,]
    x_test=x[train_end +1: ,]
    y_train=y[0: train_end]
    y_test=y[train_end +1:] 
    x_train=x_train.reshape(x_train.shape +(1,))
    x_test=x_test.reshape(x_test.shape + (1,))

    print("Data well prepared")
    print ('x_train shape ', x_train.shape)
    print ('y_train', y_train.shape)

    #Design the model - LSTM Network
    seed = 2016
    np.random.seed(seed)
    fit1 = Sequential ()
    fit1.add(LSTM(
        output_dim = 4,
        activation='tanh',
        input_shape =(4, 1)))
    fit1.add(Dense(output_dim =1))
    fit1.add(Activation(linear))
    #rmsprop or sgd
    batchsize = 1
    fit1.compile(loss="mean_squared_error",optimizer="rmsprop")
    #train the model
    fit1.fit(x_train , y_train , batch_size = batchsize, nb_epoch =20, shuffle=True)

    print(fit1.summary ())

    #Model error
    score_train = fit1.evaluate(x_train ,y_train ,batch_size =batchsize)
    score_test = fit1.evaluate(x_test , y_test ,batch_size =batchsize)
    print("in  train  MSE = ",round(score_train,4))
    print("in test  MSE = ",round(score_test ,4))

    #Make prediction
    pred1=fit1.predict(x_test)
    pred1 = scaler_y.inverse_transform(np.array(pred1).reshape ((len(pred1), 1)))
    real_test = scaler_y.inverse_transform(np.array(y_test).reshape ((len(y_test), 1))).astype(int)

    #save prediction
    testData = pd.DataFrame(real_test)
    preddData = pd.DataFrame(pred1)
    dataF = pd.concat([testData,preddData], axis=1)
    dataF.columns =['Real demand','Predicted Demand']
    dataF.to_csv('Demandprediction.csv')

    pyplot.plot(pred1, label='Forecast')
    pyplot.plot(real_test,label='Actual')
    pyplot.legend()
    pyplot.show()

o zaman bu sonucu üretir: Test verileri üzerinde tahmin

Geçmiş veriler üzerinde iyi bir model oluşturup eğittikten sonra, gelecekteki değerler için nasıl tahmin üretebileceğimi bilmiyorum? Örneğin, önümüzdeki 10 günün talebi. Veriler günlüktür.

bu verinin nasıl şekillendiğine bir örnektir

Not: Bu, verilerin nasıl şekillendirildiğine, yeşil etiket ve sarı veri ise özelliklere bir örnektir.
sonra dropna()100 veri satırlarını kalır (silme boş değerleri), ben eğitim 80 ve testte 20 kullandım.


Zaman dizinizi ayırdığınızda kaç örneğiniz var?
JahKnows

Üzgünüm efendim, seni anlamadım, daha fazla açıklayabilir misin? teşekkür ederim
Nbenz

Bir öngörme sorunu için verilerinizi yeniden yapılandırdıktan sonra kaç örnek satırınız var?
JahKnows

Bana tek bir zaman sırası verebilir misiniz ve size onlarla nasıl tahmin yapacağınızı göstereceğim.
JahKnows

Veri biçimi ve şekline bir örnek ekleyerek düzenlediğim soruyu tekrar kontrol edebilirsiniz. teşekkürler
Nbenz

Yanıtlar:


5
Bu cevap biraz farklı bir yöne gidiyor, ama umarım sorunuzu hala cevaplıyor. Değişken tahmin / tahmin fikrini kullanır.

Ufuk kelimesini kullandığınız için , belirli bir zaman adımında geleceğe 10 gün tahmin etmek istediğinizi varsayacağım. Bunu yapmanın birkaç yolu vardır. Bu tür bir zaman serisi problemi ile, sadece belirli bir tarihin sonraki birkaç zaman adımını etkileyeceği varsayımını yapmak yaygındır (mevsimsel etkileri ihmal ederek).

Kelimelere örnek:

Yani sizin durumunuzda, örneğin önceki 60 günü kullanabilir ve bir sonraki 10'u tahmin edebilirsiniz. 100 satırlık veriyi örnek olarak almak, aslında (100 - 60 - 9) = 31tahminler yapabileceğiniz anlamına gelir , her 10 ileri adımda her tahmin (bunlara ihtiyacımız olacak) 31 tahmini_ sonradan kilitlenir). 100 sıradan ilk modele uyması için ilk 60'ı kaybediyoruz. Kalan 40 veri satırından, 10 adım önde (61-70 satır) tahmin edebiliriz, sonra her şeyi bir satır daha ileri kaydırırız ve tekrarlarız. Gelecek 10 puanın son tahmini 91-100. Satırlar için olacaktır. Bundan sonra artık 10 adımı tahmin edemiyoruz, bu yüzden duruyoruz - ve bu yüzden bu ekstra 9'u çıkarmak zorundayız. [Tabii ki tüm verileri kullanmak için tahmin yapmaya devam etmenin yolları var]

Bin kelimelik örnek:

Resmi boyamama izin verin; değişen pencere tahmini fikrini açıklamaya yardımcı olmak.

Her tren setinin (örn gelen t=0etmek t=5kırmızı - tren seti 1), siz (- test seti 1 t turuncu = 6 karşılık gelir) aşağıdaki H süresi adımlarını tahmin etmek istiyorum. Bunda ufkunuz sadece bir örnektir H=1.

Yuvarlanan örneklem dışı tahminin temel çizimi

Anladığım kadarıyla, önümüzdeki 10 günü tahmin etmek istiyorsunuz, yani ihtiyacınız var H=10.

Bunu örneğinizle denemek için iki değişiklik yapmanız gerektiğini düşünüyorum.

Değişim # 1

Treninizin ve test setlerinin şekli yeni ufka uymalıdır. Model girişinizin her bir örneği ( x_trainve x_testöncekiyle aynı kalabilir. Ancak, test kümenizdeki her örneğin H=10yalnızca tek bir değeri değil, etiketin sonraki değerlerini içermesi gerekir .

Bunu nasıl yapabileceğinizin kabaca bir örneği:

# Define our horizon
H = 10

# Create data split, using values from my example above
window_size = 60
num_pred_blocks = 31    # as computed above

# Loop over the train and test samples to create the sliding window sets
x_train = []
y_train = []
for i in range(num_pred_blocks):
    x_train_block = x_train[i:(i + window_size)]    # 31 blocks of 60 * num-columns
    x_train.append(x_train_block)
    y_train_block = y_train[(i + window_size):(i + window_size + H)]    # 31 blocks of 10 * 1
    y_train.append(y_train_block)

Örnek dışı test yaptığınız için, tahminleriniz analiz etmek için zaten ilginç. Bu çalıştıktan sonra, bahsettiğiniz yeni verilerle eşdeğer test veri kümeleri oluşturabilirsiniz.

Verilerinizi çok iyi bilmeden, girişinizle aynı satırın mı yoksa bir sonraki satırın y değerlerini mi tahmin edeceğinizi bilmiyorum. Ayrıca, verilerinize bağlı olarak y, x_trainblokların her birinin geçmiş değerlerini dahil edebilirsiniz . Bu durumda xtüm tabloyu, yani data[cols]nerede değiştirirsiniz new_cols = ['Demand'] + cols.

Değişim # 2

Modelin çıktı Hdeğerlerine zorlayarak bu ufku yansıtmasını sağlamalısınız .

Modeli nasıl belirleyeceğinize ilişkin bir örnek:

# Define our horizon
H = 10

# Create the model using the parameterised horizon
fit1 = Sequential ()
fit1.add(LSTM(output_dim = 4, activation='tanh', input_shape =(4, 1)))
fit1.add(Dense(output_dim=30, activation='sigmoid')
fit1.add(Dense(output_dim=H))    # our horizon is produced!

Not: Model spesifikasyonunuzda, Activationvarsayılan olarak önceki Yoğun katman doğrusal bir aktivasyon içerdiğinden, son lineeri eklemenize gerek yoktur . Buradaki mükemmel belgelere bakın .

Bu büyük bir konu ve deneyebileceğiniz birçok şey var. Sorunuzdaki yorumlara katılıyorum, bir RNN'nin modelin anlamını temsil etmesine izin vermek için çok daha fazla veriye ihtiyacınız olacak.

Bunu sadece LSTM'ler hakkında bilgi edinmek için yapmıyorsanız, başka bir pratik yaklaşım, ARIMA modeli gibi daha basit zaman serisi modellerine bakmak olabilir (karmaşık adla korkutmayın - bir LSTM'den çok daha basittir) . Bu modeller, güzel bir uygulamaya sahip olan istatistik modelleri paketi kullanılarak Python ile kolayca oluşturulabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.