LSTM সময় সিরিজের পূর্বাভাসের কাছাকাছি পূর্বাভাস ব্যবধান


14

এলএসটিএম (বা অন্যান্য পুনরাবৃত্ত) নিউরাল নেটওয়ার্ক থেকে টাইম সিরিজের পূর্বাভাসের আশেপাশে ভবিষ্যদ্বাণী ব্যবধান (সম্ভাব্যতা বিতরণ) গণনা করার কোনও পদ্ধতি আছে কি?

বলুন, উদাহরণস্বরূপ, আমি ভবিষ্যতে 10 টি নমুনা (t + 1 থেকে t + 10) ভবিষ্যদ্বাণী করছি, গত 10 টি পর্যবেক্ষণ হওয়া নমুনার (টি -9 থেকে টি) এর উপর ভিত্তি করে, আমি টি + 1 এ ভবিষ্যদ্বাণীটি আরও বেশি হবে বলে আশা করব টি + 10 এ পূর্বাভাসের চেয়ে নির্ভুল। সাধারণত, বিরতি প্রদর্শনের জন্য কেউ ভবিষ্যদ্বাণীটির চারপাশে ত্রুটি বারগুলি আঁকতে পারে। একটি এআরআইএমএ মডেল (সাধারণত বিতরণ ত্রুটিগুলির অনুমানের অধীনে), আমি প্রতিটি পূর্বাভাসকৃত মানকে ঘিরে একটি পূর্বাভাস ব্যবধান (যেমন 95%) গণনা করতে পারি। আমি কি একটি এলএসটিএম মডেল থেকে একই (বা পূর্বাভাস ব্যবধানের সাথে সম্পর্কিত কিছু) গণনা করতে পারি?

আমি Keras / পাইথন মধ্যে LSTMs সঙ্গে কাজ করা হয়েছে করছি, থেকে উদাহরণ প্রচুর নিম্নলিখিত machinelearningmastery.com যেখান থেকে আমার উদাহরণস্বরূপ কোড (নীচে) উপর ভিত্তি করে তৈরি। আমি সমস্যাটিকে বিভাজন হিসাবে বিভাজন হিসাবে শ্রেণীবদ্ধ হিসাবে পুনর্বিবেচনা বিবেচনা করছি, কারণ এটি প্রতি শ্রেণীর প্রতি আস্থা তৈরি করে, তবে এটি একটি দুর্বল সমাধান বলে মনে হচ্ছে।

এখানে বেশ কয়েকটি অনুরূপ বিষয় রয়েছে (যেমন নীচের মতো) তবে কিছুই এলএসটিএম (বা প্রকৃতপক্ষে অন্যান্য) নিউরাল নেটওয়ার্কগুলি থেকে ভবিষ্যদ্বাণী ব্যবস্থার সমস্যাটিকে সরাসরি সম্বোধন করে বলে মনে হচ্ছে না:

/stats/25055/how-to-calculate-the-confidence-interval-for-time-series-prediction

এলআরএম বনাম এলএসটিএম ব্যবহার করে সময় সিরিজের পূর্বাভাস

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from math import sin
from matplotlib import pyplot
import numpy as np

# Build an LSTM network and train
def fit_lstm(X, y, batch_size, nb_epoch, neurons):
    X = X.reshape(X.shape[0], 1, X.shape[1]) # add in another dimension to the X data
    y = y.reshape(y.shape[0], y.shape[1])      # but don't add it to the y, as Dense has to be 1d?
    model = Sequential()
    model.add(LSTM(neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=True))
    model.add(Dense(y.shape[1]))
    model.compile(loss='mean_squared_error', optimizer='adam')
    for i in range(nb_epoch):
        model.fit(X, y, epochs=1, batch_size=batch_size, verbose=1, shuffle=False)
        model.reset_states()
    return model

# Configuration
n = 5000    # total size of dataset
SLIDING_WINDOW_LENGTH = 30
SLIDING_WINDOW_STEP_SIZE = 1
batch_size = 10
test_size = 0.1 # fraction of dataset to hold back for testing
nb_epochs = 100 # for training
neurons = 8 # LSTM layer complexity

# create dataset
#raw_values = [sin(i/2) for i in range(n)]  # simple sine wave
raw_values = [sin(i/2)+sin(i/6)+sin(i/36)+np.random.uniform(-1,1) for i in range(n)]  # double sine with noise
#raw_values = [(i%4) for i in range(n)] # saw tooth

all_data = np.array(raw_values).reshape(-1,1) # make into array, add anothe dimension for sci-kit compatibility

# data is segmented using a sliding window mechanism
all_data_windowed = [np.transpose(all_data[idx:idx+SLIDING_WINDOW_LENGTH]) for idx in np.arange(0,len(all_data)-SLIDING_WINDOW_LENGTH, SLIDING_WINDOW_STEP_SIZE)]
all_data_windowed = np.concatenate(all_data_windowed, axis=0).astype(np.float32)

# split data into train and test-sets
# round datasets down to a multiple of the batch size
test_length = int(round((len(all_data_windowed) * test_size) / batch_size) * batch_size)
train, test = all_data_windowed[:-test_length,:], all_data_windowed[-test_length:,:]
train_length = int(np.floor(train.shape[0] / batch_size)*batch_size) 
train = train[:train_length,...]

half_size = int(SLIDING_WINDOW_LENGTH/2) # split the examples half-half, to forecast the second half
X_train, y_train = train[:,:half_size], train[:,half_size:]
X_test, y_test = test[:,:half_size], test[:,half_size:]

# fit the model
lstm_model = fit_lstm(X_train, y_train, batch_size=batch_size, nb_epoch=nb_epochs, neurons=neurons)

# forecast the entire training dataset to build up state for forecasting
X_train_reshaped = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
lstm_model.predict(X_train_reshaped, batch_size=batch_size)

# predict from test dataset
X_test_reshaped = X_test.reshape(X_test.shape[0], 1, X_test.shape[1])
yhat = lstm_model.predict(X_test_reshaped, batch_size=batch_size)

#%% Plot prediction vs actual

x_axis_input = range(half_size)
x_axis_output = [x_axis_input[-1]] + list(half_size+np.array(range(half_size)))

fig = pyplot.figure()
ax = fig.add_subplot(111)
line1, = ax.plot(x_axis_input,np.zeros_like(x_axis_input), 'r-')
line2, = ax.plot(x_axis_output,np.zeros_like(x_axis_output), 'o-')
line3, = ax.plot(x_axis_output,np.zeros_like(x_axis_output), 'g-')
ax.set_xlim(np.min(x_axis_input),np.max(x_axis_output))
ax.set_ylim(-4,4)
pyplot.legend(('Input','Actual','Predicted'),loc='upper left')
pyplot.show()

# update plot in a loop
for idx in range(y_test.shape[0]):

    sample_input = X_test[idx]
    sample_truth = [sample_input[-1]] + list(y_test[idx]) # join lists
    sample_predicted = [sample_input[-1]] + list(yhat[idx])

    line1.set_ydata(sample_input)
    line2.set_ydata(sample_truth)
    line3.set_ydata(sample_predicted)
    fig.canvas.draw()
    fig.canvas.flush_events()

    pyplot.pause(.25)

উত্তর:


10

সরাসরি, এটি সম্ভব নয়। তবে, আপনি যদি এটি অন্যভাবে মডেল করেন তবে আপনি আত্মবিশ্বাসের ব্যবধানগুলি খুঁজে পেতে পারেন। অবিচ্ছিন্ন সম্ভাব্যতা বন্টনের অনুমান হিসাবে আপনি এটিকে সাধারণ প্রতিরোধের পরিবর্তে নিতে পারেন। প্রতি পদক্ষেপের জন্য এটি করে আপনি আপনার বিতরণ প্লট করতে পারেন। এটি করার উপায়গুলি হ'ল কার্নেল মিশ্রণ নেটওয়ার্ক ( https://janvdvegt.github.io/2017/06/07/ কার্নেল- মিশ্রণ- নেটওয়্যারস html , প্রকাশ, আমার ব্লগ) বা ঘনত্ব মিশ্রণ নেটওয়ার্কগুলি ( http: //www.cedar .buffalo.edu / ri srihari / CSE574 / Chap5 / Chap5.7-MixDensityNetworks.pdf ), প্রথমটি কর্নেলগুলি বেস হিসাবে ব্যবহার করে এবং এই কার্নেলগুলির উপর একটি মিশ্রণের অনুমান করে এবং দ্বিতীয়টি প্রতিটিটির প্যারামিটার সহ বিতরণের মিশ্রণটি অনুমান করে বিতরণ। আপনি মডেল প্রশিক্ষণের জন্য লগ সম্ভাবনা ব্যবহার।

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

আপনার ক্ষেত্রে আপনার টি + 2 থেকে টি + 10 পর্যন্ত কীভাবে উত্পন্ন হবে সে সম্পর্কে আপনাকে ভাবতে হবে। আপনার বর্তমান সেটআপের উপর নির্ভর করে আপনাকে আগের সময়ের ধাপ থেকে নমুনা নিতে হবে এবং পরেরটির জন্য এটি ফিড করতে হবে। এটি প্রথম পদ্ধতির সাথে বা দ্বিতীয়টির সাথে খুব ভাল কাজ করে না। আপনার যদি সময় প্রতি পদে 10 টি আউটপুট থাকে (t + 1 থেকে t + 10 পর্যন্ত) তবে এই সমস্ত পন্থাগুলি আরও পরিষ্কার তবে কিছুটা স্বজ্ঞাত।


2
মিশ্রণ নেটওয়ার্ক ব্যবহার আকর্ষণীয়, আমি এটি বাস্তবায়নের চেষ্টা করব।
ড্রপআউটটি

ড্রপআউটের জন্য একটি নোট, আপনি প্রকৃতপক্ষে মন্টি কার্লো ড্রপআউটের পূর্বাভাসের বৈচিত্রটি গণনা করতে পারেন এবং এটি অনিশ্চয়তার পরিমান হিসাবে ব্যবহার করতে পারেন
চার্লস চৌ

এটি সত্য @ চারেলসচো তবে এই প্রসঙ্গে একটি আস্থা অন্তর তৈরির এটি একটি দুর্বল উপায়। সম্ভাব্য খুব স্কিউড বিতরণের কারণে মানগুলি বাছাই করা এবং কোয়ান্টাইলগুলি ব্যবহার করা ভাল।
জান ভ্যান ডের Vegt

@ জানভান্ডারভেগ্টের সাথে সম্মত হন, তবে আপনি এখনও আউটপুট বিতরণ না করে এমসির ছাড়ার পরিসংখ্যানটি অনুমান করতে পারেন, আমার অর্থ আপনি এমসির ড্রপআউটের সিআই নির্মাণের জন্য পারসেন্টাইল বা বুটস্ট্র্যাপিংও ব্যবহার করতে পারেন
চার্লস চৌ চৌ

2

বাজ শব্দ হিসাবে কনফর্মাল প্রেডিকশন আপনার জন্য আকর্ষণীয় হতে পারে কারণ এটি অনেক শর্তে কাজ করে - বিশেষত এটির জন্য সাধারণ বিতরণ ত্রুটির প্রয়োজন হয় না এবং এটি প্রায় কোনও মেশিন লার্নিং মডেলের জন্য কাজ করে।

স্কট লকলিন এবং হেনরিক লিনসন দুটি সুন্দর পরিচয় দিয়েছেন ।


1

আমি কিছুটা ডাইভার্জ করতে যাচ্ছি এবং যুক্তি দিতে পারি যে গণনা আত্মবিশ্বাসের ব্যবধানটি অনুশীলনে সাধারণত করা কোনও মূল্যবান জিনিস নয়। কারণটি হ'ল সর্বদা আপনার মনে করা অনুমানের পুরো গুচ্ছ থাকে। এমনকি সহজ লিনিয়ার রিগ্রেশন জন্যও আপনার দরকার need

  • লিনিয়ার সম্পর্ক।
  • নমনীয়তা স্বাভাবিক করুন।
  • না বা সামান্য বহুবিধ লাইন।
  • কোনও স্বয়ংক্রিয় সম্পর্ক নেই।
  • Homoscedasticity।

মন্টে কার্লো সিমুলেশনটি করা আরও অনেক বেশি ব্যবহারিক পদ্ধতির। আপনি যদি ইতিমধ্যে আপনার ইনপুট ভেরিয়েবলগুলির বিতরণ সম্পর্কে ধারণা বা ধারণা তৈরি করতে ইচ্ছুক থাকেন তবে পুরো গোছা নমুনা নিন এবং এটি আপনাকে এলএসটিএম খাওয়ান, এখন আপনি অভিজ্ঞতার সাথে আপনার "আত্মবিশ্বাসের ব্যবধান" গণনা করতে পারেন।


1

হ্যা, তুমি পারো. আপনার কেবলমাত্র ক্ষতি পরিবর্তন করতে হবে। কোয়ান্টাইল রিগ্রেশন ব্যবহৃত লস ফাংশন বাস্তবায়ন এবং এটি সংহত। এছাড়াও, আপনি কীভাবে এই অন্তরগুলি মূল্যায়ন করেন তা একবার দেখে নিতে চান। তার জন্য, আমি আইসিপি, মিল এবং আরএমআইএল মেট্রিক ব্যবহার করব।

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