কেরাসের সাথে সময়ের দিগন্তের ভবিষ্যতের মানগুলি কীভাবে অনুমান করা যায়?


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

তারপরে এটি এই ফলাফলটি তৈরি করে: পরীক্ষার ডেটা নিয়ে ভবিষ্যদ্বাণী

Historicalতিহাসিক তথ্যগুলিতে একটি ভাল মডেল তৈরি এবং প্রশিক্ষণের পরে, আমি জানি না যে আমি কীভাবে ভবিষ্যতের মানগুলির পূর্বাভাস তৈরি করতে পারি? উদাহরণস্বরূপ পরবর্তী 10 দিনের চাহিদা। তথ্য প্রতিদিন হয়।

এটি কীভাবে ডেটা আকৃতির হয় তার একটি উদাহরণ

নোট: এটি কীভাবে ডেটা আকৃতির হয় তার একটি উদাহরণ, সবুজ হল লেবেল এবং হলুদ বৈশিষ্ট্যগুলি are
পরে dropna()(ডিলিট নাল মান) এটি 100 ডেটা সারি থাকে, আমি প্রশিক্ষণ 80 এবং পরীক্ষা 20 ব্যবহার করেছি।


আপনি যখন আপনার সময়ের সিরিজটি ভাঙবেন তখন আপনার কতটি উদাহরণ রয়েছে?
JahKnows

দুঃখিত স্যার, আমি আপনাকে পাইনি, আপনি আরও ব্যাখ্যা করতে পারেন? আপনাকে ধন্যবাদ
Nbenz

পূর্বাভাস সমস্যার জন্য আপনার ডেটা পুনর্গঠন করার পরে, আপনার কাছে কত লাইনের উদাহরণ রয়েছে?
JahKNows

আপনি কি আমাকে একক পয়েন্টের ক্রম দিতে পারেন এবং আমি আপনাকে সেগুলির সাথে কীভাবে পূর্বাভাস করতে হবে তা দেখাব।
JahKNows

ডেটা ফর্ম্যাট এবং আকৃতির উদাহরণ যোগ করে আপনি যে প্রশ্নটি সম্পাদনা করেছি তা আপনি আবার পরীক্ষা করতে পারেন। ধন্যবাদ
Nbenz

উত্তর:


5
এই উত্তরটি একটু ভিন্ন দিকে চলে যায় তবে আমি আশা করি এটি এখনও আপনার প্রশ্নের জবাব দেয়। এটি ঘূর্ণায়মান পূর্বাভাস / পূর্বাভাসের ধারণাটি ব্যবহার করে।

আপনি দিগন্ত শব্দটি ব্যবহার করার কারণে , আমি ধরে নেব এর অর্থ হ'ল আপনি একটি নির্দিষ্ট সময়ের পদক্ষেপে ভবিষ্যতের 10 দিনের পূর্বাভাস দিতে চান। এটি করার কয়েকটি উপায় রয়েছে। এই জাতীয় টাইম-সিরিজ সমস্যার সাথে, এই ধারণাটি করা সাধারণ যে কেবলমাত্র একটি নির্দিষ্ট ইতিহাস পরবর্তী কয়েক সময়ের পদক্ষেপগুলিকে প্রভাবিত করবে (seasonতু প্রভাবকে অবহেলা করে)।

কথায় উদাহরণ:

সুতরাং আপনার ক্ষেত্রে, আপনি উদাহরণস্বরূপ পূর্ববর্তী days০ দিন ব্যবহার করতে পারেন এবং পরবর্তী ১০ টি (100 - 60 - 9) = 31পূর্বাভাস দিতে পারেন your উদাহরণ হিসাবে আপনার ১০০ সারি ডেটা গ্রহণ করার অর্থ, এর অর্থ হ'ল আপনি ভবিষ্যদ্বাণী করতে পারবেন , প্রতিটি 10 ​​বার পদক্ষেপের পূর্বাভাস (আমাদের এগুলির প্রয়োজন হবে) 31 ভবিষ্যদ্বাণীপূর্ণ_ব্লকগুলি পরে)। 100 সারি থেকে আমরা প্রথম মডেলটি ফিট করতে প্রথম 60 হেরে যাই। অবশিষ্ট 40 সারি ডেটাগুলির মধ্যে, আমরা 10 ধাপ এগিয়ে (61-70 সারি) পূর্বাভাস দিতে পারি, তারপরে আমরা পুরো জিনিসটিকে আরও এক সারি সরিয়ে আবার পুনরাবৃত্তি করি। 10 ভবিষ্যতের পয়েন্টগুলির শেষ পূর্বাভাসটি 91-100 সারিগুলির জন্য হবে। এর পরে আমরা আর দশটি পদক্ষেপের পূর্বাভাস দিতে পারি না, তাই আমরা থামিয়ে দিয়েছি - এবং এই কারণেই আমাদের অতিরিক্ত 9. টি বিয়োগ করতে হবে [

হাজার শব্দ সহ উদাহরণ:

আমাকে ছবি আঁকো; একটি স্থানান্তরিত উইন্ডো পূর্বাভাস ধারণা ব্যাখ্যা করতে সহায়তা করতে।

প্রতিটি ট্রেন সেট জন্য (যেমন থেকে t=0থেকে t=5লাল - ট্রেন সেট 1), আপনি (- টেস্ট সেট 1 টি = 6 কমলা রঙে সংশ্লিষ্ট) নিম্নলিখিত এইচ সময় পদক্ষেপ ভবিষ্যদ্বাণী করা চাই। এটিতে আপনার দিগন্তটি কেবল একটি অর্থাত্‍ H=1

নমুনা পূর্বাভাসের ঘূর্ণায়মান বেসিক স্কেচ

আমি যা বুঝি সেগুলি থেকে আপনি পরবর্তী 10 দিনের পূর্বাভাস দিতে চান, যার অর্থ আপনার প্রয়োজন H=10

আপনার উদাহরণ দিয়ে এটি চেষ্টা করার জন্য, আমি মনে করি আপনাকে দুটি পরিবর্তন করতে হবে।

পরিবর্তন # 1

আপনার ট্রেনের আকার এবং পরীক্ষার সেটগুলি নতুন দিগন্তের সাথে মেলে প্রয়োজন। আপনার মডেল ইনপুটগুলির প্রতিটি নমুনা ( x_trainএবং x_testআগের মতোই থাকতে পারে However তবে, আপনার পরীক্ষা সেটে প্রতিটি নমুনাতে 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, কারণ পূর্বনির্ধারিত ঘন স্তরটিতে ডিফল্টরূপে একটি রৈখিক অ্যাক্টিভেশন অন্তর্ভুক্ত থাকে। এখানে চমৎকার ডকুমেন্টেশন দেখুন ।

এটি একটি বড় বিষয় এবং আপনি অনেকগুলি চেষ্টা করে দেখতে পারেন। আমি আপনার প্রশ্নের মন্তব্যগুলির সাথে একমত, যে কোনও আরএনএনকে মডেলটির অর্থ উপস্থাপনের অনুমতি দেওয়ার জন্য আপনার আরও অনেক ডেটা প্রয়োজন।

আপনি যদি কেবল এলএসটিএম ইত্যাদির বিষয়ে জানার জন্য এটি না করে থাকেন তবে আর একটি ব্যবহারিক পদ্ধতির মধ্যে হতে পারে সহজ সময়-সিরিজের মডেলগুলিতে যেমন একটি আরিমা মডেল (জটিল নামটি দেখে ভয় দেখাবেন না - এটি এলএসটিএম এর চেয়ে অনেক সহজ) হতে পারে) । স্ট্যাটস মডেলস প্যাকেজটি ব্যবহার করে পাইথনের সাহায্যে এই জাতীয় মডেলগুলি বেশ সহজেই তৈরি করা যায় , যার দুর্দান্ত বাস্তবায়ন রয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.