केर के साथ समय क्षितिज के भविष्य के मूल्यों की भविष्यवाणी कैसे करें?


11

मैंने सिर्फ केआरएस के साथ इस एलएसटीएम तंत्रिका नेटवर्क का निर्माण किया

    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()

तब यह इस परिणाम को उत्पन्न करता है: परीक्षण डेटा पर भविष्यवाणी

ऐतिहासिक डेटा पर एक अच्छे मॉडल के निर्माण और प्रशिक्षण के बाद, मुझे नहीं पता कि मैं भविष्य के मूल्यों के लिए भविष्यवाणी कैसे कर सकता हूं? उदाहरण के लिए अगले 10 दिनों की मांग। डेटा दैनिक हैं।

यह एक उदाहरण है कि डेटा को कैसे आकार दिया जाता है

एनबी: यह एक उदाहरण है कि डेटा को कैसे आकार दिया जाता है, हरे रंग का लेबल है और पीले रंग की विशेषताएं हैं।
के बाद dropna()(शून्य मान हटाएं) यह 100 डेटा पंक्तियाँ बनी हुई हैं, मैंने प्रशिक्षण में 80 और परीक्षण में 20 का उपयोग किया है।


जब आप अपनी समय श्रृंखला को तोड़ते हैं, तो आपके पास कितने उदाहरण हैं?
JahKnows

सॉरी सर, मैं आपको नहीं मिला, क्या आप और समझा सकते हैं? धन्यवाद
Nbenz

पूर्वानुमान समस्या के लिए अपने डेटा को पुनर्गठित करने के बाद, आपके पास कितने उदाहरण हैं?
जाह्नवीस

क्या आप मुझे अंक का एक बार अनुक्रम दे सकते हैं और मैं आपको दिखाऊंगा कि उनके साथ पूर्वानुमान कैसे किया जाता है।
जाह्नवीस

आप डेटा प्रारूप और आकार का एक उदाहरण जोड़कर इसे संपादित किए गए प्रश्न की फिर से जाँच कर सकते हैं। धन्यवाद
नबंज़

जवाबों:


5
यह उत्तर थोड़ा अलग दिशा में जाता है, लेकिन मुझे आशा है कि यह अभी भी आपके प्रश्न का उत्तर देता है। यह एक रोलिंग पूर्वानुमान / भविष्यवाणी के विचार का उपयोग करता है।

क्योंकि आप क्षितिज शब्द का उपयोग करते हैं , इसलिए मैं आपको यह मानूंगा कि आप एक निश्चित समय पर भविष्य में 10 दिनों की भविष्यवाणी करना चाहेंगे। ऐसा करने के कुछ तरीके हैं। इस तरह की समय-श्रृंखला की समस्या के साथ, यह धारणा बनाना आम है कि केवल एक निश्चित इतिहास अगले कुछ समय के कदमों (मौसमी प्रभावों की उपेक्षा) को प्रभावित करेगा।

शब्दों में उदाहरण:

तो आपके मामले में, आप पिछले 60 दिनों में उदाहरण के लिए उपयोग कर सकते हैं, और अगले 10. की भविष्यवाणी कर सकते हैं। उदाहरण के रूप में डेटा की 100 पंक्तियों को लेते हुए, इसका मतलब है कि आप वास्तव में (100 - 60 - 9) = 31भविष्यवाणियां कर सकते हैं , प्रत्येक 10 कदम आगे की भविष्यवाणी (हमें इनकी आवश्यकता होगी 31 प्रेडिक्टिव_ब्लॉक बाद में)। 100 पंक्तियों से हम पहला मॉडल फिट करने के लिए पहला 60 खो देते हैं। डेटा की शेष 40 पंक्तियों में से, हम 10 कदम आगे (पंक्तियाँ 61-70) की भविष्यवाणी कर सकते हैं, फिर हम पूरी चीज़ को एक पंक्ति आगे और दोहराते हैं। भविष्य के 10 बिंदुओं की अंतिम भविष्यवाणी पंक्तियों के लिए 91-100 होगी। उसके बाद हम 10 चरणों की भविष्यवाणी नहीं कर सकते, इसलिए हम रुक जाते हैं - और यही कारण है कि हमें उस अतिरिक्त 9 को घटाना है। [भविष्यवाणी करने के लिए जारी रखने के तरीके के रूप में सभी डेटा का उपयोग करना है]

एक हजार शब्दों के साथ उदाहरण:

मुझे चित्र बनाने दो; एक शिफ्टिंग विंडो भविष्यवाणी के विचार को समझाने में मदद करने के लिए।

प्रत्येक ट्रेन सेट के लिए (उदाहरण के t=0लिए t=5लाल रंग की ट्रेन सेट 1 से), आप निम्न H समय चरणों (नारंगी में टेस्ट = 1 के अनुरूप) की भविष्यवाणी करना चाहते हैं। इसमें आपका क्षितिज बस एक है H=1

एक रोलिंग आउट-ऑफ-सैंपल फोरकास्ट का बेसिक स्केच

जो मैं समझता हूं, उससे आप अगले 10 दिनों की भविष्यवाणी करना चाहेंगे, जिसका मतलब है कि आपको जरूरत है H=10

अपने उदाहरण के साथ यह कोशिश करने के लिए, मुझे लगता है कि आपको दो बदलाव करने की आवश्यकता होगी।

# 1 बदलें

अपनी ट्रेन और परीक्षण सेट के आकार को नए क्षितिज से मेल खाना होगा। आपके मॉडल इनपुट के प्रत्येक नमूने ( x_trainऔर x_testपहले की तरह ही रह सकते हैं। हालांकि, आपके परीक्षण सेट के प्रत्येक नमूने में H=10लेबल के अगले मूल्य शामिल होंगे , न कि केवल एक मूल्य।

यहां बताया गया है कि आप ऐसा कैसे कर सकते हैं:

# 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)

क्योंकि आप आउट-ऑफ-सैंपल परीक्षण कर रहे हैं, इसलिए विश्लेषण देखने के लिए आपकी भविष्यवाणियाँ पहले से ही दिलचस्प हैं। एक बार जब यह चलता है, तो आप अपने द्वारा उल्लिखित नए डेटा के साथ समकक्ष परीक्षण डेटासेट बना सकते हैं।

आपके डेटा को अच्छी तरह से जाने बिना, मुझे नहीं पता कि आपके इनपुट के रूप में या उसी पंक्ति के y- मानों की भविष्यवाणी की जानी चाहिए या नहीं। इसके अतिरिक्त, आपके डेटा के आधार पर, आप yप्रत्येक x_trainब्लॉक में पिछले मानों को शामिल कर सकते हैं। इस मामले में आप बस xपूरी तालिका यानी data[cols], जहाँ के लिए स्वैप करेंगे new_cols = ['Demand'] + cols

# 2 बदलें

आपको आउटपुट Hमूल्यों को मजबूर करके मॉडल को इस क्षितिज को प्रतिबिंबित करने की आवश्यकता होगी ।

मॉडल को कैसे निर्दिष्ट किया जाए इसका एक उदाहरण इस प्रकार है:

# 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!

नोट: आपके मॉडल विनिर्देश में, आपको अंतिम रैखिक जोड़ने की आवश्यकता नहीं है Activation, क्योंकि डिफ़ॉल्ट रूप से पूर्ववर्ती घने परत में एक रैखिक सक्रियण शामिल है। यहाँ उत्कृष्ट प्रलेखन देखें ।

यह एक बड़ा विषय है और ऐसी कई चीजें हैं जिन्हें आप आजमा सकते हैं। मैं आपके प्रश्न पर टिप्पणियों से सहमत हूं, कि आपको एक आरएनएन को मॉडल का अर्थ प्रतिनिधित्व करने की अनुमति देने के लिए बहुत अधिक डेटा की आवश्यकता होगी।

यदि आप LSTM आदि के बारे में जानने के लिए ऐसा नहीं कर रहे हैं, तो एक और व्यावहारिक दृष्टिकोण सरल समय-श्रृंखला मॉडल जैसे ARIMA मॉडल (जटिल नाम से भयभीत न हों - यह LSTM की तुलना में बहुत सरल है) में देखा जा सकता है। । इस तरह के मॉडल अजगर के साथ काफी आसानी से निर्माण किया जा सकता, का उपयोग कर statsmodels पैकेज , है जो एक अच्छा कार्यान्वयन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.